]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
Unify the keywordspec handling.
authorBruno Haible <bruno@clisp.org>
Tue, 11 Dec 2001 11:46:22 +0000 (11:46 +0000)
committerBruno Haible <bruno@clisp.org>
Sun, 21 Jun 2009 21:41:01 +0000 (23:41 +0200)
src/ChangeLog
src/x-c.c
src/x-java.l
src/xgettext.c
src/xgettext.h

index dc3f32d2fcfbec5683227dd88b25c98878a61c7b..bee6f39112631fb4ef2f9d13482cf594c360d8c3 100644 (file)
@@ -1,3 +1,12 @@
+2001-12-09  Bruno Haible  <bruno@clisp.org>
+
+       * xgettext.h (split_keywordspec): New declaration.
+       * xgettext.c (split_keywordspec): New function.
+       * x-c.c (x_c_keyword): Use split_keywordspec.
+       * x-java.l (extract_keyword, extract_msgid_arg,
+       extract_msgid_plural_arg): Remove functions.
+       (x_java_keyword): Use split_keywordspec.
+
 2001-12-09  Bruno Haible  <bruno@clisp.org>
 
        * x-c.c: Reorder.
index 6c2e8e6ce684cfeb7eec4038990c28c8305e1e34..521ae1f840c104b9058d202d4df9d6f2c8955199 100644 (file)
--- a/src/x-c.c
+++ b/src/x-c.c
@@ -192,38 +192,26 @@ x_c_keyword (name)
     default_keywords = false;
   else
     {
+      const char *end;
       int argnum1;
       int argnum2;
-      size_t len;
-      char *sp;
+      const char *colon;
 
       if (keywords.table == NULL)
        init_hash (&keywords, 100);
 
-      sp = strchr (name, ':');
-      if (sp)
-       {
-         len = sp - name;
-         sp++;
-         argnum1 = strtol (sp, &sp, 10);
-         if (*sp == ',')
-           {
-             sp++;
-             argnum2 = strtol (sp, &sp, 10);
-           }
-         else
-           argnum2 = 0;
-       }
-      else
-       {
-         len = strlen (name);
+      split_keywordspec (name, &end, &argnum1, &argnum2);
 
-         argnum1 = 1;
-         argnum2 = 0;
+      /* The characters between name and end should form a valid C identifier.
+        A colon means an invalid parse in split_keywordspec().  */
+      colon = strchr (name, ':');
+      if (colon == NULL || colon >= end)
+       {
+         if (argnum1 == 0)
+           argnum1 = 1;
+         insert_entry (&keywords, name, end - name,
+                       (void *) (long) (argnum1 + (argnum2 << 10)));
        }
-
-      insert_entry (&keywords, name, len,
-                   (void *) (long) (argnum1 + (argnum2 << 10)));
     }
 }
 
index d5afe958b4aca2dbe4b5a2652faafc2194a4122f..05d80118d5d2f78985f13d73e232ca96ffae9494 100644 (file)
@@ -353,7 +353,6 @@ x_java_extract_all ()
 }
 
 
-
 static java_keyword *
 alloc_keyword (keyword, arg1, arg2)
      const char *keyword;
@@ -370,67 +369,6 @@ alloc_keyword (keyword, arg1, arg2)
 static object_list *java_keywords = NULL;
 
 
-/**
- * Extract the keyword from a keyword indata string.
- */
-static char *
-extract_keyword (key)
-     const char *key;
-{
-  char *s = strchr (key, ':');
-  char *new_string;
-
-  new_string = xstrdup (key);
-  if (s != NULL)
-    new_string[s - key] = '\0';
-  return new_string;
-}
-
-/**
- * Extract the msgid arg number from a keyword indata string.
- */
-static int
-extract_msgid_arg (key)
-     const char *key;
-{
-  char *s = strchr (key, ':');
-  int arg;
-
-  if (s != NULL)
-    {
-      s ++;
-      arg = strtol (s, &s, 10);
-    }
-  else
-    {
-      arg = 1;
-    }
-  return arg;
-}
-
-/**
- * Extract the msgid plural arg number from a keyword indata string,
- * if any.
- */
-static int
-extract_msgid_plural_arg (key)
-     const char *key;
-{
-  char *s = strchr (key, ',');
-  int arg;
-  if (s != NULL)
-    {
-      s ++;
-      arg = strtol (s, &s, 10);
-    }
-  else
-    {
-      arg = 0;
-    }
-  return arg;
-}
-
-
 /**
  * Backwards substring match.
  */
