From 2be8f5f982debe8d11e288f94dc70d0dada6a3dc Mon Sep 17 00:00:00 2001 From: jsteube Date: Sat, 2 Jan 2016 17:42:47 +0100 Subject: [PATCH] - Added Makefile target for native compilation - Moved rules_optimize tool to hashcat-utils --- docs/changes.txt | 8 + src/Makefile | 93 +++++----- tools/clcompile/clcompile.c | 254 ------------------------- tools/package_bin.sh | 2 - tools/rules_optimize/Makefile | 22 --- tools/rules_optimize/rules_optimize.c | 255 -------------------------- 6 files changed, 49 insertions(+), 585 deletions(-) delete mode 100644 tools/clcompile/clcompile.c delete mode 100644 tools/rules_optimize/Makefile delete mode 100644 tools/rules_optimize/rules_optimize.c diff --git a/docs/changes.txt b/docs/changes.txt index 7c79538f9..db3242e81 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -10,10 +10,18 @@ File.: Host Desc.: Implemented a new feature that allows to quit at next restore point update (and disable it) Issue: 10 +Type.: Feature +File.: Host +Desc.: Added a Makefile target for native compilation + Type.: Feature File.: Host Desc.: Added option --gpu-platform to select a single OpenCL platform in case multiple OpenCL platforms are present +Type.: Feature +File.: Host +Desc.: Moved rules_optimize to hashcat-utils + Type.: Bug File.: Host Desc.: Fixed a bug in combination of --restore and a user immediately aborting the session after restart diff --git a/src/Makefile b/src/Makefile index f726f501f..7a76c9342 100644 --- a/src/Makefile +++ b/src/Makefile @@ -54,11 +54,16 @@ OCLLIBPATH64 := $(AMDAPPLIBPATH64) NVML := $(GDK)/usr/include/nvidia/gdk -CLCOMPILE_PATH := tools/clcompile -RULES_OPTIMIZE_PATH := tools/rules_optimize +## +## Native compiler paths +## + +INSTALL := install +CP := cp +CC_NATIVE := gcc ## -## Compiler paths +## Cross compiler paths ## CC_LINUX_32 := gcc @@ -70,13 +75,6 @@ CC_WIN_64 := x86_64-w64-mingw32-gcc DLL_WIN_32 := i686-w64-mingw32-dlltool DLL_WIN_64 := x86_64-w64-mingw32-dlltool -CLCOMPILE := $(CLCOMPILE_PATH)/clcompile.bin - -BIN := . - -INSTALL := install -CP := cp - ## ## Misc stuff ## @@ -102,38 +100,21 @@ CFLAGS_WIN += -I$(OCL)/include/ -I$(ADL)/include/ -I$(NVAPI)/ LFLAGS_LINUX := -lpthread -lOpenCL -ldl LFLAGS_WIN := -lpsapi +CFLAGS_NATIVE := $(CFLAGS_LINUX) +LFLAGS_NATIVE := $(LFLAGS_LINUX) + ## ## Targets: Global ## -all: binaries_all - -binaries_all: linux32 linux64 win32 win64 rules_optimize - -release: binaries +native: oclHashcat -linux: linux32 linux64 rules_optimize +binaries: linux32 linux64 win32 win64 -windows: win32 win64 rules_optimize - -clean: clean_bin - -clean_all: clean_bin clean_clcompile - -clean_bin: - rm -f obj/*.o lib/*.a $(BIN)/*.bin $(BIN)/*.exe $(BIN)/*.app *.restore *.out *.pot *.dictstat *.log - rm -rf *Hashcat.induct - rm -rf *Hashcat.outfiles - $(MAKE) -C $(RULES_OPTIMIZE_PATH) clean - -clean_clcompile: - rm -f ${CLCOMPILE_PATH}/clcompile.bin - -${CLCOMPILE}: ${CLCOMPILE_PATH}/clcompile.c - $(CC_LINUX_64) $(CFLAGS) -o $@ -I$(CFLAGS_LINUX) $< -L$(OCLLIBPATH64) $(LFLAGS_LINUX) - -rules_optimize: - $(MAKE) -C $(RULES_OPTIMIZE_PATH) +clean: + rm -f obj/*.o lib/*.a ./*.bin ./*.exe ./*.app *.restore *.out *.pot *.dictstat *.log oclHashcat + rm -rf *.induct + rm -rf *.outfiles linux32: oclHashcat32.bin linux64: oclHashcat64.bin @@ -143,11 +124,10 @@ win64: oclHashcat64.exe ## ## Targets: Linux install -## We need some better native compilation logic here, fixing it to 64 bit for now and AMD kernels ## How to make /usr/bin/install doing recursive?? ## -install: linux64 amd_all +install: native $(INSTALL) -m 755 -d $(DOCUMENT_FOLDER) $(CP) -a docs/* $(DOCUMENT_FOLDER)/ $(INSTALL) -m 755 -d $(DOCUMENT_FOLDER)/extra @@ -162,7 +142,6 @@ install: linux64 amd_all $(INSTALL) -m 755 -T hashcat.hcstat $(SHARED_FOLDER)/hashcat.hcstat $(INSTALL) -m 755 -s -T oclHashcat64.bin $(INSTALL_FOLDER)/oclHashcat - uninstall: $(RM) -f $(INSTALL_FOLDER)/oclHashcat $(RM) -rf $(SHARED_FOLDER) @@ -179,29 +158,39 @@ lib/libOpenCL64.a: ${DLL_WIN_64} -A -k -l lib/libOpenCL64.a -d lib/OpenCL64.def ## -## oclHashcat +## native compiled oclHashcat +## + +obj/%.oclHashcat.NATIVE.o: src/%.c + $(CC_NATIVE) $(CFLAGS) $(CFLAGS_NATIVE) -c -o $@ $< + +oclHashcat: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.NATIVE.o obj/ext_nvml.oclHashcat.NATIVE.o obj/ext_ADL.oclHashcat.NATIVE.o obj/shared.oclHashcat.NATIVE.o obj/rp_gpu_on_cpu.oclHashcat.NATIVE.o + $(CC_NATIVE) $(CFLAGS) $(CFLAGS_NATIVE) -o $@ $^ $(LFLAGS_NATIVE) -DCOMPTIME=$(NOW) -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" + +## +## cross compiled oclHashcat for release ## -obj/%.oclHashcat.LINUX.32.o: src/%.c +obj/%.oclHashcat.LINUX.32.o: src/%.c $(CC_LINUX_32) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_32) -c -o $@ $< -obj/%.oclHashcat.LINUX.64.o: src/%.c +obj/%.oclHashcat.LINUX.64.o: src/%.c $(CC_LINUX_64) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_64) -c -o $@ $< -obj/%.oclHashcat.WIN.32.o: src/%.c +obj/%.oclHashcat.WIN.32.o: src/%.c $(CC_WIN_32) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_32) -c -o $@ $< -obj/%.oclHashcat.WIN.64.o: src/%.c +obj/%.oclHashcat.WIN.64.o: src/%.c $(CC_WIN_64) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_64) -c -o $@ $< -oclHashcat32.bin: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.LINUX.32.o obj/ext_nvml.oclHashcat.LINUX.32.o obj/ext_ADL.oclHashcat.LINUX.32.o obj/shared.oclHashcat.LINUX.32.o obj/rp_gpu_on_cpu.oclHashcat.LINUX.32.o - $(CC_LINUX_32) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_32) -o $@ -DCOMPTIME=$(NOW) $^ -L$(OCLLIBPATH32) $(LFLAGS_LINUX) -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" +oclHashcat32.bin: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.LINUX.32.o obj/ext_nvml.oclHashcat.LINUX.32.o obj/ext_ADL.oclHashcat.LINUX.32.o obj/shared.oclHashcat.LINUX.32.o obj/rp_gpu_on_cpu.oclHashcat.LINUX.32.o + $(CC_LINUX_32) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_32) -o $@ $^ -L$(OCLLIBPATH32) $(LFLAGS_LINUX) -DCOMPTIME=$(NOW) -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" -oclHashcat64.bin: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.LINUX.64.o obj/ext_nvml.oclHashcat.LINUX.64.o obj/ext_ADL.oclHashcat.LINUX.64.o obj/shared.oclHashcat.LINUX.64.o obj/rp_gpu_on_cpu.oclHashcat.LINUX.64.o - $(CC_LINUX_64) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_64) -o $@ -DCOMPTIME=$(NOW) $^ -L$(OCLLIBPATH64) $(LFLAGS_LINUX) -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" +oclHashcat64.bin: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.LINUX.64.o obj/ext_nvml.oclHashcat.LINUX.64.o obj/ext_ADL.oclHashcat.LINUX.64.o obj/shared.oclHashcat.LINUX.64.o obj/rp_gpu_on_cpu.oclHashcat.LINUX.64.o + $(CC_LINUX_64) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_64) -o $@ $^ -L$(OCLLIBPATH64) $(LFLAGS_LINUX) -DCOMPTIME=$(NOW) -DINSTALL_FOLDER=\"$(INSTALL_FOLDER)\" -DSHARED_FOLDER=\"$(SHARED_FOLDER)\" -DDOCUMENT_FOLDER=\"$(DOCUMENT_FOLDER)\" -oclHashcat32.exe: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.WIN.32.o obj/ext_nvapi.oclHashcat.WIN.32.o obj/ext_ADL.oclHashcat.WIN.32.o obj/shared.oclHashcat.WIN.32.o obj/rp_gpu_on_cpu.oclHashcat.WIN.32.o lib/libOpenCL.a /usr/i686-w64-mingw32/lib/CRT_glob.o $(NVAPI)/x86/nvapi.lib - $(CC_WIN_32) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_32) -o $@ -DCOMPTIME=$(NOW) $^ -L$(OCLLIBPATH32) $(LFLAGS_WIN) -static-libgcc +oclHashcat32.exe: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.WIN.32.o obj/ext_nvapi.oclHashcat.WIN.32.o obj/ext_ADL.oclHashcat.WIN.32.o obj/shared.oclHashcat.WIN.32.o obj/rp_gpu_on_cpu.oclHashcat.WIN.32.o lib/libOpenCL.a /usr/i686-w64-mingw32/lib/CRT_glob.o $(NVAPI)/x86/nvapi.lib + $(CC_WIN_32) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_32) -o $@ $^ -L$(OCLLIBPATH32) $(LFLAGS_WIN) -DCOMPTIME=$(NOW) -static-libgcc -oclHashcat64.exe: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.WIN.64.o obj/ext_nvapi.oclHashcat.WIN.64.o obj/ext_ADL.oclHashcat.WIN.64.o obj/shared.oclHashcat.WIN.64.o obj/rp_gpu_on_cpu.oclHashcat.WIN.64.o lib/libOpenCL64.a /usr/x86_64-w64-mingw32/lib/CRT_glob.o $(NVAPI)/amd64/nvapi64.lib - $(CC_WIN_64) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_64) -o $@ -DCOMPTIME=$(NOW) $^ -L$(OCLLIBPATH64) $(LFLAGS_WIN) -static-libgcc +oclHashcat64.exe: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.WIN.64.o obj/ext_nvapi.oclHashcat.WIN.64.o obj/ext_ADL.oclHashcat.WIN.64.o obj/shared.oclHashcat.WIN.64.o obj/rp_gpu_on_cpu.oclHashcat.WIN.64.o lib/libOpenCL64.a /usr/x86_64-w64-mingw32/lib/CRT_glob.o $(NVAPI)/amd64/nvapi64.lib + $(CC_WIN_64) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_64) -o $@ $^ -L$(OCLLIBPATH64) $(LFLAGS_WIN) -DCOMPTIME=$(NOW) -static-libgcc diff --git a/tools/clcompile/clcompile.c b/tools/clcompile/clcompile.c deleted file mode 100644 index d6e29aaff..000000000 --- a/tools/clcompile/clcompile.c +++ /dev/null @@ -1,254 +0,0 @@ -/** - * Author......: Jens Steube - * License.....: MIT - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define CL_PLATFORMS_MAX 128 -#define CL_DEVICES_MAX 128 - -//char options[] = "–x spir -spir-std=1.2 -I."; -char options[] = "-I. -x clc++ -cl-std=CL1.2"; - -static void checkErr (char *func, cl_int err) -{ - if (err != CL_SUCCESS) - { - fprintf (stderr, "%s(): ", func); - - switch (err) - { - case CL_BUILD_PROGRAM_FAILURE : - fprintf (stderr, "CL_BUILD_PROGRAM_FAILURE"); - break; - - case CL_COMPILER_NOT_AVAILABLE : - fprintf (stderr, "CL_COMPILER_NOT_AVAILABLE"); - break; - - case CL_DEVICE_NOT_AVAILABLE : - fprintf (stderr, "CL_DEVICE_NOT_AVAILABLE"); - break; - - case CL_DEVICE_NOT_FOUND : - fprintf (stderr, "CL_DEVICE_NOT_FOUND"); - break; - - case CL_INVALID_BINARY : - fprintf (stderr, "CL_INVALID_BINARY"); - break; - - case CL_INVALID_BUILD_OPTIONS : - fprintf (stderr, "CL_INVALID_BUILD_OPTIONS"); - break; - - case CL_INVALID_CONTEXT : - fprintf (stderr, "CL_INVALID_CONTEXT"); - break; - - case CL_INVALID_DEVICE : - fprintf (stderr, "CL_INVALID_DEVICE"); - break; - - case CL_INVALID_DEVICE_TYPE : - fprintf (stderr, "CL_INVALID_DEVICE_TYPE"); - break; - - case CL_INVALID_OPERATION : - fprintf (stderr, "CL_INVALID_OPERATION"); - break; - - case CL_INVALID_PLATFORM : - fprintf (stderr, "CL_INVALID_PLATFORM"); - break; - - case CL_INVALID_PROGRAM : - fprintf (stderr, "CL_INVALID_PROGRAM"); - break; - - case CL_INVALID_VALUE : - fprintf (stderr, "CL_INVALID_VALUE"); - break; - - case CL_OUT_OF_HOST_MEMORY : - fprintf (stderr, "CL_OUT_OF_HOST_MEMORY"); - break; - - default : - fprintf (stderr, "Unknown error code: %d", err); - break; - } - - fprintf (stderr, "\n"); - - exit (err); - } -} - -static char *load_kernel (const char *kernel_file) -{ - FILE *fp = NULL; - - if ((fp = fopen (kernel_file, "rb")) != NULL) - { - struct stat st; - - if (stat (kernel_file, &st) == -1) - { - fprintf (stderr, "! stat() failed (%d) : %s\n", errno, strerror (errno)); - } - - char *buf = (char *) malloc (st.st_size + 1); - - memset (buf, 0, st.st_size + 1); - - size_t num_read = fread (buf, sizeof (char), st.st_size, fp); - - if (num_read != (size_t) st.st_size) - { - fprintf (stderr, "! fread() [%s] failed (%d) : %s", kernel_file, errno, strerror (errno)); - fclose (fp); - exit (-1); - } - - fclose (fp); - - return buf; - } - else - { - fprintf (stderr, "! fopen() [%s] failed (%d) : %s", kernel_file, errno, strerror (errno)); - exit (-1); - } - - return NULL; -} - -static int writeProgramBins (char *dst, unsigned char *binary, size_t binary_size) -{ - FILE *fp = fopen (dst, "wb"); - - if (!fp) - { - fprintf(stderr, "! fopen() [%s] failed (%d) : %s\n", dst, errno, strerror (errno)); - return -1; - } - - if (fwrite (binary, sizeof (unsigned char), binary_size, fp) != binary_size) - { - fprintf(stderr, "! fwrite() [%s] failed (%d) : %s\n", dst, errno, strerror (errno)); - fclose (fp); - return -1; - } - - fclose (fp); - - return 0; -} - -int main (int argc, char *argv[]) -{ - if (argc != 4) - { - fprintf (stderr, "> Usage: %s ccopts src dst\n", argv[0]); - - return (-1); - } - - char *ccopts = argv[1]; - char *src = argv[2]; - char *dst = argv[3]; - - char *programSrc = load_kernel (src); - - if (programSrc == NULL) - { - fprintf (stderr, "Unable to open %s. Exiting.\n", src); - - return (-1); - } - - cl_device_id devices[1]; - cl_uint nDevices; - - cl_platform_id platform; - cl_uint platforms; - - cl_int err; - - err = clGetPlatformIDs(1, &platform, &platforms); - - checkErr ((char *) "clGetPlatformIDs", err); - - err = clGetDeviceIDs (platform, CL_DEVICE_TYPE_GPU, 1, devices, &nDevices); - - checkErr ((char *) "clGetDeviceIDs", err); - - cl_context context = clCreateContext (NULL, 1, devices, NULL, NULL, &err); - - checkErr ((char *) "clCreateContext", err); - - cl_program program = clCreateProgramWithSource (context, 1, (const char **) &programSrc, NULL, &err); - - checkErr ((char *) "clCreateProgramWithSource", err); - - size_t opt_len = strlen (ccopts) + 1 + strlen (options) + 1; - - char *options2 = (char *) malloc (opt_len + 1); - - memset (options2, 0, opt_len + 1); - - snprintf (options2, opt_len, "%s %s", options, ccopts); - - err = clCompileProgram (program, 1, devices, options2, 0, NULL, NULL, NULL, NULL); - - //checkErr ((char *) "clCompileProgram", err); - - size_t ret_val_size = 0; - - err = clGetProgramBuildInfo (program, devices[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size); - - checkErr ((char *) "clGetProgramBuildInfo", err); - - if (ret_val_size > 1) - { - char *build_log = (char *) malloc (ret_val_size + 1); - - memset (build_log, 0, ret_val_size + 1); - - err = clGetProgramBuildInfo (program, devices[0], CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL); - - checkErr ((char *) "clGetProgramBuildInfo", err); - - puts (build_log); - } - - size_t binary_size; - - err = clGetProgramInfo (program, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL); - - checkErr ((char *) "clGetProgramInfo", err); - - unsigned char *binary = (unsigned char *) malloc (binary_size); - - memset(binary, 0, binary_size); - - err = clGetProgramInfo (program, CL_PROGRAM_BINARIES, sizeof (binary), &binary, NULL); - - checkErr ((char *) "clGetProgramInfo", err); - - err = writeProgramBins (dst, binary, binary_size); - - checkErr ((char *) "writeProgramBins", err); - - return 0; -} diff --git a/tools/package_bin.sh b/tools/package_bin.sh index 8c330ee68..2e4b0d37b 100755 --- a/tools/package_bin.sh +++ b/tools/package_bin.sh @@ -58,8 +58,6 @@ chmod 700 $OUT/example*.sh chmod 700 $OUT/extra chmod 700 $OUT/extra/tab_completion/*.sh chmod 700 $OUT/extra/tab_completion/install -chmod 600 $OUT/extra/rules_optimize/*.exe -chmod 700 $OUT/extra/rules_optimize/*.bin chmod 700 $OUT/include chmod 600 $OUT/include/* chmod 700 $OUT/OpenCL diff --git a/tools/rules_optimize/Makefile b/tools/rules_optimize/Makefile deleted file mode 100644 index 5aea8326e..000000000 --- a/tools/rules_optimize/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -## -## Author......: Jens Steube -## License.....: MIT -## - -GCC ?= /usr/bin/x86_64-linux-gnu-gcc -MINGW ?= i686-w64-mingw32-gcc -ROOT := ../.. -CFLAGS := -O2 -s -std=c99 -pipe -W -Wall -I$(ROOT)/include/ -I../rules_test/ -SRC := ./rules_optimize.c -TARGET := $(ROOT)/extra/rules_optimize/rules_optimize - -all: ${TARGET}.bin ${TARGET}.exe - -${TARGET}.bin: $(SRC) - ${GCC} ${CFLAGS} ../rules_test/cpu_rules.c $< -o ${TARGET}.bin - -${TARGET}.exe: $(SRC) - ${MINGW} ${CFLAGS} ../rules_test/cpu_rules.c $< -o ${TARGET}.exe - -clean: - rm -f $(TARGET)*.bin $(TARGET)*.exe diff --git a/tools/rules_optimize/rules_optimize.c b/tools/rules_optimize/rules_optimize.c deleted file mode 100644 index 160d9b426..000000000 --- a/tools/rules_optimize/rules_optimize.c +++ /dev/null @@ -1,255 +0,0 @@ -/** - * Author......: Jens Steube - * License.....: MIT - */ - -#include -#include -#include -#include -#include -#include - -#define MIN_FUNCTIONS 1 -#define MAX_FUNCTIONS 5 - -int max_len = 0; - -#include "cpu_rules.h" - -typedef struct -{ - char rule_buf[BLOCK_SIZE]; - int rule_len; - -} rule_t; - -static int cmp (const void *p1, const void *p2) -{ - rule_t *r1 = (rule_t *) p1; - rule_t *r2 = (rule_t *) p2; - - return r1->rule_len - r2->rule_len; -} - -int process_block (int o[BLOCK_SIZE], char *block_ptr[BLOCK_SIZE], int block_cnt, char *word_buf, char final_buf[BLOCK_SIZE], int final_len, char rule_buf[BLOCK_SIZE]) -{ - int last_o = o[0]; - - for (int i = 1; i < block_cnt; i++) - { - if (o[i] < last_o) return (0); - } - - memset (rule_buf, 0, BLOCK_SIZE); - - strcat (rule_buf, block_ptr[o[0]]); - - int i; - - for (i = 1; i < block_cnt; i++) - { - strcat (rule_buf, " "); - - strcat (rule_buf, block_ptr[o[i]]); - } - - char out_buf[BLOCK_SIZE]; - - memset (out_buf, 0, sizeof (out_buf)); - - int out_len = apply_rule_cpu (rule_buf, strlen (rule_buf), word_buf, strlen (word_buf), out_buf); - - if (out_len == final_len) - { - if (memcmp (final_buf, out_buf, out_len) == 0) return (1); - } - - return 0; -} - -int next_permutation (int *o, int *p, int k) -{ - p[k]--; - - int j = k % 2 * p[k]; - - int tmp = o[j]; - - o[j] = o[k]; - - o[k] = tmp; - - for (k = 1; p[k] == 0; k++) p[k] = k; - - return k; -} - -int main () -{ - FILE *fp = stdin; - - char line_buf[BUFSIZ]; - - while (!feof (fp)) - { - /* - * line - */ - - char *line_ptr = fgets (line_buf, BUFSIZ, fp); - - if (line_ptr == NULL) continue; - - int line_len = strlen (line_ptr); - - if (line_len && line_ptr[line_len - 1] == '\n') line_len--; - if (line_len && line_ptr[line_len - 1] == '\r') line_len--; - - line_ptr[line_len] = 0; - - /* - * split - */ - - char *word_buf = line_ptr; - - char *sep = strchr (line_ptr, ':'); - - if (sep == NULL) continue; - - *sep = 0; - - int word_len = sep - word_buf; - - if (strstr (word_buf, "$HEX[")) continue; // not yet supported - - char *rule_buf = sep + 1; - - if (strchr (rule_buf, ':')) continue; // another one? ignore line - - /* - * final - */ - - char final_buf[BLOCK_SIZE]; - - memset (final_buf, 0, sizeof (final_buf)); - - int final_len = apply_rule_cpu (rule_buf, strlen (rule_buf), word_buf, strlen (word_buf), final_buf); - - if (final_len < 0) continue; - - if ((final_len == word_len) && (memcmp (word_buf, final_buf, final_len)) == 0) continue; - - /* - * split into blocks - */ - - char *block_ptr[BLOCK_SIZE]; - int block_cnt = 0; - - char *ptr = rule_buf; - - for (char *next = NULL; (next = strchr (ptr, ' ')) != NULL; ptr = next + 1) - { - if (next[1] == ' ') next++; - - *next = 0; - - block_ptr[block_cnt] = ptr; - - block_cnt++; - } - - block_ptr[block_cnt] = ptr; - - block_cnt++; - - if (block_cnt < MIN_FUNCTIONS) continue; // to many - if (block_cnt > MAX_FUNCTIONS) continue; // to many - - /* - * permute blocks, this where the real work starts.. - */ - - int o[BLOCK_SIZE]; - int p[BLOCK_SIZE]; - - for (int i = 0; i < block_cnt + 1; i++) - { - o[i] = i; - p[i] = i; - } - - int k = 1; - - rule_t *rules_buf = (rule_t *) calloc (120 * MAX_FUNCTIONS, sizeof (rule_t)); // 5! = 120, so its guaranteed - int rules_cnt = 0; - - char rule_out_buf[BLOCK_SIZE]; - - for (int i0 = 0, i1 = 1; i0 < block_cnt; i0++, i1++) - { - if (process_block (o, block_ptr, i1, word_buf, final_buf, final_len, rule_out_buf) == 1) - { - memcpy (rules_buf[rules_cnt].rule_buf, rule_out_buf, BLOCK_SIZE); - - rules_buf[rules_cnt].rule_len = i1; - - rules_cnt++; - } - } - - if (block_cnt >= 2) - { - while ((k = next_permutation (o, p, k)) != block_cnt) - { - for (int i0 = 0, i1 = 1; i0 < block_cnt; i0++, i1++) - { - if (process_block (o, block_ptr, i1, word_buf, final_buf, final_len, rule_out_buf) == 1) - { - memcpy (rules_buf[rules_cnt].rule_buf, rule_out_buf, BLOCK_SIZE); - - rules_buf[rules_cnt].rule_len = i1; - - rules_cnt++; - } - } - } - - for (int i0 = 0, i1 = 1; i0 < block_cnt; i0++, i1++) - { - if (process_block (o, block_ptr, i1, word_buf, final_buf, final_len, rule_out_buf) == 1) - { - memcpy (rules_buf[rules_cnt].rule_buf, rule_out_buf, BLOCK_SIZE); - - rules_buf[rules_cnt].rule_len = i1; - - rules_cnt++; - } - } - } - - /** - * sort and output the ones with the less length - */ - - qsort (rules_buf, rules_cnt, sizeof (rule_t), cmp); - - int first_len = rules_buf[0].rule_len; - - for (int i = 0; i < rules_cnt; i++) - { - rule_t *rule_buf = &rules_buf[i]; - - if (rule_buf->rule_len > first_len) break; - - puts (rule_buf->rule_buf); - } - - free (rules_buf); - } - - return 0; -}