Annotation of 43BSDReno/lib/libI77/fmtlib.c, revision 1.1.1.1

1.1       root        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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.