|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.