|
|
1.1 ! root 1: /**************************************************************** ! 2: Copyright 1990 by AT&T Bell Laboratories and Bellcore. ! 3: ! 4: Permission to use, copy, modify, and distribute this software ! 5: and its documentation for any purpose and without fee is hereby ! 6: granted, provided that the above copyright notice appear in all ! 7: copies and that both that the copyright notice and this ! 8: permission notice and warranty disclaimer appear in supporting ! 9: documentation, and that the names of AT&T Bell Laboratories or ! 10: Bellcore or any of their entities not be used in advertising or ! 11: publicity pertaining to distribution of the software without ! 12: specific, written prior permission. ! 13: ! 14: AT&T and Bellcore disclaim all warranties with regard to this ! 15: software, including all implied warranties of merchantability ! 16: and fitness. In no event shall AT&T or Bellcore be liable for ! 17: any special, indirect or consequential damages or any damages ! 18: whatsoever resulting from loss of use, data or profits, whether ! 19: in an action of contract, negligence or other tortious action, ! 20: arising out of or in connection with the use or performance of ! 21: this software. ! 22: ****************************************************************/ ! 23: ! 24: /* Put strings representing decimal floating-point numbers ! 25: * into canonical form: always have a decimal point or ! 26: * exponent field; if using an exponent field, have the ! 27: * number before it start with a digit and decimal point ! 28: * (if the number has more than one digit); only have an ! 29: * exponent field if it saves space. ! 30: * ! 31: * Arrange that the return value, rv, satisfies rv[0] == '-' || rv[-1] == '-' . ! 32: */ ! 33: ! 34: #include "sysdep.h" ! 35: ! 36: char * ! 37: cds(s, z0) ! 38: char *s, *z0; ! 39: { ! 40: int ea, esign, et, i, k, nd = 0, sign = 0, tz; ! 41: char c, *z; ! 42: char ebuf[24]; ! 43: long ex = 0; ! 44: static char etype[Table_size], *db; ! 45: static int dblen = 64; ! 46: ! 47: if (!db) { ! 48: etype['E'] = 1; ! 49: etype['e'] = 1; ! 50: etype['D'] = 1; ! 51: etype['d'] = 1; ! 52: etype['+'] = 2; ! 53: etype['-'] = 3; ! 54: db = Alloc(dblen); ! 55: } ! 56: ! 57: while((c = *s++) == '0'); ! 58: if (c == '-') ! 59: { sign = 1; c = *s++; } ! 60: else if (c == '+') ! 61: c = *s++; ! 62: k = strlen(s) + 2; ! 63: if (k >= dblen) { ! 64: do dblen <<= 1; ! 65: while(k >= dblen); ! 66: free(db); ! 67: db = Alloc(dblen); ! 68: } ! 69: if (etype[(unsigned char)c] >= 2) ! 70: while(c == '0') c = *s++; ! 71: tz = 0; ! 72: while(c >= '0' && c <= '9') { ! 73: if (c == '0') ! 74: tz++; ! 75: else { ! 76: if (nd) ! 77: for(; tz; --tz) ! 78: db[nd++] = '0'; ! 79: else ! 80: tz = 0; ! 81: db[nd++] = c; ! 82: } ! 83: c = *s++; ! 84: } ! 85: ea = -tz; ! 86: if (c == '.') { ! 87: while((c = *s++) >= '0' && c <= '9') { ! 88: if (c == '0') ! 89: tz++; ! 90: else { ! 91: if (tz) { ! 92: ea += tz; ! 93: if (nd) ! 94: for(; tz; --tz) ! 95: db[nd++] = '0'; ! 96: else ! 97: tz = 0; ! 98: } ! 99: db[nd++] = c; ! 100: ea++; ! 101: } ! 102: } ! 103: } ! 104: if (et = etype[(unsigned char)c]) { ! 105: esign = et == 3; ! 106: c = *s++; ! 107: if (et == 1) { ! 108: if(etype[(unsigned char)c] > 1) { ! 109: if (c == '-') ! 110: esign = 1; ! 111: c = *s++; ! 112: } ! 113: } ! 114: while(c >= '0' && c <= '9') { ! 115: ex = 10*ex + (c - '0'); ! 116: c = *s++; ! 117: } ! 118: if (esign) ! 119: ex = -ex; ! 120: } ! 121: /* debug */ if (c) ! 122: /* debug*/ Fatal("unexpected character in cds"); ! 123: ex -= ea; ! 124: if (!nd) { ! 125: if (!z0) ! 126: z0 = mem(4,0); ! 127: strcpy(z0, "-0."); ! 128: sign = 0; ! 129: } ! 130: else if (ex > 2 || ex + nd < -2) { ! 131: sprintf(ebuf, "%ld", ex + nd - 1); ! 132: k = strlen(ebuf) + nd + 3; ! 133: if (nd > 1) ! 134: k++; ! 135: if (!z0) ! 136: z0 = mem(k,0); ! 137: z = z0; ! 138: *z++ = '-'; ! 139: *z++ = *db; ! 140: if (nd > 1) { ! 141: *z++ = '.'; ! 142: for(k = 1; k < nd; k++) ! 143: *z++ = db[k]; ! 144: } ! 145: *z++ = 'e'; ! 146: strcpy(z, ebuf); ! 147: } ! 148: else { ! 149: k = (int)(ex + nd); ! 150: i = nd + 3; ! 151: if (k < 0) ! 152: i -= k; ! 153: else if (ex > 0) ! 154: i += ex; ! 155: if (!z0) ! 156: z0 = mem(i,0); ! 157: z = z0; ! 158: *z++ = '-'; ! 159: if (ex >= 0) { ! 160: for(k = 0; k < nd; k++) ! 161: *z++ = db[k]; ! 162: while(--ex >= 0) ! 163: *z++ = '0'; ! 164: *z++ = '.'; ! 165: } ! 166: else { ! 167: for(i = 0; i < k;) ! 168: *z++ = db[i++]; ! 169: *z++ = '.'; ! 170: while(++k <= 0) ! 171: *z++ = '0'; ! 172: while(i < nd) ! 173: *z++ = db[i++]; ! 174: } ! 175: *z = 0; ! 176: } ! 177: return sign ? z0 : z0+1; ! 178: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.