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