home *** CD-ROM | disk | FTP | other *** search
/ Aminet 10 / aminetcdnumber101996.iso / Aminet / util / gnu / groff_src.lha / groff-1.10src / libgroff / iftoa.c < prev    next >
C/C++ Source or Header  |  1995-06-22  |  2KB  |  66 lines

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