| Commit | Line | Data |
|---|---|---|
| 4d3e9548 | 1 | /* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2004, 2009 |
| 92d0a6a6 JR |
2 | Free Software Foundation, Inc. |
| 3 | Written by James Clark (jjc@jclark.com) | |
| 4 | ||
| 5 | This file is part of groff. | |
| 6 | ||
| 7 | groff is free software; you can redistribute it and/or modify it under | |
| 8 | the terms of the GNU General Public License as published by the Free | |
| 4d3e9548 JL |
9 | Software Foundation, either version 3 of the License, or |
| 10 | (at your option) any later version. | |
| 92d0a6a6 JR |
11 | |
| 12 | groff is distributed in the hope that it will be useful, but WITHOUT ANY | |
| 13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 15 | for more details. | |
| 16 | ||
| 4d3e9548 JL |
17 | You should have received a copy of the GNU General Public License |
| 18 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
| 92d0a6a6 JR |
19 | |
| 20 | #define INT_DIGITS 19 /* enough for 64-bit integer */ | |
| 21 | ||
| 22 | #ifdef __cplusplus | |
| 23 | extern "C" { | |
| 24 | #endif | |
| 25 | ||
| 26 | char *if_to_a(int i, int decimal_point) | |
| 27 | { | |
| 28 | /* room for a -, INT_DIGITS digits, a decimal point, and a terminating '\0' */ | |
| 29 | static char buf[INT_DIGITS + 3]; | |
| 30 | char *p = buf + INT_DIGITS + 2; | |
| 31 | int point = 0; | |
| 32 | buf[INT_DIGITS + 2] = '\0'; | |
| 33 | /* assert(decimal_point <= INT_DIGITS); */ | |
| 34 | if (i >= 0) { | |
| 35 | do { | |
| 36 | *--p = '0' + (i % 10); | |
| 37 | i /= 10; | |
| 38 | if (++point == decimal_point) | |
| 39 | *--p = '.'; | |
| 40 | } while (i != 0 || point < decimal_point); | |
| 41 | } | |
| 42 | else { /* i < 0 */ | |
| 43 | do { | |
| 44 | *--p = '0' - (i % 10); | |
| 45 | i /= 10; | |
| 46 | if (++point == decimal_point) | |
| 47 | *--p = '.'; | |
| 48 | } while (i != 0 || point < decimal_point); | |
| 49 | *--p = '-'; | |
| 50 | } | |
| 51 | if (decimal_point > 0) { | |
| 52 | char *q; | |
| 53 | /* there must be a dot, so this will terminate */ | |
| 54 | for (q = buf + INT_DIGITS + 2; q[-1] == '0'; --q) | |
| 55 | ; | |
| 56 | if (q[-1] == '.') { | |
| 57 | if (q - 1 == p) { | |
| 58 | q[-1] = '0'; | |
| 59 | q[0] = '\0'; | |
| 60 | } | |
| 61 | else | |
| 62 | q[-1] = '\0'; | |
| 63 | } | |
| 64 | else | |
| 65 | *q = '\0'; | |
| 66 | } | |
| 67 | return p; | |
| 68 | } | |
| 69 | ||
| 70 | #ifdef __cplusplus | |
| 71 | } | |
| 72 | #endif |