(root)/
gettext-0.22.4/
gettext-tools/
src/
format.h
       1  /* Format strings.
       2     Copyright (C) 2001-2010, 2012-2013, 2015, 2019-2020, 2023 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 3 of the License, or
       8     (at your option) 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, see <https://www.gnu.org/licenses/>.  */
      17  
      18  #ifndef _FORMAT_H
      19  #define _FORMAT_H
      20  
      21  #include <stdbool.h>
      22  #include <stdlib.h>     /* because Gnulib's <stdlib.h> may '#define free ...' */
      23  
      24  #include "pos.h"        /* Get lex_pos_ty.  */
      25  #include "message.h"    /* Get NFORMATS.  */
      26  #include "plural-distrib.h" /* Get struct plural_distribution.  */
      27  #include "error.h"      /* Get fallback definition of __attribute__.  */
      28  
      29  
      30  #ifdef __cplusplus
      31  extern "C" {
      32  #endif
      33  
      34  
      35  /* These indicators are set by the parse function at the appropriate
      36     positions.  */
      37  enum
      38  {
      39    /* Set on the first byte of a format directive.  */
      40    FMTDIR_START  = 1 << 0,
      41    /* Set on the last byte of a format directive.  */
      42    FMTDIR_END    = 1 << 1,
      43    /* Set on the last byte of an invalid format directive, where a parse error
      44       was recognized.  */
      45    FMTDIR_ERROR  = 1 << 2
      46  };
      47  
      48  /* Macro for use inside a parser:
      49     Sets an indicator at the position corresponding to PTR.
      50     Assumes local variables 'fdi' and 'format_start' are defined.  */
      51  #define FDI_SET(ptr, flag) \
      52    if (fdi != NULL) \
      53      fdi[(ptr) - format_start] |= (flag)/*;*/
      54  
      55  /* This type of callback is responsible for showing an error.  */
      56  typedef void (*formatstring_error_logger_t) (const char *format, ...)
      57  #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
      58       __attribute__ ((__format__ (__printf__, 1, 2)))
      59  #endif
      60  ;
      61  
      62  /* This structure describes a format string parser for a language.  */
      63  struct formatstring_parser
      64  {
      65    /* Parse the given string as a format string.
      66       If translated is true, some extensions available only to msgstr but not
      67       to msgid strings are recognized.
      68       If fdi is non-NULL, it must be a an array of strlen (string) zero bytes.
      69       Return a freshly allocated structure describing
      70         1. the argument types/names needed for the format string,
      71         2. the total number of format directives.
      72       Return NULL if the string is not a valid format string. In this case,
      73       also set *invalid_reason to an error message explaining why.
      74       In both cases, set FMTDIR_* bits at the appropriate positions in fdi.  */
      75    void * (*parse) (const char *string, bool translated, char *fdi, char **invalid_reason);
      76  
      77    /* Free a format string descriptor, returned by parse().  */
      78    void (*free) (void *descr);
      79  
      80    /* Return the number of format directives.
      81       A string that can be output literally has 0 format directives.  */
      82    int (*get_number_of_directives) (void *descr);
      83  
      84    /* Return true if the format string, although valid, contains directives that
      85       make it appear unlikely that the string was meant as a format string.
      86       A NULL function is equivalent to a function that always returns false.  */
      87    bool (*is_unlikely_intentional) (void *descr);
      88  
      89    /* Verify that the argument types/names in msgid_descr and those in
      90       msgstr_descr are the same (if equality=true), or (if equality=false)
      91       that those of msgid_descr extend those of msgstr_descr (i.e.
      92       msgstr_descr may omit some of the arguments of msgid_descr).
      93       If not, signal an error using error_logger (only if error_logger != NULL)
      94       and return true.  Otherwise return false.  */
      95    bool (*check) (void *msgid_descr, void *msgstr_descr, bool equality, formatstring_error_logger_t error_logger, const char *pretty_msgid, const char *pretty_msgstr);
      96  };
      97  
      98  /* Format string parsers, each defined in its own file.  */
      99  extern DLL_VARIABLE struct formatstring_parser formatstring_c;
     100  extern DLL_VARIABLE struct formatstring_parser formatstring_objc;
     101  extern DLL_VARIABLE struct formatstring_parser formatstring_cplusplus_brace;
     102  extern DLL_VARIABLE struct formatstring_parser formatstring_python;
     103  extern DLL_VARIABLE struct formatstring_parser formatstring_python_brace;
     104  extern DLL_VARIABLE struct formatstring_parser formatstring_java;
     105  extern DLL_VARIABLE struct formatstring_parser formatstring_java_printf;
     106  extern DLL_VARIABLE struct formatstring_parser formatstring_csharp;
     107  extern DLL_VARIABLE struct formatstring_parser formatstring_javascript;
     108  extern DLL_VARIABLE struct formatstring_parser formatstring_scheme;
     109  extern DLL_VARIABLE struct formatstring_parser formatstring_lisp;
     110  extern DLL_VARIABLE struct formatstring_parser formatstring_elisp;
     111  extern DLL_VARIABLE struct formatstring_parser formatstring_librep;
     112  extern DLL_VARIABLE struct formatstring_parser formatstring_ruby;
     113  extern DLL_VARIABLE struct formatstring_parser formatstring_sh;
     114  extern DLL_VARIABLE struct formatstring_parser formatstring_awk;
     115  extern DLL_VARIABLE struct formatstring_parser formatstring_lua;
     116  extern DLL_VARIABLE struct formatstring_parser formatstring_pascal;
     117  extern DLL_VARIABLE struct formatstring_parser formatstring_smalltalk;
     118  extern DLL_VARIABLE struct formatstring_parser formatstring_qt;
     119  extern DLL_VARIABLE struct formatstring_parser formatstring_qt_plural;
     120  extern DLL_VARIABLE struct formatstring_parser formatstring_kde;
     121  extern DLL_VARIABLE struct formatstring_parser formatstring_kde_kuit;
     122  extern DLL_VARIABLE struct formatstring_parser formatstring_boost;
     123  extern DLL_VARIABLE struct formatstring_parser formatstring_tcl;
     124  extern DLL_VARIABLE struct formatstring_parser formatstring_perl;
     125  extern DLL_VARIABLE struct formatstring_parser formatstring_perl_brace;
     126  extern DLL_VARIABLE struct formatstring_parser formatstring_php;
     127  extern DLL_VARIABLE struct formatstring_parser formatstring_gcc_internal;
     128  extern DLL_VARIABLE struct formatstring_parser formatstring_gfc_internal;
     129  extern DLL_VARIABLE struct formatstring_parser formatstring_ycp;
     130  
     131  /* Table of all format string parsers.  */
     132  extern DLL_VARIABLE struct formatstring_parser *formatstring_parsers[NFORMATS];
     133  
     134  /* Returns an array of the ISO C 99 <inttypes.h> format directives and other
     135     format flags or directives with a system dependent expansion contained in
     136     the argument string.  *intervalsp is assigned to a freshly allocated array
     137     of intervals (startpos pointing to '<', endpos to the character after '>'),
     138     and *lengthp is assigned to the number of intervals in this array.  */
     139  struct interval
     140  {
     141    size_t startpos;
     142    size_t endpos;
     143  };
     144  extern void
     145         get_sysdep_c_format_directives (const char *string, bool translated,
     146                                   struct interval **intervalsp, size_t *lengthp);
     147  
     148  /* Returns the number of unnamed arguments consumed by a Python format
     149     string.  */
     150  extern unsigned int get_python_format_unnamed_arg_count (const char *string);
     151  
     152  /* Check whether both formats strings contain compatible format
     153     specifications for format type i (0 <= i < NFORMATS).
     154     Return the number of errors that were seen.  */
     155  extern int
     156         check_msgid_msgstr_format_i (const char *msgid, const char *msgid_plural,
     157                                      const char *msgstr, size_t msgstr_len,
     158                                      size_t i,
     159                                      struct argument_range range,
     160                                      const struct plural_distribution *distribution,
     161                                      formatstring_error_logger_t error_logger);
     162  
     163  /* Check whether both formats strings contain compatible format
     164     specifications.
     165     Return the number of errors that were seen.  */
     166  extern int
     167         check_msgid_msgstr_format (const char *msgid, const char *msgid_plural,
     168                                    const char *msgstr, size_t msgstr_len,
     169                                    const enum is_format is_format[NFORMATS],
     170                                    struct argument_range range,
     171                                    const struct plural_distribution *distribution,
     172                                    formatstring_error_logger_t error_logger);
     173  
     174  
     175  #ifdef __cplusplus
     176  }
     177  #endif
     178  
     179  
     180  #endif /* _FORMAT_H */