1: /*
   2: char id_fmtlib[] = "@(#)fmtlib.c	1.3";
   3:  *
   4:  * integer to ascii conversion
   5:  *
   6:  * This code has been rearranged to produce optimized runtime code.
   7:  */
   8: 
   9: #include "fio.h"
  10: 
  11: static char _digit[] = "0123456789abcdefghijklmnopqrstuvwxyz";
  12: static char _icv_buf[MAXINTLENGTH+1];
  13: #define     _mask   0x7fffffff
  14: 
  15: char *
  16: icvt(value, ndigit, sign)
  17: long    value;
  18: int *ndigit;
  19: int *sign;
  20: {
  21:     register long   val = value;
  22:     register long   rad = radix;
  23:     register char   *b = &_icv_buf[MAXINTLENGTH];
  24:     register char   *d = _digit;
  25:     register long   tmp1;
  26:     register int    tmp2;
  27:     long    rem;
  28:     long    kludge;
  29: 
  30:     if (val == 0)
  31:     {
  32:         *--b = '0';
  33:         *sign = 0;
  34:         *ndigit = 1;
  35:         return(b);
  36:     }
  37: 
  38:     if (signit && (*sign = (val < 0)))  /* signed conversion */
  39:     {
  40:         /*
  41: 		 * It is necessary to do the first divide
  42: 		 * before the absolute value, for the case -2^31
  43: 		 *
  44: 		 * This is actually what is being done...
  45: 		 * tmp1 = (int)(val % rad);
  46: 		 * val /= rad;
  47: 		 * val = -val
  48: 		 * *--b = d[-tmp1];
  49: 		 */
  50:         tmp1 = val / rad;
  51:         *--b = d[(tmp1 * rad) - val];
  52:         val = -tmp1;
  53:     }
  54:     else                /* unsigned conversion */
  55:     {
  56:         *sign = 0;
  57:         if (val < 0)
  58:         {   /* ALL THIS IS TO SIMULATE UNSIGNED LONG MOD & DIV */
  59:             kludge = _mask - (rad - 1);
  60:             val &= _mask;
  61:             /*
  62: 			 * This is really what's being done...
  63: 			 * rem = (kludge % rad) + (val % rad);
  64: 			 * val = (kludge / rad) + (val / rad) + (rem / rad) + 1;
  65: 			 * *--b = d[rem % rad];
  66: 			 */
  67:             tmp1 = kludge / rad;
  68:             tmp2 = val / rad;
  69:             rem = (kludge - (tmp1 * rad)) + (val - (tmp2 * rad));
  70:             val = ++tmp1 + tmp2;
  71:             tmp1 = rem / rad;
  72:             val += tmp1;
  73:             *--b = d[rem - (tmp1 * rad)];
  74:         }
  75:     }
  76: 
  77:     while (val)
  78:     {
  79:         /*
  80: 		 * This is really what's being done ...
  81: 		 * *--b = d[val % rad];
  82: 		 * val /= rad;
  83: 		 */
  84:         tmp1 = val / rad;
  85:         *--b = d[val - (tmp1 * rad)];
  86:         val = tmp1;
  87:     }
  88: 
  89:     *ndigit = (&_icv_buf[MAXINTLENGTH] - b);
  90:     return(b);
  91: }

Defined functions

icvt defined in line 15; used 2 times

Defined variables

_digit defined in line 11; used 1 times
  • in line 24
_icv_buf defined in line 12; used 2 times

Defined macros

_mask defined in line 13; used 2 times
Last modified: 1983-05-20
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 587
Valid CSS Valid XHTML 1.0 Strict