• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Reading PO files.
2    Copyright (C) 1995-1998, 2000-2003, 2005-2006, 2008-2009, 2014-2015 Free
3    Software Foundation, Inc.
4    This file was written by Bruno Haible <haible@clisp.cons.org>.
5 
6    This program is free software: you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 3 of the License, or
9    (at your option) any later version.
10 
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15 
16    You should have received a copy of the GNU General Public License
17    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
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 false, domain directives lead to an error messsage.  */         \
82   bool allow_domain_directives;                                         \
83                                                                         \
84   /* If false, duplicate msgids in the same domain and file generate an \
85      error.  If true, such msgids are allowed; the caller should treat  \
86      them appropriately.  */                                            \
87   bool allow_duplicates;                                                \
88                                                                         \
89   /* If true, allow duplicates if they have the same translation.  */   \
90   bool allow_duplicates_if_same_msgstr;                                 \
91                                                                         \
92   /* File name used in error messages.  */                              \
93   const char *file_name;                                                \
94                                                                         \
95   /* List of messages already appeared in the current file.  */         \
96   msgdomain_list_ty *mdlp;                                              \
97                                                                         \
98   /* Name of domain we are currently examining.  */                     \
99   const char *domain;                                                   \
100                                                                         \
101   /* List of messages belonging to the current domain.  */              \
102   message_list_ty *mlp;                                                 \
103                                                                         \
104   /* Accumulate comments for next message directive.  */                \
105   string_list_ty *comment;                                              \
106   string_list_ty *comment_dot;                                          \
107                                                                         \
108   /* Accumulate filepos comments for the next message directive.  */    \
109   size_t filepos_count;                                                 \
110   lex_pos_ty *filepos;                                                  \
111                                                                         \
112   /* Flags transported in special comments.  */                         \
113   bool is_fuzzy;                                                        \
114   enum is_format is_format[NFORMATS];                                   \
115   struct argument_range range;                                          \
116   enum is_wrap do_wrap;                                                 \
117   enum is_syntax_check do_syntax_check[NSYNTAXCHECKS];                  \
118 
119 typedef struct default_catalog_reader_ty default_catalog_reader_ty;
120 struct default_catalog_reader_ty
121 {
122   DEFAULT_CATALOG_READER_TY
123 };
124 
125 extern void default_constructor (abstract_catalog_reader_ty *that);
126 extern void default_destructor (abstract_catalog_reader_ty *that);
127 extern void default_parse_brief (abstract_catalog_reader_ty *that);
128 extern void default_parse_debrief (abstract_catalog_reader_ty *that);
129 extern void default_directive_domain (abstract_catalog_reader_ty *that,
130                                       char *name);
131 extern void default_directive_message (abstract_catalog_reader_ty *that,
132                                        char *msgctxt,
133                                        char *msgid,
134                                        lex_pos_ty *msgid_pos,
135                                        char *msgid_plural,
136                                        char *msgstr, size_t msgstr_len,
137                                        lex_pos_ty *msgstr_pos,
138                                        char *prev_msgctxt,
139                                        char *prev_msgid,
140                                        char *prev_msgid_plural,
141                                        bool force_fuzzy, bool obsolete);
142 extern void default_comment (abstract_catalog_reader_ty *that, const char *s);
143 extern void default_comment_dot (abstract_catalog_reader_ty *that,
144                                  const char *s);
145 extern void default_comment_filepos (abstract_catalog_reader_ty *that,
146                                      const char *name, size_t line);
147 extern void default_comment_special (abstract_catalog_reader_ty *that,
148                                      const char *s);
149 extern void default_set_domain (default_catalog_reader_ty *this, char *name);
150 extern void default_add_message (default_catalog_reader_ty *this,
151                                  char *msgctxt,
152                                  char *msgid,
153                                  lex_pos_ty *msgid_pos,
154                                  char *msgid_plural,
155                                  char *msgstr, size_t msgstr_len,
156                                  lex_pos_ty *msgstr_pos,
157                                  char *prev_msgctxt,
158                                  char *prev_msgid,
159                                  char *prev_msgid_plural,
160                                  bool force_fuzzy, bool obsolete);
161 
162 /* Allocate a fresh default_catalog_reader_ty (or derived class) instance and
163    call its constructor.  */
164 extern default_catalog_reader_ty *
165        default_catalog_reader_alloc (default_catalog_reader_class_ty *method_table);
166 
167 
168 /* If false, duplicate msgids in the same domain and file generate an error.
169    If true, such msgids are allowed; the caller should treat them
170    appropriately.  Defaults to false.  */
171 extern DLL_VARIABLE bool allow_duplicates;
172 
173 /* Read the input file from a stream.  Returns a list of messages.  */
174 extern msgdomain_list_ty *
175        read_catalog_stream (FILE *fp,
176                             const char *real_filename,
177                             const char *logical_filename,
178                             catalog_input_format_ty input_syntax);
179 
180 /* Read the input file with the name INPUT_NAME.  The ending .po is added
181    if necessary.  If INPUT_NAME is not an absolute file name and the file is
182    not found, the list of directories in "dir-list.h" is searched.  Returns
183    a list of messages.  */
184 extern msgdomain_list_ty *
185        read_catalog_file (const char *input_name,
186                           catalog_input_format_ty input_syntax);
187 
188 
189 #ifdef __cplusplus
190 }
191 #endif
192 
193 
194 #endif /* _READ_CATALOG_H */
195