-int zebra_replace_sub(ZebraMaps zms, unsigned reg_id, const char *ex_list,
- const char *input_str, int input_len, WRBUF wrbuf)
-{
- int i = -1;
- int no_replaces = 0;
- struct zebra_map *zm = zebra_map_get (zms, reg_id);
-
- wrbuf_rewind(wrbuf);
- for (i = -1; i <= input_len; )
- {
- struct zm_token *token;
- char replace_string[128];
- int replace_out;
- int replace_in = 0;
-
- for (token = zm->replace_tokens; !replace_in && token;
- token = token->next)
- {
- int j = 0;
- int replace_done = 0;
- replace_out = 0;
- for (;; j++)
- {
- int c;
- if (!token->token_from[j])
- {
- replace_in = j;
- break;
- }
- if (ex_list && strchr (ex_list, token->token_from[j]))
- break;
- if (i+j < 0 || j+i >= input_len)
- c = ' ';
- else
- c = input_str[j+i] & 255;
- if (token->token_from[j] == ZEBRA_REPLACE_ANY)
- {
- if (c == ' ')
- break;
- replace_string[replace_out++] = c;
- }
- else
- {
- if (c != token->token_from[j])
- {
- break;
- }
- if (!replace_done)
- {
- const char *cp = token->token_to;
- replace_done = 1;
- for (; cp && *cp; cp++)
- replace_string[replace_out++] = *cp;
- }
- }
- }
- }
- if (!replace_in)
- {
- if (i >= 0 && i < input_len)
- wrbuf_putc(wrbuf, input_str[i]);
- i++;
- }
- else
- {
- no_replaces++;
- if (replace_out)
- wrbuf_write(wrbuf, replace_string, replace_out);
- i += replace_in;
- }
- }
-#if 0
- logf (LOG_LOG, "out:%.*s:", wrbuf_len(wrbuf), wrbuf_buf(wrbuf));
-#endif
- return no_replaces;
-}