Doxygen Source Code Documentation
cds.c File Reference
#include "defs.h"
Go to the source code of this file.
Functions | |
char * | cds (char *s, char *z0) |
Function Documentation
|
Definition at line 42 of file cds.c. References Alloc, c, Fatal(), free, i, mem(), Table_size, and z0. Referenced by consconv(), imagpart(), mkrealcon(), p1_const(), prconr(), putconst(), and realpart().
00044 { 00045 int ea, esign, et, i, k, nd = 0, sign = 0, tz; 00046 char c, *z; 00047 char ebuf[24]; 00048 long ex = 0; 00049 static char etype[Table_size], *db; 00050 static int dblen = 64; 00051 00052 if (!db) { 00053 etype['E'] = 1; 00054 etype['e'] = 1; 00055 etype['D'] = 1; 00056 etype['d'] = 1; 00057 etype['+'] = 2; 00058 etype['-'] = 3; 00059 db = Alloc(dblen); 00060 } 00061 00062 while((c = *s++) == '0'); 00063 if (c == '-') 00064 { sign = 1; c = *s++; } 00065 else if (c == '+') 00066 c = *s++; 00067 k = strlen(s) + 2; 00068 if (k >= dblen) { 00069 do dblen <<= 1; 00070 while(k >= dblen); 00071 free(db); 00072 db = Alloc(dblen); 00073 } 00074 if (etype[(unsigned char)c] >= 2) 00075 while(c == '0') c = *s++; 00076 tz = 0; 00077 while(c >= '0' && c <= '9') { 00078 if (c == '0') 00079 tz++; 00080 else { 00081 if (nd) 00082 for(; tz; --tz) 00083 db[nd++] = '0'; 00084 else 00085 tz = 0; 00086 db[nd++] = c; 00087 } 00088 c = *s++; 00089 } 00090 ea = -tz; 00091 if (c == '.') { 00092 while((c = *s++) >= '0' && c <= '9') { 00093 if (c == '0') 00094 tz++; 00095 else { 00096 if (tz) { 00097 ea += tz; 00098 if (nd) 00099 for(; tz; --tz) 00100 db[nd++] = '0'; 00101 else 00102 tz = 0; 00103 } 00104 db[nd++] = c; 00105 ea++; 00106 } 00107 } 00108 } 00109 if (et = etype[(unsigned char)c]) { 00110 esign = et == 3; 00111 c = *s++; 00112 if (et == 1) { 00113 if(etype[(unsigned char)c] > 1) { 00114 if (c == '-') 00115 esign = 1; 00116 c = *s++; 00117 } 00118 } 00119 while(c >= '0' && c <= '9') { 00120 ex = 10*ex + (c - '0'); 00121 c = *s++; 00122 } 00123 if (esign) 00124 ex = -ex; 00125 } 00126 switch(c) { 00127 case 0: 00128 break; 00129 #ifndef VAX 00130 case 'i': 00131 case 'I': 00132 Fatal("Overflow evaluating constant expression."); 00133 case 'n': 00134 case 'N': 00135 Fatal("Constant expression yields NaN."); 00136 #endif 00137 default: 00138 Fatal("unexpected character in cds."); 00139 } 00140 ex -= ea; 00141 if (!nd) { 00142 if (!z0) 00143 z0 = mem(4,0); 00144 strcpy(z0, "-0."); 00145 sign = 0; 00146 } 00147 else if (ex > 2 || ex + nd < -2) { 00148 sprintf(ebuf, "%ld", ex + nd - 1); 00149 k = strlen(ebuf) + nd + 3; 00150 if (nd > 1) 00151 k++; 00152 if (!z0) 00153 z0 = mem(k,0); 00154 z = z0; 00155 *z++ = '-'; 00156 *z++ = *db; 00157 if (nd > 1) { 00158 *z++ = '.'; 00159 for(k = 1; k < nd; k++) 00160 *z++ = db[k]; 00161 } 00162 *z++ = 'e'; 00163 strcpy(z, ebuf); 00164 } 00165 else { 00166 k = (int)(ex + nd); 00167 i = nd + 3; 00168 if (k < 0) 00169 i -= k; 00170 else if (ex > 0) 00171 i += ex; 00172 if (!z0) 00173 z0 = mem(i,0); 00174 z = z0; 00175 *z++ = '-'; 00176 if (ex >= 0) { 00177 for(k = 0; k < nd; k++) 00178 *z++ = db[k]; 00179 while(--ex >= 0) 00180 *z++ = '0'; 00181 *z++ = '.'; 00182 } 00183 else { 00184 for(i = 0; i < k;) 00185 *z++ = db[i++]; 00186 *z++ = '.'; 00187 while(++k <= 0) 00188 *z++ = '0'; 00189 while(i < nd) 00190 *z++ = db[i++]; 00191 } 00192 *z = 0; 00193 } 00194 return sign ? z0 : z0+1; 00195 } |