| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922 |
- /**
- * Author......: Jens Steube <jens.steube@gmail.com>
- * License.....: MIT
- */
- #include "common.h"
- #include "rp.h"
- #define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR)
- #define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR)
- #define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20
- #define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20
- #define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20
- /* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */
- /* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */
- #define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; }
- bool class_num (char c)
- {
- return ((c >= '0') && (c <= '9'));
- }
- bool class_lower (char c)
- {
- return ((c >= 'a') && (c <= 'z'));
- }
- bool class_upper (char c)
- {
- return ((c >= 'A') && (c <= 'Z'));
- }
- bool class_alpha (char c)
- {
- return (class_lower (c) || class_upper (c));
- }
- char conv_ctoi (char c)
- {
- if (class_num (c))
- {
- return c - '0';
- }
- else if (class_upper (c))
- {
- return c - 'A' + (char) 10;
- }
- return (char) (-1);
- }
- int mangle_lrest (char arr[BLOCK_SIZE], int arr_len)
- {
- int pos;
- for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos);
- return (arr_len);
- }
- int mangle_urest (char arr[BLOCK_SIZE], int arr_len)
- {
- int pos;
- for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos);
- return (arr_len);
- }
- int mangle_trest (char arr[BLOCK_SIZE], int arr_len)
- {
- int pos;
- for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos);
- return (arr_len);
- }
- int mangle_reverse (char arr[BLOCK_SIZE], int arr_len)
- {
- int l;
- int r;
- for (l = 0; l < arr_len; l++)
- {
- r = arr_len - 1 - l;
- if (l >= r) break;
- MANGLE_SWITCH (arr, l, r);
- }
- return (arr_len);
- }
- int mangle_double (char arr[BLOCK_SIZE], int arr_len)
- {
- if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
- memcpy (&arr[arr_len], arr, (size_t) arr_len);
- return (arr_len * 2);
- }
- int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times)
- {
- if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len);
- int orig_len = arr_len;
- int i;
- for (i = 0; i < times; i++)
- {
- memcpy (&arr[arr_len], arr, orig_len);
- arr_len += orig_len;
- }
- return (arr_len);
- }
- int mangle_reflect (char arr[BLOCK_SIZE], int arr_len)
- {
- if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len);
- mangle_double (arr, arr_len);
- mangle_reverse (arr + arr_len, arr_len);
- return (arr_len * 2);
- }
- int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len)
- {
- int l;
- int r;
- for (l = 0, r = arr_len - 1; r > 0; r--)
- {
- MANGLE_SWITCH (arr, l, r);
- }
- return (arr_len);
- }
- int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len)
- {
- int l;
- int r;
- for (l = 0, r = arr_len - 1; l < r; l++)
- {
- MANGLE_SWITCH (arr, l, r);
- }
- return (arr_len);
- }
- int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c)
- {
- if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
- arr[arr_len] = c;
- return (arr_len + 1);
- }
- int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c)
- {
- if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
- int arr_pos;
- for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
- {
- arr[arr_pos + 1] = arr[arr_pos];
- }
- arr[0] = c;
- return (arr_len + 1);
- }
- int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos)
- {
- if (upos >= arr_len) return (arr_len);
- int arr_pos;
- for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++)
- {
- arr[arr_pos] = arr[arr_pos + 1];
- }
- return (arr_len - 1);
- }
- int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
- {
- if (upos >= arr_len) return (arr_len);
- if ((upos + ulen) > arr_len) return (arr_len);
- int arr_pos;
- for (arr_pos = 0; arr_pos < ulen; arr_pos++)
- {
- arr[arr_pos] = arr[upos + arr_pos];
- }
- return (ulen);
- }
- int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
- {
- if (upos >= arr_len) return (arr_len);
- if ((upos + ulen) > arr_len) return (arr_len);
- int arr_pos;
- for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++)
- {
- arr[arr_pos] = arr[arr_pos + ulen];
- }
- return (arr_len - ulen);
- }
- int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
- {
- if (upos > arr_len) return (arr_len);
- if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len);
- int arr_pos;
- for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--)
- {
- arr[arr_pos + 1] = arr[arr_pos];
- }
- arr[upos] = c;
- return (arr_len + 1);
- }
- int mangle_insert_multi (char arr[BLOCK_SIZE], int arr_len, int arr_pos, char arr2[BLOCK_SIZE], int arr2_len, int arr2_pos, int arr2_cpy)
- {
- if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
- if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR);
- if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR);
- if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR);
- if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR);
- memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos);
- memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos);
- memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy);
- return (arr_len + arr2_cpy);
- }
- int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c)
- {
- if (upos >= arr_len) return (arr_len);
- arr[upos] = c;
- return (arr_len);
- }
- int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos)
- {
- if (upos >= arr_len) return (arr_len);
- memset (arr + upos, 0, arr_len - upos);
- return (upos);
- }
- int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc)
- {
- int arr_pos;
- for (arr_pos = 0; arr_pos < arr_len; arr_pos++)
- {
- if (arr[arr_pos] != oldc) continue;
- arr[arr_pos] = newc;
- }
- return (arr_len);
- }
- int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c)
- {
- int arr_pos;
- int ret_len;
- for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++)
- {
- if (arr[arr_pos] == c) continue;
- arr[ret_len] = arr[arr_pos];
- ret_len++;
- }
- return (ret_len);
- }
- int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen)
- {
- if (ulen > arr_len) return (arr_len);
- if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
- char cs[100];
- memcpy (cs, arr, ulen);
- int i;
- for (i = 0; i < ulen; i++)
- {
- char c = cs[i];
- arr_len = mangle_insert (arr, arr_len, i, c);
- }
- return (arr_len);
- }
- int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen)
- {
- if (ulen > arr_len) return (arr_len);
- if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
- int upos = arr_len - ulen;
- int i;
- for (i = 0; i < ulen; i++)
- {
- char c = arr[upos + i];
- arr_len = mangle_append (arr, arr_len, c);
- }
- return (arr_len);
- }
- int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen)
- {
- if ( arr_len == 0) return (arr_len);
- if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len);
- char c = arr[upos];
- int i;
- for (i = 0; i < ulen; i++)
- {
- arr_len = mangle_insert (arr, arr_len, upos, c);
- }
- return (arr_len);
- }
- int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len)
- {
- if ( arr_len == 0) return (arr_len);
- if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len);
- int arr_pos;
- for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--)
- {
- int new_pos = arr_pos * 2;
- arr[new_pos] = arr[arr_pos];
- arr[new_pos + 1] = arr[arr_pos];
- }
- return (arr_len * 2);
- }
- int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
- {
- if (upos >= arr_len) return (arr_len);
- if (upos2 >= arr_len) return (arr_len);
- MANGLE_SWITCH (arr, upos, upos2);
- return (arr_len);
- }
- int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2)
- {
- MANGLE_SWITCH (arr, upos, upos2);
- return (arr_len);
- }
- int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
- {
- if (upos >= arr_len) return (arr_len);
- arr[upos] <<= 1;
- return (arr_len);
- }
- int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
- {
- if (upos >= arr_len) return (arr_len);
- arr[upos] >>= 1;
- return (arr_len);
- }
- int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
- {
- if (upos >= arr_len) return (arr_len);
- arr[upos] += 1;
- return (arr_len);
- }
- int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos)
- {
- if (upos >= arr_len) return (arr_len);
- arr[upos] -= 1;
- return (arr_len);
- }
- int mangle_title (char arr[BLOCK_SIZE], int arr_len)
- {
- int upper_next = 1;
- int pos;
- for (pos = 0; pos < arr_len; pos++)
- {
- if (arr[pos] == ' ')
- {
- upper_next = 1;
- continue;
- }
- if (upper_next)
- {
- upper_next = 0;
- MANGLE_UPPER_AT (arr, pos);
- }
- else
- {
- MANGLE_LOWER_AT (arr, pos);
- }
- }
- return (arr_len);
- }
- int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max)
- {
- uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max);
- uint32_t j;
- uint32_t rule_pos = 0;
- for (j = 0; j < rp_gen_num; j++)
- {
- uint32_t r = 0;
- uint32_t p1 = 0;
- uint32_t p2 = 0;
- uint32_t p3 = 0;
- switch ((char) get_random_num (0, 9))
- {
- case 0:
- r = get_random_num (0, sizeof (grp_op_nop));
- rule_buf[rule_pos++] = grp_op_nop[r];
- break;
- case 1:
- r = get_random_num (0, sizeof (grp_op_pos_p0));
- rule_buf[rule_pos++] = grp_op_pos_p0[r];
- p1 = get_random_num (0, sizeof (grp_pos));
- rule_buf[rule_pos++] = grp_pos[p1];
- break;
- case 2:
- r = get_random_num (0, sizeof (grp_op_pos_p1));
- rule_buf[rule_pos++] = grp_op_pos_p1[r];
- p1 = get_random_num (1, 6);
- rule_buf[rule_pos++] = grp_pos[p1];
- break;
- case 3:
- r = get_random_num (0, sizeof (grp_op_chr));
- rule_buf[rule_pos++] = grp_op_chr[r];
- p1 = get_random_num (0x20, 0x7e);
- rule_buf[rule_pos++] = (char) p1;
- break;
- case 4:
- r = get_random_num (0, sizeof (grp_op_chr_chr));
- rule_buf[rule_pos++] = grp_op_chr_chr[r];
- p1 = get_random_num (0x20, 0x7e);
- rule_buf[rule_pos++] = (char) p1;
- p2 = get_random_num (0x20, 0x7e);
- while (p1 == p2)
- p2 = get_random_num (0x20, 0x7e);
- rule_buf[rule_pos++] = (char) p2;
- break;
- case 5:
- r = get_random_num (0, sizeof (grp_op_pos_chr));
- rule_buf[rule_pos++] = grp_op_pos_chr[r];
- p1 = get_random_num (0, sizeof (grp_pos));
- rule_buf[rule_pos++] = grp_pos[p1];
- p2 = get_random_num (0x20, 0x7e);
- rule_buf[rule_pos++] = (char) p2;
- break;
- case 6:
- r = get_random_num (0, sizeof (grp_op_pos_pos0));
- rule_buf[rule_pos++] = grp_op_pos_pos0[r];
- p1 = get_random_num (0, sizeof (grp_pos));
- rule_buf[rule_pos++] = grp_pos[p1];
- p2 = get_random_num (0, sizeof (grp_pos));
- while (p1 == p2)
- p2 = get_random_num (0, sizeof (grp_pos));
- rule_buf[rule_pos++] = grp_pos[p2];
- break;
- case 7:
- r = get_random_num (0, sizeof (grp_op_pos_pos1));
- rule_buf[rule_pos++] = grp_op_pos_pos1[r];
- p1 = get_random_num (0, sizeof (grp_pos));
- rule_buf[rule_pos++] = grp_pos[p1];
- p2 = get_random_num (1, sizeof (grp_pos));
- while (p1 == p2)
- p2 = get_random_num (1, sizeof (grp_pos));
- rule_buf[rule_pos++] = grp_pos[p2];
- break;
- case 8:
- r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3));
- rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r];
- p1 = get_random_num (0, sizeof (grp_pos));
- rule_buf[rule_pos++] = grp_pos[p1];
- p2 = get_random_num (1, sizeof (grp_pos));
- rule_buf[rule_pos++] = grp_pos[p1];
- p3 = get_random_num (0, sizeof (grp_pos));
- rule_buf[rule_pos++] = grp_pos[p3];
- break;
- }
- }
- return (rule_pos);
- }
- int apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE])
- {
- char mem[BLOCK_SIZE];
- if (in == NULL) return (RULE_RC_REJECT_ERROR);
- if (out == NULL) return (RULE_RC_REJECT_ERROR);
- if (in_len < 1) return (RULE_RC_REJECT_ERROR);
- if (rule_len < 1) return (RULE_RC_REJECT_ERROR);
- int out_len = in_len;
- int mem_len = in_len;
- memcpy (out, in, out_len);
- int rule_pos;
- for (rule_pos = 0; rule_pos < rule_len; rule_pos++)
- {
- int upos; int upos2;
- int ulen;
- switch (rule[rule_pos])
- {
- case ' ':
- break;
- case RULE_OP_MANGLE_NOOP:
- break;
- case RULE_OP_MANGLE_LREST:
- out_len = mangle_lrest (out, out_len);
- break;
- case RULE_OP_MANGLE_UREST:
- out_len = mangle_urest (out, out_len);
- break;
- case RULE_OP_MANGLE_LREST_UFIRST:
- out_len = mangle_lrest (out, out_len);
- if (out_len) MANGLE_UPPER_AT (out, 0);
- break;
- case RULE_OP_MANGLE_UREST_LFIRST:
- out_len = mangle_urest (out, out_len);
- if (out_len) MANGLE_LOWER_AT (out, 0);
- break;
- case RULE_OP_MANGLE_TREST:
- out_len = mangle_trest (out, out_len);
- break;
- case RULE_OP_MANGLE_TOGGLE_AT:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- if (upos < out_len) MANGLE_TOGGLE_AT (out, upos);
- break;
- case RULE_OP_MANGLE_REVERSE:
- out_len = mangle_reverse (out, out_len);
- break;
- case RULE_OP_MANGLE_DUPEWORD:
- out_len = mangle_double (out, out_len);
- break;
- case RULE_OP_MANGLE_DUPEWORD_TIMES:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, ulen);
- out_len = mangle_double_times (out, out_len, ulen);
- break;
- case RULE_OP_MANGLE_REFLECT:
- out_len = mangle_reflect (out, out_len);
- break;
- case RULE_OP_MANGLE_ROTATE_LEFT:
- mangle_rotate_left (out, out_len);
- break;
- case RULE_OP_MANGLE_ROTATE_RIGHT:
- mangle_rotate_right (out, out_len);
- break;
- case RULE_OP_MANGLE_APPEND:
- NEXT_RULEPOS (rule_pos);
- out_len = mangle_append (out, out_len, rule[rule_pos]);
- break;
- case RULE_OP_MANGLE_PREPEND:
- NEXT_RULEPOS (rule_pos);
- out_len = mangle_prepend (out, out_len, rule[rule_pos]);
- break;
- case RULE_OP_MANGLE_DELETE_FIRST:
- out_len = mangle_delete_at (out, out_len, 0);
- break;
- case RULE_OP_MANGLE_DELETE_LAST:
- out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0);
- break;
- case RULE_OP_MANGLE_DELETE_AT:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- out_len = mangle_delete_at (out, out_len, upos);
- break;
- case RULE_OP_MANGLE_EXTRACT:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, ulen);
- out_len = mangle_extract (out, out_len, upos, ulen);
- break;
- case RULE_OP_MANGLE_OMIT:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, ulen);
- out_len = mangle_omit (out, out_len, upos, ulen);
- break;
- case RULE_OP_MANGLE_INSERT:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- NEXT_RULEPOS (rule_pos);
- out_len = mangle_insert (out, out_len, upos, rule[rule_pos]);
- break;
- case RULE_OP_MANGLE_OVERSTRIKE:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- NEXT_RULEPOS (rule_pos);
- out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]);
- break;
- case RULE_OP_MANGLE_TRUNCATE_AT:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- out_len = mangle_truncate_at (out, out_len, upos);
- break;
- case RULE_OP_MANGLE_REPLACE:
- NEXT_RULEPOS (rule_pos);
- NEXT_RULEPOS (rule_pos);
- out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]);
- break;
- case RULE_OP_MANGLE_PURGECHAR:
- NEXT_RULEPOS (rule_pos);
- out_len = mangle_purgechar (out, out_len, rule[rule_pos]);
- break;
- case RULE_OP_MANGLE_TOGGLECASE_REC:
- /* todo */
- break;
- case RULE_OP_MANGLE_DUPECHAR_FIRST:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, ulen);
- out_len = mangle_dupechar_at (out, out_len, 0, ulen);
- break;
- case RULE_OP_MANGLE_DUPECHAR_LAST:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, ulen);
- out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen);
- break;
- case RULE_OP_MANGLE_DUPECHAR_ALL:
- out_len = mangle_dupechar (out, out_len);
- break;
- case RULE_OP_MANGLE_DUPEBLOCK_FIRST:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, ulen);
- out_len = mangle_dupeblock_prepend (out, out_len, ulen);
- break;
- case RULE_OP_MANGLE_DUPEBLOCK_LAST:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, ulen);
- out_len = mangle_dupeblock_append (out, out_len, ulen);
- break;
- case RULE_OP_MANGLE_SWITCH_FIRST:
- if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1);
- break;
- case RULE_OP_MANGLE_SWITCH_LAST:
- if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2);
- break;
- case RULE_OP_MANGLE_SWITCH_AT:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos2);
- out_len = mangle_switch_at_check (out, out_len, upos, upos2);
- break;
- case RULE_OP_MANGLE_CHR_SHIFTL:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- mangle_chr_shiftl ((uint8_t *) out, out_len, upos);
- break;
- case RULE_OP_MANGLE_CHR_SHIFTR:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- mangle_chr_shiftr ((uint8_t *) out, out_len, upos);
- break;
- case RULE_OP_MANGLE_CHR_INCR:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- mangle_chr_incr ((uint8_t *) out, out_len, upos);
- break;
- case RULE_OP_MANGLE_CHR_DECR:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- mangle_chr_decr ((uint8_t *) out, out_len, upos);
- break;
- case RULE_OP_MANGLE_REPLACE_NP1:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]);
- break;
- case RULE_OP_MANGLE_REPLACE_NM1:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]);
- break;
- case RULE_OP_MANGLE_TITLE:
- out_len = mangle_title (out, out_len);
- break;
- case RULE_OP_MANGLE_EXTRACT_MEMORY:
- if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, ulen);
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos2);
- if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len);
- break;
- case RULE_OP_MANGLE_APPEND_MEMORY:
- if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
- if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
- memcpy (out + out_len, mem, mem_len);
- out_len += mem_len;
- break;
- case RULE_OP_MANGLE_PREPEND_MEMORY:
- if (mem_len < 1) return (RULE_RC_REJECT_ERROR);
- if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR);
- memcpy (mem + mem_len, out, out_len);
- out_len += mem_len;
- memcpy (out, mem, out_len);
- break;
- case RULE_OP_MEMORIZE_WORD:
- memcpy (mem, out, out_len);
- mem_len = out_len;
- break;
- case RULE_OP_REJECT_LESS:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- if (out_len > upos) return (RULE_RC_REJECT_ERROR);
- break;
- case RULE_OP_REJECT_GREATER:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- if (out_len < upos) return (RULE_RC_REJECT_ERROR);
- break;
- case RULE_OP_REJECT_CONTAIN:
- NEXT_RULEPOS (rule_pos);
- if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR);
- break;
- case RULE_OP_REJECT_NOT_CONTAIN:
- NEXT_RULEPOS (rule_pos);
- if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR);
- break;
- case RULE_OP_REJECT_EQUAL_FIRST:
- NEXT_RULEPOS (rule_pos);
- if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
- break;
- case RULE_OP_REJECT_EQUAL_LAST:
- NEXT_RULEPOS (rule_pos);
- if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
- break;
- case RULE_OP_REJECT_EQUAL_AT:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
- NEXT_RULEPOS (rule_pos);
- if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR);
- break;
- case RULE_OP_REJECT_CONTAINS:
- NEXT_RULEPOS (rule_pos);
- NEXT_RPTOI (rule, rule_pos, upos);
- if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR);
- NEXT_RULEPOS (rule_pos);
- int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++;
- if (cnt < upos) return (RULE_RC_REJECT_ERROR);
- break;
- case RULE_OP_REJECT_MEMORY:
- if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR);
- break;
- default:
- return (RULE_RC_SYNTAX_ERROR);
- break;
- }
- }
- memset (out + out_len, 0, BLOCK_SIZE - out_len);
- return (out_len);
- }
|