@@ -490,8 +428,10 @@ void
 x_java_keyword (keyword)
      const char *keyword;
 {
+  const char *keyword_end;
   int arg1;
   int arg2;
+  size_t len;
   char *kw;
 
   if (keyword == NULL)
@@ -505,14 +445,22 @@ x_java_keyword (keyword)
     }
 
   if (java_keywords == NULL)
+    java_keywords = object_list_alloc ();
+
+  split_keywordspec (keyword, &keyword_end, &arg1, &arg2);
+  len = keyword_end - keyword;
+  kw = (char *) xmalloc (len + 1);
+  memcpy (kw, keyword, len);
+  kw[len] = '\0';
+
+  /* kw should be a valid Java identifier sequence with dots.
+     A colon means an invalid parse in split_keywordspec().  */
+  if (strchr (kw, ':') == NULL)
     {
-      java_keywords = object_list_alloc ();
+      if (arg1 == 0)
+       arg1 = 1;
+      add_object (java_keywords, alloc_keyword (kw, arg1, arg2));
     }
-
-  kw = extract_keyword (keyword);
-  arg1 = extract_msgid_arg (keyword);
-  arg2 = extract_msgid_plural_arg (keyword);
-  add_object (java_keywords, alloc_keyword (kw, arg1, arg2));
 }
 
 
index f6bb386e1cbd97cb623a1ed7fab67bd7aa2ae8e4..dce737139b82af7ca465abc26a30220e49f869de 100644 (file)
@@ -673,6 +673,71 @@ read_exclusion_file (file_name)
 }
 
 
+void
+split_keywordspec (spec, endp, argnum1p, argnum2p)
+     const char *spec;
+     const char **endp;
+     int *argnum1p;
+     int *argnum2p;
+{
+  const char *p;
+
+  /* Start parsing from the end.  */
+  p = spec + strlen (spec);
+  if (p > spec && isdigit ((unsigned char) p[-1]))
+    {
+      const char *last_arg;
+
+      do
+       p--;
+      while (p > spec && isdigit ((unsigned char) p[-1]));
+
+      last_arg = p;
+
+      if (p > spec && p[-1] == ',')
+       {
+         p--;
+
+         if (p > spec && isdigit ((unsigned char) p[-1]))
+           {
+             const char *first_arg;
+
+             do
+               p--;
+             while (p > spec && isdigit ((unsigned char) p[-1]));
+
+             first_arg = p;
+
+             if (p > spec && p[-1] == ':')
+               {
+                 /* Parsed "KEYWORD:ARGNUM1,ARGNUM2".  */
+                 char *dummy;
+
+                 *endp = p - 1;
+                 *argnum1p = strtol (first_arg, &dummy, 10);
+                 *argnum2p = strtol (last_arg, &dummy, 10);
+                 return;
+               }
+           }
+       }
+      else if (p > spec && p[-1] == ':')
+       {
+         /* Parsed "KEYWORD:ARGNUM1.  */
+         char *dummy;
+
+         *endp = p - 1;
+         *argnum1p = strtol (last_arg, &dummy, 10);
+         *argnum2p = 0;
+         return;
+       }
+    }
+  /* Parsed "KEYWORD".  */
+  *endp = p + strlen (p);
+  *argnum1p = 0;
+  *argnum2p = 0;
+}
+
+
 static string_list_ty *comment;
 
 void
index 9f73a82a566dd4f8cc13b7804405103e6bd55af8..81b6632ddb0f1ad5456161596cebc5085476e351 100644 (file)
@@ -31,6 +31,10 @@ extern int omit_header;
 
 extern bool substring_match;
 
+/* Split keyword spec into keyword, argnum1, argnum2.  */
+extern void split_keywordspec PARAMS ((const char *spec, const char **endp,
+                                      int *argnum1p, int *argnum2p));
+
 /* List of messages whose msgids must not be extracted, or NULL.
    Used by remember_a_message().  */
 extern message_list_ty *exclude;