+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.
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)));
}
}
}
-
static java_keyword *
alloc_keyword (keyword, arg1, arg2)
const char *keyword;
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.
*/
x_java_keyword (keyword)
const char *keyword;
{
+ const char *keyword_end;
int arg1;
int arg2;
+ size_t len;
char *kw;
if (keyword == NULL)
}
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));
}
}
+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
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;