From: Bruno Haible Date: Tue, 11 Dec 2001 11:46:22 +0000 (+0000) Subject: Unify the keywordspec handling. X-Git-Tag: v0.11~206 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8cdc9cb8b6299d7d06a8a7d3151b298abccb20ca;p=thirdparty%2Fgettext.git Unify the keywordspec handling. --- diff --git a/src/ChangeLog b/src/ChangeLog index dc3f32d2f..bee6f3911 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,12 @@ +2001-12-09 Bruno Haible + + * 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 * x-c.c: Reorder. diff --git a/src/x-c.c b/src/x-c.c index 6c2e8e6ce..521ae1f84 100644 --- 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))); } } diff --git a/src/x-java.l b/src/x-java.l index d5afe958b..05d80118d 100644 --- a/src/x-java.l +++ b/src/x-java.l @@ -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)); } diff --git a/src/xgettext.c b/src/xgettext.c index f6bb386e1..dce737139 100644 --- a/src/xgettext.c +++ b/src/xgettext.c @@ -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 diff --git a/src/xgettext.h b/src/xgettext.h index 9f73a82a5..81b6632dd 100644 --- a/src/xgettext.h +++ b/src/xgettext.h @@ -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;