]> Dogcows Code - chaz/tar/blobdiff - src/transform.c
Adjust to recent gnulib changes.
[chaz/tar] / src / transform.c
index 598caaccac79abc7119cb9fad8ef540094f14c3a..fd2ed51ec70401101b0120693e28974a9463e477 100644 (file)
 #include <regex.h>
 #include "common.h"
 
-enum transform_type
+static enum transform_type
   {
     transform_none,
     transform_first,
     transform_global
   }
 transform_type = transform_none;
+static unsigned match_number = 0;
 static regex_t regex;
 static struct obstack stk;
 
@@ -63,7 +64,7 @@ struct replace_segm
 
 /* Compiled replacement expression */
 static struct replace_segm *repl_head, *repl_tail;
-static segm_count; /* Number of elements in the above list */
+static size_t segm_count; /* Number of elements in the above list */
 
 static struct replace_segm *
 add_segment (void)
@@ -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")));
       }
@@ -370,11 +377,11 @@ bool
 _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 +410,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)
@@ -485,7 +500,7 @@ _transform_name_to_obstack (char *input)
 bool
 transform_name_fp (char **pinput, char *(*fun)(char *))
 {
-    char *str, *p;
+    char *str;
     bool ret = _transform_name_to_obstack (*pinput);
     if (ret)
       {
@@ -510,20 +525,3 @@ transform_name (char **pinput)
   return transform_name_fp (pinput, NULL);
 }
 
-#if 0
-void
-read_and_transform_loop ()
-{
-  char buf[512];
-  while (fgets (buf, sizeof buf, stdin))
-    {
-      char *p = buf + strlen (buf);
-      if (p[-1] == '\n')
-       p[-1] = 0;
-      if (transform_name (buf, &p))
-       printf ("=> %s\n", p);
-      else
-       printf ("=\n");
-    }
-}
-#endif
This page took 0.02861 seconds and 4 git commands to generate.