"Fossies" - the Fresh Open Source Software Archive

Member "cpio-2.13/gnu/printf-parse.h" (2 Jan 2017, 5235 Bytes) of package /linux/misc/cpio-2.13.tar.bz2:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "printf-parse.h" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 2.12_vs_2.13.

    1 /* Parse printf format string.
    2    Copyright (C) 1999, 2002-2003, 2005, 2007, 2010-2017 Free Software
    3    Foundation, Inc.
    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, 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 along
   16    with this program; if not, see <http://www.gnu.org/licenses/>.  */
   17 
   18 #ifndef _PRINTF_PARSE_H
   19 #define _PRINTF_PARSE_H
   20 
   21 /* This file can be parametrized with the following macros:
   22      ENABLE_UNISTDIO    Set to 1 to enable the unistdio extensions.
   23      STATIC             Set to 'static' to declare the function static.  */
   24 
   25 #if HAVE_FEATURES_H
   26 # include <features.h> /* for __GLIBC__, __UCLIBC__ */
   27 #endif
   28 
   29 #include "printf-args.h"
   30 
   31 
   32 /* Flags */
   33 #define FLAG_GROUP       1      /* ' flag */
   34 #define FLAG_LEFT        2      /* - flag */
   35 #define FLAG_SHOWSIGN    4      /* + flag */
   36 #define FLAG_SPACE       8      /* space flag */
   37 #define FLAG_ALT        16      /* # flag */
   38 #define FLAG_ZERO       32
   39 #if __GLIBC__ >= 2 && !defined __UCLIBC__
   40 # define FLAG_LOCALIZED 64      /* I flag, uses localized digits */
   41 #endif
   42 
   43 /* arg_index value indicating that no argument is consumed.  */
   44 #define ARG_NONE        (~(size_t)0)
   45 
   46 /* xxx_directive: A parsed directive.
   47    xxx_directives: A parsed format string.  */
   48 
   49 /* Number of directly allocated directives (no malloc() needed).  */
   50 #define N_DIRECT_ALLOC_DIRECTIVES 7
   51 
   52 /* A parsed directive.  */
   53 typedef struct
   54 {
   55   const char* dir_start;
   56   const char* dir_end;
   57   int flags;
   58   const char* width_start;
   59   const char* width_end;
   60   size_t width_arg_index;
   61   const char* precision_start;
   62   const char* precision_end;
   63   size_t precision_arg_index;
   64   char conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
   65   size_t arg_index;
   66 }
   67 char_directive;
   68 
   69 /* A parsed format string.  */
   70 typedef struct
   71 {
   72   size_t count;
   73   char_directive *dir;
   74   size_t max_width_length;
   75   size_t max_precision_length;
   76   char_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
   77 }
   78 char_directives;
   79 
   80 #if ENABLE_UNISTDIO
   81 
   82 /* A parsed directive.  */
   83 typedef struct
   84 {
   85   const uint8_t* dir_start;
   86   const uint8_t* dir_end;
   87   int flags;
   88   const uint8_t* width_start;
   89   const uint8_t* width_end;
   90   size_t width_arg_index;
   91   const uint8_t* precision_start;
   92   const uint8_t* precision_end;
   93   size_t precision_arg_index;
   94   uint8_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
   95   size_t arg_index;
   96 }
   97 u8_directive;
   98 
   99 /* A parsed format string.  */
  100 typedef struct
  101 {
  102   size_t count;
  103   u8_directive *dir;
  104   size_t max_width_length;
  105   size_t max_precision_length;
  106   u8_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
  107 }
  108 u8_directives;
  109 
  110 /* A parsed directive.  */
  111 typedef struct
  112 {
  113   const uint16_t* dir_start;
  114   const uint16_t* dir_end;
  115   int flags;
  116   const uint16_t* width_start;
  117   const uint16_t* width_end;
  118   size_t width_arg_index;
  119   const uint16_t* precision_start;
  120   const uint16_t* precision_end;
  121   size_t precision_arg_index;
  122   uint16_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
  123   size_t arg_index;
  124 }
  125 u16_directive;
  126 
  127 /* A parsed format string.  */
  128 typedef struct
  129 {
  130   size_t count;
  131   u16_directive *dir;
  132   size_t max_width_length;
  133   size_t max_precision_length;
  134   u16_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
  135 }
  136 u16_directives;
  137 
  138 /* A parsed directive.  */
  139 typedef struct
  140 {
  141   const uint32_t* dir_start;
  142   const uint32_t* dir_end;
  143   int flags;
  144   const uint32_t* width_start;
  145   const uint32_t* width_end;
  146   size_t width_arg_index;
  147   const uint32_t* precision_start;
  148   const uint32_t* precision_end;
  149   size_t precision_arg_index;
  150   uint32_t conversion; /* d i o u x X f F e E g G a A c s p n U % but not C S */
  151   size_t arg_index;
  152 }
  153 u32_directive;
  154 
  155 /* A parsed format string.  */
  156 typedef struct
  157 {
  158   size_t count;
  159   u32_directive *dir;
  160   size_t max_width_length;
  161   size_t max_precision_length;
  162   u32_directive direct_alloc_dir[N_DIRECT_ALLOC_DIRECTIVES];
  163 }
  164 u32_directives;
  165 
  166 #endif
  167 
  168 
  169 /* Parses the format string.  Fills in the number N of directives, and fills
  170    in directives[0], ..., directives[N-1], and sets directives[N].dir_start
  171    to the end of the format string.  Also fills in the arg_type fields of the
  172    arguments and the needed count of arguments.  */
  173 #if ENABLE_UNISTDIO
  174 extern int
  175        ulc_printf_parse (const char *format, char_directives *d, arguments *a);
  176 extern int
  177        u8_printf_parse (const uint8_t *format, u8_directives *d, arguments *a);
  178 extern int
  179        u16_printf_parse (const uint16_t *format, u16_directives *d,
  180                          arguments *a);
  181 extern int
  182        u32_printf_parse (const uint32_t *format, u32_directives *d,
  183                          arguments *a);
  184 #else
  185 # ifdef STATIC
  186 STATIC
  187 # else
  188 extern
  189 # endif
  190 int printf_parse (const char *format, char_directives *d, arguments *a);
  191 #endif
  192 
  193 #endif /* _PRINTF_PARSE_H */