/contrib/groff/src/libs/libgroff/iftoa.c
https://bitbucket.org/freebsd/freebsd-head/ · C · 73 lines · 47 code · 4 blank · 22 comment · 19 complexity · 07f119df02795bb600c09d84e503cb32 MD5 · raw file
- /* Copyright (C) 1989, 1990, 1991, 1992, 2000, 2004
- Free Software Foundation, Inc.
- Written by James Clark (jjc@jclark.com)
- This file is part of groff.
- groff is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free
- Software Foundation; either version 2, or (at your option) any later
- version.
- groff is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or
- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- for more details.
- You should have received a copy of the GNU General Public License along
- with groff; see the file COPYING. If not, write to the Free Software
- Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
- #define INT_DIGITS 19 /* enough for 64-bit integer */
- #ifdef __cplusplus
- extern "C" {
- #endif
- char *if_to_a(int i, int decimal_point)
- {
- /* room for a -, INT_DIGITS digits, a decimal point, and a terminating '\0' */
- static char buf[INT_DIGITS + 3];
- char *p = buf + INT_DIGITS + 2;
- int point = 0;
- buf[INT_DIGITS + 2] = '\0';
- /* assert(decimal_point <= INT_DIGITS); */
- if (i >= 0) {
- do {
- *--p = '0' + (i % 10);
- i /= 10;
- if (++point == decimal_point)
- *--p = '.';
- } while (i != 0 || point < decimal_point);
- }
- else { /* i < 0 */
- do {
- *--p = '0' - (i % 10);
- i /= 10;
- if (++point == decimal_point)
- *--p = '.';
- } while (i != 0 || point < decimal_point);
- *--p = '-';
- }
- if (decimal_point > 0) {
- char *q;
- /* there must be a dot, so this will terminate */
- for (q = buf + INT_DIGITS + 2; q[-1] == '0'; --q)
- ;
- if (q[-1] == '.') {
- if (q - 1 == p) {
- q[-1] = '0';
- q[0] = '\0';
- }
- else
- q[-1] = '\0';
- }
- else
- *q = '\0';
- }
- return p;
- }
- #ifdef __cplusplus
- }
- #endif