|
3 | 3 | * numutils.c
|
4 | 4 | * utility functions for I/O of built-in numeric types.
|
5 | 5 | *
|
6 |
| - * integer: pg_itoa, pg_ltoa |
7 |
| - * floating point: ftoa, atof1 |
| 6 | + * integer: pg_atoi, pg_itoa, pg_ltoa |
8 | 7 | *
|
9 | 8 | * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
|
10 | 9 | * Portions Copyright (c) 1994, Regents of the University of California
|
11 | 10 | *
|
12 | 11 | *
|
13 | 12 | * IDENTIFICATION
|
14 |
| - * $PostgreSQL: pgsql/src/backend/utils/adt/numutils.c,v 1.60 2004/01/07 18:56:28 neilc Exp $ |
| 13 | + * $PostgreSQL: pgsql/src/backend/utils/adt/numutils.c,v 1.61 2004/02/18 00:01:33 neilc Exp $ |
15 | 14 | *
|
16 | 15 | *-------------------------------------------------------------------------
|
17 | 16 | */
|
@@ -147,334 +146,3 @@ pg_ltoa(int32 l, char *a)
|
147 | 146 | {
|
148 | 147 | sprintf(a, "%d", l);
|
149 | 148 | }
|
150 |
| - |
151 |
| -/* |
152 |
| - ** ftoa - FLOATING POINT TO ASCII CONVERSION |
153 |
| - ** |
154 |
| - ** CODE derived from ingres, ~ingres/source/gutil/ftoa.c |
155 |
| - ** |
156 |
| - ** 'Value' is converted to an ascii character string and stored |
157 |
| - ** into 'ascii'. Ascii should have room for at least 'width' + 1 |
158 |
| - ** characters. 'Width' is the width of the output field (max). |
159 |
| - ** 'Prec' is the number of characters to put after the decimal |
160 |
| - ** point. The format of the output string is controlled by |
161 |
| - ** 'format'. |
162 |
| - ** |
163 |
| - ** 'Format' can be: |
164 |
| - ** e or E: "E" format output |
165 |
| - ** f or F: "F" format output |
166 |
| - ** g or G: "F" format output if it will fit, otherwise |
167 |
| - ** use "E" format. |
168 |
| - ** n or N: same as G, but decimal points will not always |
169 |
| - ** be aligned. |
170 |
| - ** |
171 |
| - ** If 'format' is upper case, the "E" comes out in upper case; |
172 |
| - ** otherwise it comes out in lower case. |
173 |
| - ** |
174 |
| - ** When the field width is not big enough, it fills the field with |
175 |
| - ** stars ("*****") and returns zero. Normal return is the width |
176 |
| - ** of the output field (sometimes shorter than 'width'). |
177 |
| - */ |
178 |
| -#ifdef NOT_USED |
179 |
| -int |
180 |
| -ftoa(double value, char *ascii, int width, int prec1, char format) |
181 |
| -{ |
182 |
| -#ifndef HAVE_FCVT |
183 |
| - char out[256]; |
184 |
| - char fmt[256]; |
185 |
| - int ret; |
186 |
| - |
187 |
| - sprintf(fmt, "%%%d.%d%c", width, prec1, format); |
188 |
| - sprintf(out, fmt, value); |
189 |
| - if ((ret = strlen(out)) > width) |
190 |
| - { |
191 |
| - MemSet(ascii, '*', width - 2); |
192 |
| - ascii[width] = 0; |
193 |
| - return 0; |
194 |
| - } |
195 |
| - strcpy(ascii, out); |
196 |
| - return ret; |
197 |
| -#else |
198 |
| - auto int expon; |
199 |
| - auto int sign; |
200 |
| - int avail = 0; |
201 |
| - char *a = NULL; |
202 |
| - char *p = NULL; |
203 |
| - char mode; |
204 |
| - int lowercase; |
205 |
| - int prec; |
206 |
| - |
207 |
| -/* extern char *ecvt(), *fcvt();*/ |
208 |
| - |
209 |
| - prec = prec1; |
210 |
| - mode = format; |
211 |
| - lowercase = 'a' - 'A'; |
212 |
| - if (mode >= 'a') |
213 |
| - mode -= 'a' - 'A'; |
214 |
| - else |
215 |
| - lowercase = 0; |
216 |
| - |
217 |
| - if (mode != 'E') |
218 |
| - { |
219 |
| - /* try 'F' style output */ |
220 |
| - p = fcvt(value, prec, &expon, &sign); |
221 |
| - avail = width; |
222 |
| - a = ascii; |
223 |
| - |
224 |
| - /* output sign */ |
225 |
| - if (sign) |
226 |
| - { |
227 |
| - avail--; |
228 |
| - *a++ = '-'; |
229 |
| - } |
230 |
| - |
231 |
| - /* output '0' before the decimal point */ |
232 |
| - if (expon <= 0) |
233 |
| - { |
234 |
| - *a++ = '0'; |
235 |
| - avail--; |
236 |
| - } |
237 |
| - |
238 |
| - /* compute space length left after dec pt and fraction */ |
239 |
| - avail -= prec + 1; |
240 |
| - if (mode == 'G') |
241 |
| - avail -= 4; |
242 |
| - |
243 |
| - if (avail >= expon) |
244 |
| - { |
245 |
| - |
246 |
| - /* it fits. output */ |
247 |
| - while (expon > 0) |
248 |
| - { |
249 |
| - /* output left of dp */ |
250 |
| - expon--; |
251 |
| - if (*p) |
252 |
| - *a++ = *p++; |
253 |
| - else |
254 |
| - *a++ = '0'; |
255 |
| - } |
256 |
| - |
257 |
| - /* output fraction (right of dec pt) */ |
258 |
| - avail = expon; |
259 |
| - goto frac_out; |
260 |
| - } |
261 |
| - /* won't fit; let's hope for G format */ |
262 |
| - } |
263 |
| - |
264 |
| - if (mode != 'F') |
265 |
| - { |
266 |
| - /* try to do E style output */ |
267 |
| - p = ecvt(value, prec + 1, &expon, &sign); |
268 |
| - avail = width - 5; |
269 |
| - a = ascii; |
270 |
| - |
271 |
| - /* output the sign */ |
272 |
| - if (sign) |
273 |
| - { |
274 |
| - *a++ = '-'; |
275 |
| - avail--; |
276 |
| - } |
277 |
| - } |
278 |
| - |
279 |
| - /* check for field too small */ |
280 |
| - if (mode == 'F' || avail < prec) |
281 |
| - { |
282 |
| - /* sorry joker, you lose */ |
283 |
| - a = ascii; |
284 |
| - for (avail = width; avail > 0; avail--) |
285 |
| - *a++ = '*'; |
286 |
| - *a = 0; |
287 |
| - return 0; |
288 |
| - } |
289 |
| - |
290 |
| - /* it fits; output the number */ |
291 |
| - mode = 'E'; |
292 |
| - |
293 |
| - /* output the LHS single digit */ |
294 |
| - *a++ = *p++; |
295 |
| - expon--; |
296 |
| - |
297 |
| - /* output the rhs */ |
298 |
| - avail = 1; |
299 |
| - |
300 |
| -frac_out: |
301 |
| - *a++ = '.'; |
302 |
| - while (prec > 0) |
303 |
| - { |
304 |
| - prec--; |
305 |
| - if (avail < 0) |
306 |
| - { |
307 |
| - avail++; |
308 |
| - *a++ = '0'; |
309 |
| - } |
310 |
| - else |
311 |
| - { |
312 |
| - if (*p) |
313 |
| - *a++ = *p++; |
314 |
| - else |
315 |
| - *a++ = '0'; |
316 |
| - } |
317 |
| - } |
318 |
| - |
319 |
| - /* output the exponent */ |
320 |
| - if (mode == 'E') |
321 |
| - { |
322 |
| - *a++ = 'E' + lowercase; |
323 |
| - if (expon < 0) |
324 |
| - { |
325 |
| - *a++ = '-'; |
326 |
| - expon = -expon; |
327 |
| - } |
328 |
| - else |
329 |
| - *a++ = '+'; |
330 |
| - *a++ = (expon / 10) % 10 + '0'; |
331 |
| - *a++ = expon % 10 + '0'; |
332 |
| - } |
333 |
| - |
334 |
| - /* output spaces on the end in G format */ |
335 |
| - if (mode == 'G') |
336 |
| - { |
337 |
| - *a++ = ' '; |
338 |
| - *a++ = ' '; |
339 |
| - *a++ = ' '; |
340 |
| - *a++ = ' '; |
341 |
| - } |
342 |
| - |
343 |
| - /* finally, we can return */ |
344 |
| - *a = 0; |
345 |
| - avail = a - ascii; |
346 |
| - return avail; |
347 |
| -#endif |
348 |
| -} |
349 |
| -#endif |
350 |
| - |
351 |
| -/* |
352 |
| - ** atof1 - ASCII TO FLOATING CONVERSION |
353 |
| - ** |
354 |
| - ** CODE derived from ~ingres/source/gutil/atof.c |
355 |
| - ** |
356 |
| - ** Converts the string 'str' to floating point and stores the |
357 |
| - ** result into the cell pointed to by 'val'. |
358 |
| - ** |
359 |
| - ** The syntax which it accepts is pretty much what you would |
360 |
| - ** expect. Basically, it is: |
361 |
| - ** {<sp>} [+|-] {<sp>} {<digit>} [.{digit}] {<sp>} [<exp>] |
362 |
| - ** where <exp> is "e" or "E" followed by an integer, <sp> is a |
363 |
| - ** space character, <digit> is zero through nine, [] is zero or |
364 |
| - ** one, and {} is zero or more. |
365 |
| - ** |
366 |
| - ** Parameters: |
367 |
| - ** str -- string to convert. |
368 |
| - ** val -- pointer to place to put the result (which |
369 |
| - ** must be type double). |
370 |
| - ** |
371 |
| - ** Returns: |
372 |
| - ** zero -- ok. |
373 |
| - ** -1 -- syntax error. |
374 |
| - ** +1 -- overflow (not implemented). |
375 |
| - ** |
376 |
| - ** Side Effects: |
377 |
| - ** clobbers *val. |
378 |
| - */ |
379 |
| -#ifdef NOT_USED |
380 |
| -int |
381 |
| -atof1(char *str, double *val) |
382 |
| -{ |
383 |
| - char *p; |
384 |
| - double v; |
385 |
| - double fact; |
386 |
| - int minus; |
387 |
| - char c; |
388 |
| - int expon; |
389 |
| - int gotmant; |
390 |
| - |
391 |
| - v = 0.0; |
392 |
| - p = str; |
393 |
| - minus = 0; |
394 |
| - |
395 |
| - /* skip leading blanks */ |
396 |
| - while ((c = *p) != '\0') |
397 |
| - { |
398 |
| - if (c != ' ') |
399 |
| - break; |
400 |
| - p++; |
401 |
| - } |
402 |
| - |
403 |
| - /* handle possible sign */ |
404 |
| - switch (c) |
405 |
| - { |
406 |
| - case '-': |
407 |
| - minus++; |
408 |
| - |
409 |
| - case '+': |
410 |
| - p++; |
411 |
| - } |
412 |
| - |
413 |
| - /* skip blanks after sign */ |
414 |
| - while ((c = *p) != '\0') |
415 |
| - { |
416 |
| - if (c != ' ') |
417 |
| - break; |
418 |
| - p++; |
419 |
| - } |
420 |
| - |
421 |
| - /* start collecting the number to the decimal point */ |
422 |
| - gotmant = 0; |
423 |
| - for (;;) |
424 |
| - { |
425 |
| - c = *p; |
426 |
| - if (c < '0' || c > '9') |
427 |
| - break; |
428 |
| - v = v * 10.0 + (c - '0'); |
429 |
| - gotmant++; |
430 |
| - p++; |
431 |
| - } |
432 |
| - |
433 |
| - /* check for fractional part */ |
434 |
| - if (c == '.') |
435 |
| - { |
436 |
| - fact = 1.0; |
437 |
| - for (;;) |
438 |
| - { |
439 |
| - c = *++p; |
440 |
| - if (c < '0' || c > '9') |
441 |
| - break; |
442 |
| - fact *= 0.1; |
443 |
| - v += (c - '0') * fact; |
444 |
| - gotmant++; |
445 |
| - } |
446 |
| - } |
447 |
| - |
448 |
| - /* skip blanks before possible exponent */ |
449 |
| - while ((c = *p) != '\0') |
450 |
| - { |
451 |
| - if (c != ' ') |
452 |
| - break; |
453 |
| - p++; |
454 |
| - } |
455 |
| - |
456 |
| - /* test for exponent */ |
457 |
| - if (c == 'e' || c == 'E') |
458 |
| - { |
459 |
| - p++; |
460 |
| - expon = pg_atoi(p, sizeof(expon), '\0'); |
461 |
| - if (!gotmant) |
462 |
| - v = 1.0; |
463 |
| - fact = expon; |
464 |
| - v *= pow(10.0, fact); |
465 |
| - } |
466 |
| - else |
467 |
| - { |
468 |
| - /* if no exponent, then nothing */ |
469 |
| - if (c != 0) |
470 |
| - return -1; |
471 |
| - } |
472 |
| - |
473 |
| - /* store the result and exit */ |
474 |
| - if (minus) |
475 |
| - v = -v; |
476 |
| - *val = v; |
477 |
| - return 0; |
478 |
| -} |
479 |
| - |
480 |
| -#endif |
0 commit comments