xref: /netbsd-src/external/gpl2/gettext/dist/gettext-tools/src/read-catalog.h (revision 946379e7b37692fc43f68eb0d1c10daa0a7f3b6c)
1 /* Reading PO files.
2    Copyright (C) 1995-1998, 2000-2003, 2005-2006 Free Software Foundation, Inc.
3    This file was written by Bruno Haible <haible@clisp.cons.org>.
4 
5    This program is free software; you can redistribute it and/or modify
6    it under the terms of the GNU General Public License as published by
7    the Free Software Foundation; either version 2, or (at your option)
8    any later version.
9 
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14 
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software Foundation,
17    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
18 
19 #ifndef _READ_CATALOG_H
20 #define _READ_CATALOG_H
21 
22 #include "message.h"
23 #include "read-catalog-abstract.h"
24 
25 #include <stdbool.h>
26 #include <stdio.h>
27 
28 
29 /* For including this file in C++ mode.  */
30 #ifdef __cplusplus
31 # define this thiss
32 #endif
33 
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 
38 
39 /* The following pair of structures cooperate to create a derived class from
40    class abstract_catalog_reader_ty.  (See read-catalog-abstract.h for an
41    explanation.)  It implements the default behaviour of reading a PO file
42    and converting it to an 'msgdomain_list_ty *'.  */
43 
44 /* Forward declaration.  */
45 struct default_catalog_reader_ty;
46 
47 
48 typedef struct default_catalog_reader_class_ty default_catalog_reader_class_ty;
49 struct default_catalog_reader_class_ty
50 {
51   /* Methods inherited from superclass.  */
52   struct abstract_catalog_reader_class_ty super;
53 
54   /* How to change the current domain.  */
55   void (*set_domain) (struct default_catalog_reader_ty *pop, char *name);
56 
57   /* How to add a message to the list.  */
58   void (*add_message) (struct default_catalog_reader_ty *pop,
59 		       char *msgctxt,
60 		       char *msgid, lex_pos_ty *msgid_pos, char *msgid_plural,
61 		       char *msgstr, size_t msgstr_len, lex_pos_ty *msgstr_pos,
62 		       char *prev_msgctxt,
63 		       char *prev_msgid,
64 		       char *prev_msgid_plural,
65 		       bool force_fuzzy, bool obsolete);
66 
67   /* How to modify a new message before adding it to the list.  */
68   void (*frob_new_message) (struct default_catalog_reader_ty *pop,
69 			    message_ty *mp,
70 			    const lex_pos_ty *msgid_pos,
71 			    const lex_pos_ty *msgstr_pos);
72 };
73 
74 
75 #define DEFAULT_CATALOG_READER_TY \
76   ABSTRACT_CATALOG_READER_TY						\
77 									\
78   /* If true, pay attention to comments and filepos comments.  */	\
79   bool handle_comments;							\
80 									\
81   /* If true, remember comments for file name and line number for each	\
82      msgid, if present in the reference input.  */			\
83   bool handle_filepos_comments;						\
84 									\
85   /* If false, domain directives lead to an error messsage.  */		\
86   bool allow_domain_directives;						\
87 									\
88   /* If false, duplicate msgids in the same domain and file generate an	\
89      error.  If true, such msgids are allowed; the caller should treat	\
90      them appropriately.  */						\
91   bool allow_duplicates;						\
92 									\
93   /* If true, allow duplicates if they have the same translation.  */	\
94   bool allow_duplicates_if_same_msgstr;					\
95 									\
96   /* List of messages already appeared in the current file.  */		\
97   msgdomain_list_ty *mdlp;						\
98 									\
99   /* Name of domain we are currently examining.  */			\
100   const char *domain;							\
101 									\
102   /* List of messages belonging to the current domain.  */		\
103   message_list_ty *mlp;							\
104 									\
105   /* Accumulate comments for next message directive.  */		\
106   string_list_ty *comment;						\
107   string_list_ty *comment_dot;						\
108 									\
109   /* Accumulate filepos comments for the next message directive.  */	\
110   size_t filepos_count;							\
111   lex_pos_ty *filepos;							\
112 									\
113   /* Flags transported in special comments.  */				\
114   bool is_fuzzy;							\
115   enum is_format is_format[NFORMATS];					\
116   enum is_wrap do_wrap;							\
117 
118 typedef struct default_catalog_reader_ty default_catalog_reader_ty;
119 struct default_catalog_reader_ty
120 {
121   DEFAULT_CATALOG_READER_TY
122 };
123 
124 extern void default_constructor (abstract_catalog_reader_ty *that);
125 extern void default_destructor (abstract_catalog_reader_ty *that);
126 extern void default_parse_brief (abstract_catalog_reader_ty *that);
127 extern void default_parse_debrief (abstract_catalog_reader_ty *that);
128 extern void default_directive_domain (abstract_catalog_reader_ty *that,
129 				      char *name);
130 extern void default_directive_message (abstract_catalog_reader_ty *that,
131 				       char *msgctxt,
132 				       char *msgid,
133 				       lex_pos_ty *msgid_pos,
134 				       char *msgid_plural,
135 				       char *msgstr, size_t msgstr_len,
136 				       lex_pos_ty *msgstr_pos,
137 				       char *prev_msgctxt,
138 				       char *prev_msgid,
139 				       char *prev_msgid_plural,
140 				       bool force_fuzzy, bool obsolete);
141 extern void default_comment (abstract_catalog_reader_ty *that, const char *s);
142 extern void default_comment_dot (abstract_catalog_reader_ty *that,
143 				 const char *s);
144 extern void default_comment_filepos (abstract_catalog_reader_ty *that,
145 				     const char *name, size_t line);
146 extern void default_comment_special (abstract_catalog_reader_ty *that,
147 				     const char *s);
148 extern void default_set_domain (default_catalog_reader_ty *this, char *name);
149 extern void default_add_message (default_catalog_reader_ty *this,
150 				 char *msgctxt,
151 				 char *msgid,
152 				 lex_pos_ty *msgid_pos,
153 				 char *msgid_plural,
154 				 char *msgstr, size_t msgstr_len,
155 				 lex_pos_ty *msgstr_pos,
156 				 char *prev_msgctxt,
157 				 char *prev_msgid,
158 				 char *prev_msgid_plural,
159 				 bool force_fuzzy, bool obsolete);
160 
161 /* Allocate a fresh default_catalog_reader_ty (or derived class) instance and
162    call its constructor.  */
163 extern default_catalog_reader_ty *
164        default_catalog_reader_alloc (default_catalog_reader_class_ty *method_table);
165 
166 
167 /* If nonzero, remember comments for file name and line number for each
168    msgid, if present in the reference input.  Defaults to true.  */
169 extern DLL_VARIABLE int line_comment;
170 
171 /* If false, duplicate msgids in the same domain and file generate an error.
172    If true, such msgids are allowed; the caller should treat them
173    appropriately.  Defaults to false.  */
174 extern DLL_VARIABLE bool allow_duplicates;
175 
176 /* Read the input file from a stream.  Returns a list of messages.  */
177 extern msgdomain_list_ty *
178        read_catalog_stream (FILE *fp,
179 			    const char *real_filename,
180 			    const char *logical_filename,
181 			    catalog_input_format_ty input_syntax);
182 
183 /* Read the input file with the name INPUT_NAME.  The ending .po is added
184    if necessary.  If INPUT_NAME is not an absolute file name and the file is
185    not found, the list of directories in "dir-list.h" is searched.  Returns
186    a list of messages.  */
187 extern msgdomain_list_ty *
188        read_catalog_file (const char *input_name,
189 			  catalog_input_format_ty input_syntax);
190 
191 
192 #ifdef __cplusplus
193 }
194 #endif
195 
196 
197 #endif /* _READ_CATALOG_H */
198