PageRenderTime 12ms CodeModel.GetById 2ms app.highlight 7ms RepoModel.GetById 1ms app.codeStats 0ms

/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
 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