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