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

Defined functions

icvt defined in line 21; used 2 times

Defined variables

_digit defined in line 17; used 1 times
  • in line 30
_icv_buf defined in line 18; used 2 times

Defined macros

_mask defined in line 19; used 2 times
Last modified: 1987-02-18
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1908
Valid CSS Valid XHTML 1.0 Strict