All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
xtoa.cpp
Go to the documentation of this file.
1 // $Header: /tmp/svngaudi/tmp.jEpFh25751/Gaudi/GaudiKernel/src/Lib/xtoa.cpp,v 1.3 2003/11/27 10:20:59 mato Exp $
2 #if !defined(_WIN32)
3 #include <stdlib.h>
4 #include <limits.h>
5 #include "GaudiKernel/xtoa.h"
6 
7 /***
8 *xtoa.c - convert integers/longs to ASCII string
9 *
10 * Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.
11 *
12 *Purpose:
13 * The module has code to convert integers/longs to ASCII strings. See
14 *
15 *******************************************************************************/
16 
17 /***
18 *char *_itoa, *_ltoa, *_ultoa(val, buf, radix) - convert binary int to ASCII
19 * string
20 *
21 *Purpose:
22 * Converts an int to a character string.
23 *
24 *Entry:
25 * val - number to be converted (int, long or unsigned long)
26 * int radix - base to convert into
27 * char *buf - ptr to buffer to place result
28 *
29 *Exit:
30 * fills in space pointed to by buf with string result
31 * returns a pointer to this buffer
32 *
33 *Exceptions:
34 *
35 *******************************************************************************/
36 
37 /* helper routine that does the main job. */
38 
39 static void __cdecl xtoa (unsigned long val,char *buf,unsigned radix,int is_neg) {
40  char *p; /* pointer to traverse string */
41  char *firstdig; /* pointer to first digit */
42  char temp; /* temp char */
43  unsigned digval; /* value of digit */
44 
45  p = buf;
46 
47  if (is_neg) {
48  /* negative, so output '-' and negate */
49  *p++ = '-';
50  val = (unsigned long)(-(long)val);
51  }
52 
53  firstdig = p; /* save pointer to first digit */
54 
55  do {
56  digval = (unsigned) (val % radix);
57  val /= radix; /* get next digit */
58 
59  /* convert to ascii and store */
60  if (digval > 9)
61  *p++ = (char) (digval - 10 + 'a'); /* a letter */
62  else
63  *p++ = (char) (digval + '0'); /* a digit */
64  } while (val > 0);
65 
66  /* We now have the digit of the number in the buffer, but in reverse
67  order. Thus we reverse them now. */
68 
69  *p-- = '\0'; /* terminate string; p points to last digit */
70 
71  do {
72  temp = *p;
73  *p = *firstdig;
74  *firstdig = temp; /* swap *p and *firstdig */
75  --p;
76  ++firstdig; /* advance to next two digits */
77  } while (firstdig < p); /* repeat until halfway */
78 }
79 
80 /* Actual functions just call conversion helper with neg flag set correctly,
81  and return pointer to buffer. */
82 
83 extern "C" char * __cdecl _itoa (int val,char *buf,int radix) {
84  if (radix == 10 && val < 0)
85  xtoa((unsigned long)val, buf, radix, 1);
86  else
87  xtoa((unsigned long)(unsigned int)val, buf, radix, 0);
88  return buf;
89 }
90 
91 extern "C" char * __cdecl _ltoa (long val,char *buf,int radix) {
92  xtoa((unsigned long)val, buf, radix, (radix == 10 && val < 0));
93  return buf;
94 }
95 
96 extern "C" char * __cdecl _ultoa (unsigned long val,char *buf,int radix) {
97  xtoa(val, buf, radix, 0);
98  return buf;
99 }
100 
101 #if 0 // ndef _NO_INT64
102 
103 static void __stdcall x64toa ( /* stdcall is faster and smaller... Might as well use it for the helper. */
104  unsigned __int64 val,
105  char *buf,
106  unsigned radix,
107  int is_neg
108  )
109 {
110  char *p; /* pointer to traverse string */
111  char *firstdig; /* pointer to first digit */
112  char temp; /* temp char */
113  unsigned digval; /* value of digit */
114 
115  p = buf;
116 
117  if ( is_neg ) {
118  *p++ = '-'; /* negative, so output '-' and negate */
119  }
120 
121  firstdig = p; /* save pointer to first digit */
122 
123  do {
124  digval = (unsigned) (val % radix);
125  val /= radix; /* get next digit */
126 
127  /* convert to ascii and store */
128  if (digval > 9)
129  *p++ = (char) (digval - 10 + 'a'); /* a letter */
130  else
131  *p++ = (char) (digval + '0'); /* a digit */
132  } while (val > 0);
133 
134  /* We now have the digit of the number in the buffer, but in reverse
135  order. Thus we reverse them now. */
136 
137  *p-- = '\0'; /* terminate string; p points to last digit */
138 
139  do {
140  temp = *p;
141  *p = *firstdig;
142  *firstdig = temp; /* swap *p and *firstdig */
143  --p;
144  ++firstdig; /* advance to next two digits */
145  } while (firstdig < p); /* repeat until halfway */
146 }
147 
148 /* Actual functions just call conversion helper with neg flag set correctly,
149  and return pointer to buffer. */
150 
151 extern "C" char * __cdecl _i64toa (__int64 val,char *buf,int radix ) {
152  x64toa((unsigned __int64)val, buf, radix, (radix == 10 && val < 0));
153  return buf;
154 }
155 
156 extern "C" char * __cdecl i64toa (__int64 val,char *buf,int radix ) {
157  x64toa((unsigned __int64)val, buf, radix, (radix == 10 && val < 0));
158  return buf;
159 }
160 
161 extern "C" char * __cdecl _ui64toa (unsigned __int64 val,char *buf,int radix) {
162  x64toa(val, buf, radix, 0);
163  return buf;
164 }
165 
166 extern "C" char * __cdecl ui64toa (unsigned __int64 val,char *buf,int radix) {
167  x64toa(val, buf, radix, 0);
168  return buf;
169 }
170 
171 #endif /* _NO_INT64 */
172 
173 #endif /* WIN32 */
#define __stdcall
Definition: xtoa.h:3
char *__cdecl _ltoa(long val, char *buf, int radix)
Definition: xtoa.cpp:91
char *__cdecl _itoa(int val, char *buf, int radix)
Definition: xtoa.cpp:83
char *__cdecl _ultoa(unsigned long val, char *buf, int radix)
Definition: xtoa.cpp:96
#define __cdecl
Definition: xtoa.h:2