diff options
author | Bruno Haible <bruno@clisp.org> | 2003-02-14 14:25:06 +0000 |
---|---|---|
committer | Bruno Haible <bruno@clisp.org> | 2009-06-23 12:09:40 +0200 |
commit | 488a9f4fef3af55690146a3798a80dc81ba6fc2c (patch) | |
tree | 1893999cb9253eed03baf5bec0eb4d291da98ee5 /src | |
parent | 9298d25affdf4fbd849546185de44b1f2aa0a9fd (diff) | |
download | external_gettext-488a9f4fef3af55690146a3798a80dc81ba6fc2c.zip external_gettext-488a9f4fef3af55690146a3798a80dc81ba6fc2c.tar.gz external_gettext-488a9f4fef3af55690146a3798a80dc81ba6fc2c.tar.bz2 |
Move src/x-java.l to gettext-tools/src/x-java.l.
Diffstat (limited to 'src')
-rw-r--r-- | src/x-java.l | 645 |
1 files changed, 0 insertions, 645 deletions
diff --git a/src/x-java.l b/src/x-java.l deleted file mode 100644 index dee61a2..0000000 --- a/src/x-java.l +++ /dev/null @@ -1,645 +0,0 @@ -/* xgettext Java backend. -*- C -*- - Copyright (C) 2001-2002 Free Software Foundation, Inc. - Written by Tommy Johansson <tommy.johansson@kanalen.org>, 2001. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ - -%{ -#ifdef HAVE_CONFIG_H -# include <config.h> -#endif - -#include <ctype.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "message.h" -#include "x-java.h" -#include "xgettext.h" -#include "xmalloc.h" -#include "strstr.h" - -typedef enum -{ - JAVA_WORD, - JAVA_STRING, - JAVA_OPERATOR, - JAVA_FLOW, - JAVA_COMMENT -} TOKEN_TYPE; - -typedef struct -{ - char *word; - char *string; - char *operator; - char *flow; - char *comment; - - int line_no; -} PARSER_GLOBAL; - -static PARSER_GLOBAL pg; -static PARSER_GLOBAL *parser_global = &pg; - -typedef enum -{ - STATE_NONE, - STATE_STRING, - STATE_WORD, - STATE_APPEND, - STATE_INVOCATION, - STATE_KEYWORD -} PARSER_STATE; - -typedef struct -{ - char *data; - int len; - int maxlen; -} char_buf; - - -typedef struct _object_list -{ - int num_obj; - int max_num_obj; - void **objects; -} object_list; - -#define INITIAL_OBJECT_LIST_SIZE 10 -#define OBJECT_LIST_GROWTH 10 - -typedef struct _java_keyword -{ - char *keyword; - int msgid_arg; - int msgid_plural_arg; -} java_keyword; - - -#define INITIAL_CHARBUF_SIZE 500 -#define CHARBUF_GROWTH 100 -static char_buf * -create_char_buf () -{ - char_buf *b = (char_buf *) xmalloc (sizeof (char_buf)); - b->data = (char *) xmalloc (INITIAL_CHARBUF_SIZE); - b->data[0] = '\0'; - b->len = 0; - b->maxlen = INITIAL_CHARBUF_SIZE; - return b; -} - -static void -append_char_buf (char_buf *b, int c) -{ - if (b->len >= b->maxlen - 1) - { - b->data = (char *) xrealloc (b->data, b->maxlen + CHARBUF_GROWTH); - b->maxlen += CHARBUF_GROWTH; - } - b->data[b->len++] = c; - b->data[b->len] = '\0'; -} - -static char * -get_string (char_buf *b) -{ - return xstrdup (b->data); -} - -static void -destroy_charbuf (char_buf *b) -{ - free (b->data); - free (b); -} - -static void -update_line_no (int c) -{ - if (c == '\n') - parser_global->line_no++; -} - -static void -strip_ending_spaces (char *str) -{ - int len = strlen (str); - - while (len > 0 && isspace ((unsigned char) str[len - 1])) - len--; - str[len] = '\0'; -} -%} - -%option noyywrap - -NUM [0-9] -ID [a-zA-Z_][a-zA-Z0-9_]* - -%% - -"/*" { - int c; - int last; - char *str; - - char_buf *charbuf = create_char_buf (); - for (;;) - { - c = input (); - last = input (); - update_line_no (c); - if ((c == '*' && last == '/') || c == EOF) - break; - unput (last); - append_char_buf (charbuf, c); - } - str = get_string (charbuf); - destroy_charbuf (charbuf); - strip_ending_spaces (str); - parser_global->comment = str; - return JAVA_COMMENT; -} - -{NUM}|�{NUM}+"."{NUM}* -\" { - int c; - char *str; - char_buf *charbuf = create_char_buf (); - while ((c = input ()) != EOF && c != '"') - { - update_line_no (c); - append_char_buf (charbuf, c); - } - str = get_string (charbuf); - destroy_charbuf (charbuf); - parser_global->string = str; - return JAVA_STRING; -} - -{ID} { - parser_global->word = yytext; - return JAVA_WORD; -} - -"."|"("|")"|";"|"{"|"}"|"["|"]"|","|":"|"\\"|"?"|"\'" { - parser_global->flow = yytext; - return JAVA_FLOW; -} - -"="|"<"|">"|"+"|"-"|"*"|"/"|"!"|"&"|"|"|"%"|"^"|"~" { - parser_global->operator = yytext; - return JAVA_OPERATOR; -} - -"#"|"@"|"\r"|"`" /* ignore whitespace */ - -"//"[^\n]* { - parser_global->comment = xstrdup (yytext + 2); - return JAVA_COMMENT; -} -"\n"|"\r"|"\r\n" parser_global->line_no++; -[ \t]+ -. -<<EOF>> return -1; -%% - -static char * -append_strings (char *a, char *b) -{ - int total_size = strlen (a) + strlen (b) + 1; - char *new_string = (char *) xmalloc (total_size); - strcpy (new_string, a); - strcat (new_string, b); - return new_string; -} - -static inline bool -isplus (char *s) -{ - return *s == '+'; -} - -static inline bool -isdot (char *s) -{ - return *s == '.'; -} - - -static char * -translate_esc (char *s) -{ - char *n = (char *) xmalloc (strlen (s) + 1); - size_t i; - size_t j = 0; - - for (i = 0; i < strlen (s); i++) - switch (s[i]) - { - case '\\': - if (s[i + 1] == 'n') - { - n[j++] = '\n'; - i++; - } - break; - default: - n[j++] = s[i]; - } - n[j] = '\0'; - return n; -} - -static object_list * -object_list_alloc () -{ - object_list *list = xmalloc (sizeof (object_list)); - list->max_num_obj = INITIAL_OBJECT_LIST_SIZE; - list->num_obj = 0; - list->objects = xmalloc (sizeof (void *) * INITIAL_OBJECT_LIST_SIZE); - return list; -} - -static void -object_list_destroy (object_list *list) -{ - free (list->objects); - free (list); -} - -static int -get_num_objects (const object_list *list) -{ - return list->num_obj; -} - -static void * -get_object (const object_list *list, int i) -{ - return list->objects[i]; -} - -static void -add_object (object_list *list, void *object) -{ - if (list->num_obj + 1 >= list->max_num_obj) - { - list->max_num_obj += OBJECT_LIST_GROWTH; - list->objects = - xrealloc (list->objects, list->max_num_obj * sizeof (void *)); - } - list->objects[list->num_obj ++] = object; -} - - -/* options */ -static bool extract_all_strings = false; - -void -x_java_extract_all () -{ - extract_all_strings = true; -} - - -static java_keyword * -alloc_keyword (const char *keyword, int arg1, int arg2) -{ - java_keyword *jk = xmalloc (sizeof (java_keyword)); - jk->keyword = xstrdup (keyword); - jk->msgid_arg = arg1; - jk->msgid_plural_arg = arg2; - return jk; -} - -static object_list *java_keywords = NULL; - - -/** - * Backwards substring match. - */ -static bool -tailcmp (const char *s1, const char *s2) -{ - int len1 = strlen (s1); - int len2 = strlen (s2); - int start = len1 - len2; - if (start < 0) - return false; - return (start == 0 || s1[start-1] == '.') && (strcmp (s1 + start, s2) == 0); -} - -/** - * Try to match a string against the keyword. If substring_match is - * true substring match is used. - */ -static bool -do_compare (const char *s1, const char *s2) -{ - if (substring_match) - return strstr (s1, s2) != NULL; - else - return tailcmp (s1, s2); -} - -/** - * Check if a string is a keyword or not. - */ -static java_keyword * -is_keyword (const char *s) -{ - int i; - int num_keywords = get_num_objects (java_keywords); - java_keyword *kw; - - for (i = 0; i < num_keywords; i++) - { - kw = (java_keyword *) get_object (java_keywords, i); - - if (do_compare (s, kw->keyword)) - return kw; - } - return NULL; -} - -/** - * Add a keyword to the list of possible keywords. - */ -void -x_java_keyword (const char *keyword) -{ - const char *keyword_end; - int arg1; - int arg2; - size_t len; - char *kw; - - if (keyword == NULL) - { - if (java_keywords != NULL) - { - object_list_destroy (java_keywords); - java_keywords = NULL; - } - return; - } - - 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) - { - if (arg1 == 0) - arg1 = 1; - add_object (java_keywords, alloc_keyword (kw, arg1, arg2)); - } -} - - -/** - * Free any memory allocated by the tokenizer. - */ -static void -free_global () -{ - /** - * free memory used by strings and comments as they are strdup'ed - * by the lexer. - */ - if (parser_global->string != NULL) - { - free (parser_global->string); - parser_global->string = NULL; - } - if (parser_global->comment != NULL) - { - free (parser_global->comment); - parser_global->comment = NULL; - } -} - - -/** - * Main java keyword extract function. - */ -void -extract_java (FILE *f, - const char *real_filename, const char *logical_filename, - msgdomain_list_ty *mdlp) -{ - char *logical_file_name = xstrdup (logical_filename); - int token; - PARSER_STATE state = STATE_NONE; - PARSER_STATE last_state = STATE_NONE; - char *str = NULL; /* used only if state == STATE_STRING - || state == STATE_APPEND */ - char *key = NULL; /* used only if state == STATE_WORD - || state == STATE_INVOCATION */ - message_ty *plural = NULL; /* used only after state was STATE_KEYWORD */ - message_list_ty *mlp = mdlp->item[0]->messages; - java_keyword *current_keyword = NULL; - java_keyword *keyword; - int argument_counter = 0; - - if (java_keywords == NULL) - { - /* ops, no standard keywords */ - x_java_keyword ("GettextResource.gettext:2"); /* static method */ - x_java_keyword ("GettextResource.ngettext:2,3"); /* static method */ - x_java_keyword ("gettext"); - x_java_keyword ("ngettext:1,2"); - x_java_keyword ("getString"); /* ResourceBundle.getString */ - } - - memset (parser_global, 0, sizeof (*parser_global)); - /* first line is 1 */ - parser_global->line_no = 1; - - yyin = f; - do - { - token = yylex (); - switch (token) - { - - case JAVA_WORD: - if (state == STATE_KEYWORD) - { - last_state = STATE_KEYWORD; - argument_counter ++; - } - if (state == STATE_INVOCATION) - { - char *k2; - k2 = append_strings (key, "."); - free (key); - key = append_strings (k2, parser_global->word); - free (k2); - } - else - { - if (str != NULL) - { - free (str); - str = NULL; - } - state = STATE_WORD; - key = xstrdup (parser_global->word); - } - /* For java we try to match both things like object.methodCall() - and methodCall(). */ - if ((keyword = is_keyword (key)) != NULL - || (keyword = is_keyword (parser_global->word)) != NULL) - { - current_keyword = keyword; - free (key); - state = STATE_KEYWORD; - argument_counter = 1; - plural = NULL; - } - break; - - case JAVA_STRING: - if (state == STATE_KEYWORD) - last_state = STATE_KEYWORD; - if (state == STATE_APPEND) - { - char *s2; - s2 = append_strings (str, translate_esc (parser_global->string)); - free (str); - str = s2; - } - else - str = translate_esc (parser_global->string); - state = STATE_STRING; - break; - - case JAVA_OPERATOR: - if (state == STATE_STRING && isplus (parser_global->operator)) - state = STATE_APPEND; - else - { - if (str != NULL) - { - free (str); - str = NULL; - } - state = STATE_NONE; - } - break; - - case JAVA_FLOW: - /* Did we get something? */ - if (state == STATE_STRING - && (last_state == STATE_KEYWORD || extract_all_strings)) - { - lex_pos_ty pos; - pos.file_name = logical_file_name; - pos.line_number = parser_global->line_no; - if (extract_all_strings) - { - remember_a_message (mlp, str, &pos); - } - else if (argument_counter == current_keyword->msgid_arg) - { - plural = remember_a_message (mlp, str, &pos); - if (current_keyword->msgid_plural_arg == 0) - { - /** - * we don't expect any plural arg, reset state - */ - state = STATE_NONE; - last_state = STATE_NONE; - argument_counter = 0; - } - else - { - argument_counter ++; - } - - } - else if (argument_counter == current_keyword->msgid_plural_arg - && str != NULL) - { - remember_a_message_plural (plural, str, &pos); - state = STATE_NONE; - last_state = STATE_NONE; - argument_counter = 0; - } - else - { - if (str != NULL) - free (str); - } - str = NULL; - } - - if (extract_all_strings) - { - if (str != NULL) - { - free (str); - str = NULL; - } - state = STATE_NONE; - last_state = STATE_NONE; - } - - if (state == STATE_WORD && isdot (parser_global->flow)) - { - state = STATE_INVOCATION; - } - - break; - - case JAVA_COMMENT: - if (str != NULL) - { - free (str); - str = NULL; - } - state = STATE_NONE; - last_state = STATE_NONE; - xgettext_comment_add (parser_global->comment); - break; - - default: - if (str != NULL) - { - free (str); - str = NULL; - } - state = STATE_NONE; - } - free_global (); - } - while (token != -1); - - if (str != NULL) - free (str); -} |