1 /* Format strings. 2 Copyright (C) 2001-2006 Free Software Foundation, Inc. 3 Written by Bruno Haible <haible@clisp.cons.org>, 2001. 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 _FORMAT_H 20 #define _FORMAT_H 21 22 #include <stdbool.h> 23 24 #include "pos.h" /* Get lex_pos_ty. */ 25 #include "message.h" /* Get NFORMATS. */ 26 #include "error.h" /* Get fallback definition of __attribute__. */ 27 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 34 /* This type of callback is responsible for showing an error. */ 35 typedef void (*formatstring_error_logger_t) (const char *format, ...) 36 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) 37 __attribute__ ((__format__ (__printf__, 1, 2))) 38 #endif 39 ; 40 41 /* This structure describes a format string parser for a language. */ 42 struct formatstring_parser 43 { 44 /* Parse the given string as a format string. 45 If translated is true, some extensions available only to msgstr but not 46 to msgid strings are recognized. 47 Return a freshly allocated structure describing 48 1. the argument types/names needed for the format string, 49 2. the total number of format directives. 50 Return NULL if the string is not a valid format string. In this case, 51 also set *invalid_reason to an error message explaining why. */ 52 void * (*parse) (const char *string, bool translated, char **invalid_reason); 53 54 /* Free a format string descriptor, returned by parse(). */ 55 void (*free) (void *descr); 56 57 /* Return the number of format directives. 58 A string that can be output literally has 0 format directives. */ 59 int (*get_number_of_directives) (void *descr); 60 61 /* Return true if the format string, although valid, contains directives that 62 make it appear unlikely that the string was meant as a format string. 63 A NULL function is equivalent to a function that always returns false. */ 64 bool (*is_unlikely_intentional) (void *descr); 65 66 /* Verify that the argument types/names in msgid_descr and those in 67 msgstr_descr are the same (if equality=true), or (if equality=false) 68 that those of msgid_descr extend those of msgstr_descr (i.e. 69 msgstr_descr may omit some of the arguments of msgid_descr). 70 If not, signal an error using error_logger (only if error_logger != NULL) 71 and return true. Otherwise return false. */ 72 bool (*check) (void *msgid_descr, void *msgstr_descr, bool equality, formatstring_error_logger_t error_logger, const char *pretty_msgstr); 73 }; 74 75 /* Format string parsers, each defined in its own file. */ 76 extern DLL_VARIABLE struct formatstring_parser formatstring_c; 77 extern DLL_VARIABLE struct formatstring_parser formatstring_objc; 78 extern DLL_VARIABLE struct formatstring_parser formatstring_sh; 79 extern DLL_VARIABLE struct formatstring_parser formatstring_python; 80 extern DLL_VARIABLE struct formatstring_parser formatstring_lisp; 81 extern DLL_VARIABLE struct formatstring_parser formatstring_elisp; 82 extern DLL_VARIABLE struct formatstring_parser formatstring_librep; 83 extern DLL_VARIABLE struct formatstring_parser formatstring_scheme; 84 extern DLL_VARIABLE struct formatstring_parser formatstring_smalltalk; 85 extern DLL_VARIABLE struct formatstring_parser formatstring_java; 86 extern DLL_VARIABLE struct formatstring_parser formatstring_csharp; 87 extern DLL_VARIABLE struct formatstring_parser formatstring_awk; 88 extern DLL_VARIABLE struct formatstring_parser formatstring_pascal; 89 extern DLL_VARIABLE struct formatstring_parser formatstring_ycp; 90 extern DLL_VARIABLE struct formatstring_parser formatstring_tcl; 91 extern DLL_VARIABLE struct formatstring_parser formatstring_perl; 92 extern DLL_VARIABLE struct formatstring_parser formatstring_perl_brace; 93 extern DLL_VARIABLE struct formatstring_parser formatstring_php; 94 extern DLL_VARIABLE struct formatstring_parser formatstring_gcc_internal; 95 extern DLL_VARIABLE struct formatstring_parser formatstring_qt; 96 extern DLL_VARIABLE struct formatstring_parser formatstring_boost; 97 98 /* Table of all format string parsers. */ 99 extern DLL_VARIABLE struct formatstring_parser *formatstring_parsers[NFORMATS]; 100 101 /* Returns an array of the ISO C 99 <inttypes.h> format directives and other 102 format flags or directives with a system dependent expansion contained in 103 the argument string. *intervalsp is assigned to a freshly allocated array 104 of intervals (startpos pointing to '<', endpos to the character after '>'), 105 and *lengthp is assigned to the number of intervals in this array. */ 106 struct interval 107 { 108 size_t startpos; 109 size_t endpos; 110 }; 111 extern void 112 get_sysdep_c_format_directives (const char *string, bool translated, 113 struct interval **intervalsp, size_t *lengthp); 114 115 /* Returns the number of unnamed arguments consumed by a Python format 116 string. */ 117 extern unsigned int get_python_format_unnamed_arg_count (const char *string); 118 119 /* Check whether both formats strings contain compatible format 120 specifications. 121 PLURAL_DISTRIBUTION is either NULL or an array of nplurals elements, 122 PLURAL_DISTRIBUTION[j] being true if the value j appears to be assumed 123 infinitely often by the plural formula. 124 Return the number of errors that were seen. */ 125 extern int 126 check_msgid_msgstr_format (const char *msgid, const char *msgid_plural, 127 const char *msgstr, size_t msgstr_len, 128 const enum is_format is_format[NFORMATS], 129 const unsigned char *plural_distribution, 130 formatstring_error_logger_t error_logger); 131 132 133 #ifdef __cplusplus 134 } 135 #endif 136 137 138 #endif /* _FORMAT_H */ 139