X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Ftransform.c;h=23edd9ea631a302d7b7ec846b240a1f0bf1b407a;hb=2d2e1d411e09126a7ed82ad774e24082914a51ce;hp=598caaccac79abc7119cb9fad8ef540094f14c3a;hpb=8b2f4ad6705f4a561a5751f58c1e0169f5fe0270;p=chaz%2Ftar diff --git a/src/transform.c b/src/transform.c index 598caac..23edd9e 100644 --- a/src/transform.c +++ b/src/transform.c @@ -26,6 +26,7 @@ enum transform_type transform_global } transform_type = transform_none; +static unsigned match_number = 0; static regex_t regex; static struct obstack stk; @@ -102,7 +103,7 @@ add_char_segment (int chr) segm->v.literal.ptr = xmalloc (2); segm->v.literal.ptr[0] = chr; segm->v.literal.ptr[1] = 0; - segm->v.literal.size = 2; + segm->v.literal.size = 1; } static void @@ -176,6 +177,12 @@ set_transform_expr (const char *expr) cflags |= REG_EXTENDED; break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + match_number = strtoul (p, (char**) &p, 0); + p--; + break; + default: USAGE_ERROR ((0, 0, _("Unknown flag in transform expression"))); } @@ -372,9 +379,10 @@ _transform_name_to_obstack (char *input) regmatch_t *rmp; char *p; int rc; + size_t nmatches = 0; enum case_ctl_type case_ctl = ctl_stop, /* Current case conversion op */ save_ctl = ctl_stop; /* Saved case_ctl for \u and \l */ - + /* Reset case conversion after a single-char operation */ #define CASE_CTL_RESET() if (case_ctl == ctl_upcase_next \ || case_ctl == ctl_locase_next) \ @@ -403,7 +411,15 @@ _transform_name_to_obstack (char *input) if (rmp[0].rm_so) obstack_grow (&stk, input, rmp[0].rm_so); - + + nmatches++; + if (match_number && nmatches < match_number) + { + obstack_grow (&stk, input, disp); + input += disp; + continue; + } + for (segm = repl_head; segm; segm = segm->next) { switch (segm->type)