2 * Author......: Jens Steube <jens.steube@gmail.com>
13 #define MIN_FUNCTIONS 1
14 #define MAX_FUNCTIONS 5
18 #include "cpu_rules.h"
22 char rule_buf
[BLOCK_SIZE
];
27 static int cmp (const void *p1
, const void *p2
)
29 rule_t
*r1
= (rule_t
*) p1
;
30 rule_t
*r2
= (rule_t
*) p2
;
32 return r1
->rule_len
- r2
->rule_len
;
35 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
])
39 for (int i
= 1; i
< block_cnt
; i
++)
41 if (o
[i
] < last_o
) return (0);
44 memset (rule_buf
, 0, BLOCK_SIZE
);
46 strcat (rule_buf
, block_ptr
[o
[0]]);
50 for (i
= 1; i
< block_cnt
; i
++)
52 strcat (rule_buf
, " ");
54 strcat (rule_buf
, block_ptr
[o
[i
]]);
57 char out_buf
[BLOCK_SIZE
];
59 memset (out_buf
, 0, sizeof (out_buf
));
61 int out_len
= apply_rule_cpu (rule_buf
, strlen (rule_buf
), word_buf
, strlen (word_buf
), out_buf
);
63 if (out_len
== final_len
)
65 if (memcmp (final_buf
, out_buf
, out_len
) == 0) return (1);
71 int next_permutation (int *o
, int *p
, int k
)
83 for (k
= 1; p
[k
] == 0; k
++) p
[k
] = k
;
92 char line_buf
[BUFSIZ
];
100 char *line_ptr
= fgets (line_buf
, BUFSIZ
, fp
);
102 if (line_ptr
== NULL
) continue;
104 int line_len
= strlen (line_ptr
);
106 if (line_len
&& line_ptr
[line_len
- 1] == '\n') line_len
--;
107 if (line_len
&& line_ptr
[line_len
- 1] == '\r') line_len
--;
109 line_ptr
[line_len
] = 0;
115 char *word_buf
= line_ptr
;
117 char *sep
= strchr (line_ptr
, ':');
119 if (sep
== NULL
) continue;
123 int word_len
= sep
- word_buf
;
125 if (strstr (word_buf
, "$HEX[")) continue; // not yet supported
127 char *rule_buf
= sep
+ 1;
129 if (strchr (rule_buf
, ':')) continue; // another one? ignore line
135 char final_buf
[BLOCK_SIZE
];
137 memset (final_buf
, 0, sizeof (final_buf
));
139 int final_len
= apply_rule_cpu (rule_buf
, strlen (rule_buf
), word_buf
, strlen (word_buf
), final_buf
);
141 if (final_len
< 0) continue;
143 if ((final_len
== word_len
) && (memcmp (word_buf
, final_buf
, final_len
)) == 0) continue;
149 char *block_ptr
[BLOCK_SIZE
];
152 char *ptr
= rule_buf
;
154 for (char *next
= NULL
; (next
= strchr (ptr
, ' ')) != NULL
; ptr
= next
+ 1)
156 if (next
[1] == ' ') next
++;
160 block_ptr
[block_cnt
] = ptr
;
165 block_ptr
[block_cnt
] = ptr
;
169 if (block_cnt
< MIN_FUNCTIONS
) continue; // to many
170 if (block_cnt
> MAX_FUNCTIONS
) continue; // to many
173 * permute blocks, this where the real work starts..
179 for (int i
= 0; i
< block_cnt
+ 1; i
++)
187 rule_t
*rules_buf
= (rule_t
*) calloc (120 * MAX_FUNCTIONS
, sizeof (rule_t
)); // 5! = 120, so its guaranteed
190 char rule_out_buf
[BLOCK_SIZE
];
192 for (int i0
= 0, i1
= 1; i0
< block_cnt
; i0
++, i1
++)
194 if (process_block (o
, block_ptr
, i1
, word_buf
, final_buf
, final_len
, rule_out_buf
) == 1)
196 memcpy (rules_buf
[rules_cnt
].rule_buf
, rule_out_buf
, BLOCK_SIZE
);
198 rules_buf
[rules_cnt
].rule_len
= i1
;
206 while ((k
= next_permutation (o
, p
, k
)) != block_cnt
)
208 for (int i0
= 0, i1
= 1; i0
< block_cnt
; i0
++, i1
++)
210 if (process_block (o
, block_ptr
, i1
, word_buf
, final_buf
, final_len
, rule_out_buf
) == 1)
212 memcpy (rules_buf
[rules_cnt
].rule_buf
, rule_out_buf
, BLOCK_SIZE
);
214 rules_buf
[rules_cnt
].rule_len
= i1
;
221 for (int i0
= 0, i1
= 1; i0
< block_cnt
; i0
++, i1
++)
223 if (process_block (o
, block_ptr
, i1
, word_buf
, final_buf
, final_len
, rule_out_buf
) == 1)
225 memcpy (rules_buf
[rules_cnt
].rule_buf
, rule_out_buf
, BLOCK_SIZE
);
227 rules_buf
[rules_cnt
].rule_len
= i1
;
235 * sort and output the ones with the less length
238 qsort (rules_buf
, rules_cnt
, sizeof (rule_t
), cmp
);
240 int first_len
= rules_buf
[0].rule_len
;
242 for (int i
= 0; i
< rules_cnt
; i
++)
244 rule_t
*rule_buf
= &rules_buf
[i
];
246 if (rule_buf
->rule_len
> first_len
) break;
248 puts (rule_buf
->rule_buf
);