Home | History | Annotate | Line # | Download | only in printf
      1 /* Internal function for converting integers to ASCII.
      2    Copyright (C) 1994,95,96,97,98,99,2002,2003 Free Software Foundation, Inc.
      3    This file is part of the GNU C Library.
      4 
      5    The GNU C Library is free software; you can redistribute it and/or
      6    modify it under the terms of the GNU Lesser General Public
      7    License as published by the Free Software Foundation; either
      8    version 2.1 of the License, or (at your option) any later version.
      9 
     10    The GNU C Library 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 GNU
     13    Lesser General Public License for more details.
     14 
     15    You should have received a copy of the GNU Lesser General Public
     16    License along with the GNU C Library; if not, write to the Free
     17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     18    02111-1307 USA.  */
     19 
     20 #ifndef _ITOWA_H
     21 #define _ITOWA_H	1
     22 
     23 /* Convert VALUE into ASCII in base BASE (2..16).
     24    Write backwards starting the character just before BUFLIM.
     25    Return the address of the first (left-to-right) character in the number.
     26    Use upper case letters iff UPPER_CASE is nonzero.  */
     27 
     28 static const wchar_t _itowa_lower_digits[16] = L_("0123456789abcdef");
     29 static const wchar_t _itowa_upper_digits[16] = L_("0123456789ABCDEF");
     30 
     31 static inline wchar_t *
     32 __attribute__ ((unused, always_inline))
     33 _itowa_word (unsigned long value, wchar_t *buflim,
     34 	     unsigned int base, int upper_case)
     35 {
     36   const wchar_t *digits = (upper_case
     37 			   ? _itowa_upper_digits : _itowa_lower_digits);
     38   wchar_t *bp = buflim;
     39 
     40   switch (base)
     41     {
     42 #define SPECIAL(Base)							      \
     43     case Base:								      \
     44       do								      \
     45 	*--bp = digits[value % Base];					      \
     46       while ((value /= Base) != 0);					      \
     47       break
     48 
     49       SPECIAL (10);
     50       SPECIAL (16);
     51       SPECIAL (8);
     52     default:
     53       do
     54 	*--bp = digits[value % base];
     55       while ((value /= base) != 0);
     56     }
     57   return bp;
     58 }
     59 
     60 static inline wchar_t *
     61 __attribute__ ((unused, always_inline))
     62 _itowa (uint64_t value, wchar_t *buflim,
     63 	unsigned int base, int upper_case)
     64 {
     65   const wchar_t *digits = (upper_case
     66 			   ? _itowa_upper_digits : _itowa_lower_digits);
     67   wchar_t *bp = buflim;
     68 
     69   switch (base)
     70     {
     71       SPECIAL (10);
     72       SPECIAL (16);
     73       SPECIAL (8);
     74     default:
     75       do
     76 	*--bp = digits[value % base];
     77       while ((value /= base) != 0);
     78     }
     79   return bp;
     80 }
     81 #undef SPECIAL
     82 
     83 #endif	/* itowa.h */
     84