From: Bruno Haible Date: Tue, 23 Oct 2001 09:07:49 +0000 (+0000) Subject: Simplify the xgettext backend interface. X-Git-Tag: v0.11~429 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=04369bf37ca9ff9b910f4a3f707363c965820f93;p=thirdparty%2Fgettext.git Simplify the xgettext backend interface. --- diff --git a/src/ChangeLog b/src/ChangeLog index 214f02104..2cbd5234e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,18 @@ +2001-09-22 Bruno Haible + + * xgettext.c (extractor_func): New typedef. + (scanner_fp): Remove typedef. + (main): Use extractor_func and call it via extract_from_file. + (extract_from_file): New function. + (scan_c_file, scan_po_file, scan_java_file, scan_ycp_file, + scan_rst_file): Remove functions. + (language_to_extractor): Renamed from language_to_scanner. + * x-c.h (SCANNERS_C): Use extract_c instead of scan_c_file. + * x-java.h (SCANNERS_JAVA): Use extract_java instead of scan_java_file. + * x-po.h (SCANNERS_PO): Use extract_po instead of scan_po_file. + * x-rst.h (SCANNERS_RST): Use extract_rst instead of scan_rst_file. + * x-ycp.h (SCANNERS_YCP): Use extract_ycp instead of scan_ycp_file. + 2001-09-23 Bruno Haible * plural-eval.c: New file. diff --git a/src/x-c.h b/src/x-c.h index bc5314895..b69923f25 100644 --- a/src/x-c.h +++ b/src/x-c.h @@ -30,9 +30,9 @@ { "m", "ObjectiveC" }, \ #define SCANNERS_C \ - { "C", scan_c_file, &formatstring_c }, \ - { "C++", scan_c_file, &formatstring_c }, \ - { "ObjectiveC", scan_c_file, &formatstring_c }, \ + { "C", extract_c, &formatstring_c }, \ + { "C++", extract_c, &formatstring_c }, \ + { "ObjectiveC", extract_c, &formatstring_c }, \ /* Scan a C/C++/ObjectiveC file and add its translatable strings to mdlp. */ extern void extract_c PARAMS ((FILE *fp, const char *real_filename, diff --git a/src/x-java.h b/src/x-java.h index 1deecac10..ddb040c8f 100644 --- a/src/x-java.h +++ b/src/x-java.h @@ -20,7 +20,7 @@ { "java", "Java" }, \ #define SCANNERS_JAVA \ - { "Java", scan_java_file, &formatstring_java }, \ + { "Java", extract_java, &formatstring_java }, \ extern void extract_java PARAMS ((FILE *fp, const char *real_filename, const char *logical_filename, diff --git a/src/x-po.h b/src/x-po.h index b70ba39da..a851172a2 100644 --- a/src/x-po.h +++ b/src/x-po.h @@ -22,7 +22,7 @@ { "pot", "PO" }, \ #define SCANNERS_PO \ - { "PO", scan_po_file, NULL }, \ + { "PO", extract_po, NULL }, \ /* Scan a PO file and add its translatable strings to mdlp. */ extern void extract_po PARAMS ((FILE *fp, const char *real_filename, diff --git a/src/x-rst.h b/src/x-rst.h index 6f788c6ba..04a9d9b2f 100644 --- a/src/x-rst.h +++ b/src/x-rst.h @@ -21,7 +21,7 @@ { "rst", "RST" }, \ #define SCANNERS_RST \ - { "RST", scan_rst_file, &formatstring_pascal }, \ + { "RST", extract_rst, &formatstring_pascal }, \ /* Scan an RST file and add its translatable strings to mdlp. */ extern void extract_rst PARAMS ((FILE *fp, const char *real_filename, diff --git a/src/x-ycp.h b/src/x-ycp.h index c3ad5d0a4..36a725c38 100644 --- a/src/x-ycp.h +++ b/src/x-ycp.h @@ -21,7 +21,7 @@ { "ycp", "YCP" }, \ #define SCANNERS_YCP \ - { "YCP", scan_ycp_file, &formatstring_ycp }, \ + { "YCP", extract_ycp, &formatstring_ycp }, \ /* Scan an YCP file and add its translatable strings to mdlp. */ extern void extract_ycp PARAMS ((FILE *fp, const char *real_filename, diff --git a/src/xgettext.c b/src/xgettext.c index 3f17d24f9..e2e11c1cb 100644 --- a/src/xgettext.c +++ b/src/xgettext.c @@ -150,6 +150,14 @@ static const struct option long_options[] = }; +/* The extractors must all be functions returning void and taking three + arguments designating the input stream and one message domain list argument + in which to add the messages. */ +typedef void (*extractor_func) PARAMS ((FILE *fp, const char *real_filename, + const char *logical_filename, + msgdomain_list_ty *mdlp)); + + /* Prototypes for local functions. Needed to ensure compiler checking of function argument counts despite of K&R C function definition syntax. */ static void usage PARAMS ((int status)) @@ -167,26 +175,13 @@ static void exclude_directive_message PARAMS ((po_ty *pop, char *msgid, static void read_exclusion_file PARAMS ((char *file_name)); static FILE *xgettext_open PARAMS ((const char *fn, char **logical_file_name_p, char **real_file_name_p)); -static void scan_c_file PARAMS ((const char *file_name, - msgdomain_list_ty *mdlp)); -static void scan_po_file PARAMS ((const char *file_name, - msgdomain_list_ty *mdlp)); -static void scan_java_file PARAMS ((const char *file_name, - msgdomain_list_ty *mdlp)); -static void scan_ycp_file PARAMS ((const char *file_name, - msgdomain_list_ty *mdlp)); -static void scan_rst_file PARAMS ((const char *file_name, - msgdomain_list_ty *mdlp)); +static void extract_from_file PARAMS ((const char *file_name, + extractor_func extractor, + msgdomain_list_ty *mdlp)); static long difftm PARAMS ((const struct tm *a, const struct tm *b)); static message_ty *construct_header PARAMS ((void)); - - -/* The scanners must all be functions returning void and taking one - string argument and a message list argument. */ -typedef void (*scanner_fp) PARAMS ((const char *, msgdomain_list_ty *)); - -static scanner_fp language_to_scanner PARAMS ((const char *)); -static const char *extension_to_language PARAMS ((const char *)); +static extractor_func language_to_extractor PARAMS ((const char *name)); +static const char *extension_to_language PARAMS ((const char *extension)); int @@ -206,7 +201,7 @@ main (argc, argv) const char *files_from = NULL; string_list_ty *file_list; char *output_file = NULL; - scanner_fp scanner = NULL; + extractor_func extractor = NULL; /* Set program name for messages. */ set_program_name (argv[0]); @@ -252,7 +247,7 @@ main (argc, argv) } break; case 'C': - scanner = language_to_scanner ("C++"); + extractor = language_to_extractor ("C++"); break; case 'd': default_domain = optarg; @@ -295,7 +290,7 @@ main (argc, argv) /* Accepted for backward compatibility with 0.10.35. */ break; case 'L': - scanner = language_to_scanner (optarg); + extractor = language_to_extractor (optarg); break; case 'm': /* -m takes an optional argument. If none is given "" is assumed. */ @@ -446,18 +441,18 @@ xgettext cannot work without keywords to look for")); /* Read in the old messages, so that we can add to them. */ if (join_existing) - scan_po_file (file_name, mdlp); + extract_from_file (file_name, extract_po, mdlp); /* Process all input files. */ for (cnt = 0; cnt < file_list->nitems; ++cnt) { const char *fname; - scanner_fp scan_file; + extractor_func this_file_extractor; fname = file_list->item[cnt]; - if (scanner) - scan_file = scanner; + if (extractor) + this_file_extractor = extractor; else { const char *extension; @@ -473,7 +468,7 @@ xgettext cannot work without keywords to look for")); else extension = ""; - /* derive the language from the extension, and the scanner + /* Derive the language from the extension, and the extractor function from the language. */ language = extension_to_language (extension); if (language == NULL) @@ -482,11 +477,11 @@ xgettext cannot work without keywords to look for")); warning: file `%s' extension `%s' is unknown; will try C"), fname, extension); language = "C"; } - scan_file = language_to_scanner (language); + this_file_extractor = language_to_extractor (language); } - /* Scan the file. */ - scan_file (fname, mdlp); + /* Extract the strings from the file. */ + extract_from_file (fname, this_file_extractor, mdlp); } string_list_free (file_list); @@ -781,6 +776,25 @@ error while opening \"%s\" for reading"), new_name); } +static void +extract_from_file (file_name, extractor, mdlp) + const char *file_name; + extractor_func extractor; + msgdomain_list_ty *mdlp; +{ + char *logical_file_name; + char *real_file_name; + FILE *fp = xgettext_open (file_name, &logical_file_name, &real_file_name); + + extractor (fp, real_file_name, logical_file_name, mdlp); + + if (fp != stdin) + fclose (fp); + free (logical_file_name); + free (real_file_name); +} + + /* Language dependent format string parser. NULL if the language has no notion of format strings. */ @@ -1003,98 +1017,6 @@ remember_a_message_plural (mp, string, pos) } -static void -scan_c_file (file_name, mdlp) - const char *file_name; - msgdomain_list_ty *mdlp; -{ - char *logical_file_name; - char *real_file_name; - FILE *fp = xgettext_open (file_name, &logical_file_name, &real_file_name); - - extract_c (fp, real_file_name, logical_file_name, mdlp); - - if (fp != stdin) - fclose (fp); - free (logical_file_name); - free (real_file_name); -} - - -/* Read the contents of the specified .po file into a message list. */ - -static void -scan_po_file (file_name, mdlp) - const char *file_name; - msgdomain_list_ty *mdlp; -{ - char *logical_filename; - char *real_filename; - FILE *fp = xgettext_open (file_name, &logical_filename, &real_filename); - - extract_po (fp, real_filename, logical_filename, mdlp); - - if (fp != stdin) - fclose (fp); - free (logical_filename); - free (real_filename); -} - - -static void -scan_java_file (file_name, mdlp) - const char *file_name; - msgdomain_list_ty *mdlp; -{ - char *logical_file_name; - char *real_file_name; - FILE *fp = xgettext_open (file_name, &logical_file_name, &real_file_name); - - extract_java (fp, real_file_name, logical_file_name, mdlp); - - if (fp != stdin) - fclose (fp); - free (logical_file_name); - free (real_file_name); -} - - -static void -scan_ycp_file (file_name, mdlp) - const char *file_name; - msgdomain_list_ty *mdlp; -{ - char *logical_file_name; - char *real_file_name; - FILE *fp = xgettext_open (file_name, &logical_file_name, &real_file_name); - - extract_ycp (fp, real_file_name, logical_file_name, mdlp); - - if (fp != stdin) - fclose (fp); - free (logical_file_name); - free (real_file_name); -} - - -static void -scan_rst_file (file_name, mdlp) - const char *file_name; - msgdomain_list_ty *mdlp; -{ - char *logical_file_name; - char *real_file_name; - FILE *fp = xgettext_open (file_name, &logical_file_name, &real_file_name); - - extract_rst (fp, real_file_name, logical_file_name, mdlp); - - if (fp != stdin) - fclose (fp); - free (logical_file_name); - free (real_file_name); -} - - #define TM_YEAR_ORIGIN 1900 /* Yield A - B, measured in seconds. */ @@ -1181,15 +1103,15 @@ FIRST AUTHOR , YEAR.\n"); #define ENDOF(a) ((a) + SIZEOF(a)) -static scanner_fp -language_to_scanner (name) +static extractor_func +language_to_extractor (name) const char *name; { typedef struct table_ty table_ty; struct table_ty { const char *name; - scanner_fp func; + extractor_func func; struct formatstring_parser *formatstring_parser; }; @@ -1200,8 +1122,8 @@ language_to_scanner (name) SCANNERS_JAVA SCANNERS_YCP SCANNERS_RST - { "Python", scan_c_file, &formatstring_python }, - { "Lisp", scan_c_file, &formatstring_lisp }, + { "Python", extract_c, &formatstring_python }, + { "Lisp", extract_c, &formatstring_lisp }, /* Here will follow more languages and their scanners: awk, perl, etc... Make sure new scanners honor the --exclude-file option. */ };