|
|
1.1 root 1: /* The Plum Hall Validation Suite for C
2: * Unpublished copyright (c) 1986-1991, Chiron Systems Inc and Plum Hall Inc.
3: * VERSION: 4
4: * DATE: 1993-01-01
5: * The "ANSI" mode of this suite corresponds to official ANSI C, X3.159-1989.
6: * As per your license agreement, your distribution is not to be moved or copied outside the Designated Site
7: * without specific permission from Plum Hall Inc.
8: */
9:
10: /*
11: * d49a - formatting tests
12: */
13:
14: #include "flags.h"
15: #ifndef SKIP49
16: #include <stdio.h>
17: #define LIB_TEST 1
18: #include "defs.h"
19: #if ANSI
20: #include <float.h> /* to get DBL_MAX_10_EXP, which non-ANSI machine.h defines */
21: #else
22: #define remove unlink
23: #endif
24: char *save_name();
25:
26: #define T_0 0 /* no data needed */
27: #define T_I1 1 /* int */
28: #define T_I2 2 /* int (negative) */
29: #define T_L1 3 /* long */
30: #define T_SI 4 /* short */
31: #define T_D1 5 /* double */
32: #define T_P 6 /* char * */
33: #define T_S 7 /* string */
34: #define T_STAR1 8 /* width as argument */
35: #define T_STAR2 9 /* precision as argument */
36: #define T_STAR3 10 /* width and precision as arguments */
37: #define T_C1 11 /* character */
38: #define T_C2 12 /* character */
39: #define T_F 13 /* float */
40: #define T_U 14 /* unsigned int */
41: #define T_D2 15 /* very large double */
42: #define T_D3 16 /* double with zero value */
43: #define T_D4 17 /* double with integral value */
44: #define T_D5 18 /* double with exponent < -4 */
45: #define T_D6 19 /* double with exponent == precision */
46: #define T_D7 20 /* double with exponent > precision */
47: #define T_D8 21 /* long double */
48: #define T_SU 22 /* unsigned short */
49: #define T_I0 23 /* integer arg with value of 0 */
50: #define T_STARD 24 /* width and precision as arguments */
51: #define T_STARN 25 /* width and precision with a neg number */
52:
53: static int Ival1 = 77;
54: static int Ival2 = -77;
55: static long Lval1 = 65000;
56: static short Sval = 0x7fff;
57: static unsigned short Suval = 0x7fff;
58: static double Dval1 = 12.3456789;
59: static float Fval = 3.0;
60: static int *Pval = &Ival1;
61: static char *String = "this is a string\n";
62: static char Cval = 'a';
63: static unsigned int Ui = 65000;
64: static double Dval2 = 0.0; /* assigned dynamically below */
65: static double Dval3 = 0.0;
66: static double Dval4 = 1.0;
67: static double Dval5 = 1.23e-6;
68: static double Dval6 = 9.876e+2;
69: static double Dval7 = 9.876e+3;
70: #if ANSI
71: static long double Dval8 = 98.7654L;
72: #endif
73: void fpsteq();
74:
75:
76: static struct output
77: {
78: int type;
79: char *fmt;
80: char *out;
81: int line;
82: } Output[] =
83: {
84: /* %[-+ #][width|*][precision|*][h|l|L][diouxXfeEgGcspn%] */
85:
86: T_0, "", "", __LINE__,
87: T_0, "no format chars", "no format chars", __LINE__,
88: T_I1, "%d", "77", __LINE__,
89: T_I1, "%-3d", "77 ", __LINE__,
90: T_I1, "%+d", "+77", __LINE__,
91: T_I2, "%+d", "-77", __LINE__,
92: T_I2, "%+4d", " -77", __LINE__,
93: T_I1, "% 4d", " 77", __LINE__,
94: T_I2, "% 4d", " -77", __LINE__,
95: T_I1, "% +4d", " +77", __LINE__,
96: T_I1, "%+ 4d", " +77", __LINE__,
97: T_I1, "%+04d", "+077", __LINE__,
98: T_I2, "%04d", "-077", __LINE__,
99: T_I1, "%04.2d", " 77", __LINE__,
100: T_I1, "%.d", "77", __LINE__,
101: T_I1, "%04.d", " 77", __LINE__,
102: T_I0, "%.d", "", __LINE__,
103: T_I1, "%.4d", "0077", __LINE__,
104: T_I1, "%6.4d", " 0077", __LINE__,
105: T_I1, "% 6.4d", " 0077", __LINE__,
106: T_I1, "%06.4d", " 0077", __LINE__,
107: T_I1, "%3d", " 77", __LINE__,
108: T_I1, "%0d", "77", __LINE__,
109: T_I1, "%1d", "77", __LINE__,
110: T_I1, "%-1d", "77", __LINE__,
111: T_I1, "%x", "4d", __LINE__,
112: T_I1, "%#x", "0x4d", __LINE__,
113: T_I1, "%#X", "0X4D", __LINE__,
114: T_I1, "%o", "115", __LINE__,
115: T_I1, "%#o", "0115", __LINE__,
116: T_I1, "%d", "77", __LINE__,
117: T_I1, "%u", "77", __LINE__,
118: T_I1, "%.6d", "000077", __LINE__,
119: T_I1, "%.d", "77", __LINE__,
120: T_I2, "%.6d", "-000077", __LINE__,
121: T_I1, "%.1d", "77", __LINE__,
122: T_I1, "%.6o", "000115", __LINE__,
123: T_I1, "%.d", "77", __LINE__,
124: T_I1, "%4.6d", "000077", __LINE__,
125: T_I1, "%6.4d", " 0077", __LINE__,
126: T_I1, "%-6.4d", "0077 ", __LINE__,
127: T_I1, "%06d", "000077", __LINE__,
128: T_I1, "%-06d", "77 ", __LINE__,
129: T_L1, "%ld", "65000", __LINE__,
130: T_D1, "%f", "12.345679", __LINE__,
131: T_D1, "%6.3f", "12.346", __LINE__,
132: T_D1, "%.0f", "12", __LINE__,
133: T_D2, "%e", "1.234568e+100", __LINE__,
134: T_D2, "%E", "1.234568E+100", __LINE__,
135: T_D2, "%.3e", "1.235e+100", __LINE__,
136: T_D2, "%.10e", "1.2345678900e+100", __LINE__,
137: T_D1, "%e", "1.234568e+01", __LINE__,
138: T_D1, "%+e", "+1.234568e+01", __LINE__,
139: T_D1, "%15.4e", " 1.2346e+01", __LINE__,
140: T_D1, "%E", "1.234568E+01", __LINE__,
141: T_D1, "%.3e", "1.235e+01", __LINE__,
142: T_D1, "%.10e", "1.2345678900e+01", __LINE__,
143: T_D3, "%e", "0.000000e+00", __LINE__,
144: T_D1, "%.0e", "1e+01", __LINE__,
145: T_D1, "%.e", "1e+01", __LINE__,
146: T_D1, "%#.0e", "1.e+01", __LINE__,
147: T_D5, "%.2g", "1.2e-06", __LINE__,
148: T_D6, "%.2g", "9.9e+02", __LINE__,
149: T_D7, "%.2g", "9.9e+03", __LINE__,
150: T_D7, "%.2G", "9.9E+03", __LINE__,
151: T_D4, "%.0g", "1", __LINE__,
152: T_D1, "%.1g", "1e+01", __LINE__,
153: T_D4, "%#.0g", "1.", __LINE__,
154: T_D1, "%.2g", "12", __LINE__,
155: T_D4, "%.2g", "1", __LINE__,
156: T_D4, "%#.4g", "1.000", __LINE__,
157: T_S, "free form input", "free form input", __LINE__,
158: T_S, "%%%s%%d", "%this is a string\n%d",__LINE__,
159: T_S, "%-20s", "this is a string\n ",__LINE__,
160: T_S, "%20s", " this is a string\n",__LINE__,
161: T_S, "%20.6s", " this i", __LINE__,
162: T_S, "%.6s", "this i", __LINE__,
163: T_C1, "%c", "a", __LINE__,
164: T_C1, "%2c", " a", __LINE__,
165: #if ANSI
166: T_STAR1,"%.*d", "000077", __LINE__,
167: T_STAR1,"%*d", " 77", __LINE__,
168: T_STAR1,"%-*d", "77 ", __LINE__,
169: T_STAR2,"%.*d", "77", __LINE__,
170: T_STAR2,"%*d", "77 ", __LINE__,
171: T_STAR3,"%*.*d", " 0077", __LINE__,
172: T_STAR3,"%-*.*d", "0077 ", __LINE__,
173: T_STARN,"%.*e", "1.234568e+01", __LINE__,
174: T_STARD,"%*.*e", " 1.2346e+01", __LINE__,
175: T_I1, "%06.4d", " 0077", __LINE__,
176: T_I1, "%i", "77", __LINE__,
177: T_SI, "%#hx", "0x7fff", __LINE__,
178: T_U, "%u", "65000", __LINE__,
179: T_SU, "%ho", "77777", __LINE__,
180: T_SU, "%hu", "32767", __LINE__,
181: T_SU, "%hx", "7fff", __LINE__,
182: T_L1, "%lo", "176750", __LINE__,
183: T_L1, "%lu", "65000", __LINE__,
184: T_L1, "%lx", "fde8", __LINE__,
185: T_D8, "%Le", "9.876540e+01", __LINE__,
186: T_D8, "%Lf", "98.765400", __LINE__,
187: T_D8, "%Lg", "98.7654", __LINE__,
188: #endif
189: 0, 0, 0, __LINE__,
190: };
191:
192: /*
193: * PRINT - this test the printf, etc. scanf, etc. formatting.
194: * We make the reasonable assumption that the formatting routines
195: * for sprintf are common with those for sprintf, fprintf, etc. and only
196: * test one set.
197: */
198: void print()
199: {
200: #ifndef SKIP_PRINT
201: int i;
202: struct output *po;
203: char buffer[64];
204:
205: Filename = "d49a.c";
206: if (DBL_MAX_10_EXP >= 100)
207: Dval2 = 1.23456789 * dpowu(10., 100);
208:
209: for (po = Output; po->fmt; ++po)
210: {
211: if (po->type == T_D2 && DBL_MAX_10_EXP < 100)
212: {
213: /* See update item #533, Review Board meeting 8/92 */
214: checkthat(__LINE__, 1); /* count one successful test */
215: continue;
216: }
217: switch (po->type)
218: {
219: case T_0: sprintf(buffer, po->fmt); break;
220: case T_U: sprintf(buffer, po->fmt, Ui); break;
221: case T_I0: sprintf(buffer, po->fmt, 0); break;
222: case T_I1: sprintf(buffer, po->fmt, Ival1); break;
223: case T_I2: sprintf(buffer, po->fmt, Ival2); break;
224: case T_L1: sprintf(buffer, po->fmt, Lval1); break;
225: case T_SI: sprintf(buffer, po->fmt, Sval); break;
226: case T_SU: sprintf(buffer, po->fmt, Suval); break;
227: case T_D1: sprintf(buffer, po->fmt, Dval1); break;
228: case T_D2: sprintf(buffer, po->fmt, Dval2); break;
229: case T_D3: sprintf(buffer, po->fmt, Dval3); break;
230: case T_D4: sprintf(buffer, po->fmt, Dval4); break;
231: case T_D5: sprintf(buffer, po->fmt, Dval5); break;
232: case T_D6: sprintf(buffer, po->fmt, Dval6); break;
233: case T_D7: sprintf(buffer, po->fmt, Dval7); break;
234: #if ANSI
235: case T_D8: sprintf(buffer, po->fmt, Dval8); break;
236: #endif
237: case T_P: sprintf(buffer, po->fmt, Pval); break;
238: case T_S: sprintf(buffer, po->fmt, String); break;
239: case T_STAR1: sprintf(buffer, po->fmt, 6, Ival1); break;
240: case T_STAR2: sprintf(buffer, po->fmt, -6, Ival1); break;
241: case T_STAR3: sprintf(buffer, po->fmt, 6, 4, Ival1); break;
242: case T_STARD: sprintf(buffer, po->fmt, 15, 4, Dval1); break;
243: case T_STARN: sprintf(buffer, po->fmt, -4, Dval1); break;
244: case T_C1: sprintf(buffer, po->fmt, Cval); break;
245: }
246:
247: switch (po->type)
248: {
249: case T_D1:
250: case T_D2:
251: case T_D3:
252: case T_D4:
253: case T_D5:
254: case T_D6:
255: case T_D7:
256: case T_D8:
257: case T_STARD:
258: case T_STARN:
259: fpsteq(po->line, buffer, po->out);
260: break;
261: default:
262: stequals(po->line, buffer, po->out);
263: }
264: }
265:
266: #if ANSI
267: {
268: char *buffer_p;
269: int t1; short t2; long t3;
270: /* some special cases not covered above */
271:
272: buffer[0] = 0;
273: sprintf(buffer, "%p", buffer);
274: /* implementation defined format, but it should have written something */
275: inotequals(__LINE__, buffer[0], 0);
276: sscanf(buffer, "%p", &buffer_p);
277: aequals(__LINE__, buffer, buffer_p);
278:
279: #if ANSI8712 /* added h and l modifiers to n */
280: /* %.0d of 0 produces no characters */
281: sprintf(buffer, "%.0d", 0);
282: stequals(__LINE__, buffer, "");
283: #endif
284:
285: #if ANSI8703 /* added h and l modifiers to n */
286: sprintf(buffer, "%nabc%hn%d%ln", &t1, &t2, 123, &t3);
287: stequals(__LINE__, buffer, "abc123");
288: iequals(__LINE__, t1, 0);
289: iequals(__LINE__, t2, 3);
290: lequals(__LINE__, t3, 6L);
291: #endif /* ANSI8703 */
292: }
293: #endif
294: #endif /* SKIP_PRINT */
295: }
296:
297:
298:
299:
300: static struct input
301: {
302: int type;
303: char *fmt;
304: char *in;
305: int line;
306: } Input[] =
307: {
308: T_I1, "%d", "77", __LINE__,
309: T_I1, "%d", " 77", __LINE__,
310: #if ANSI
311: T_I1, "%d", "+77", __LINE__,
312: T_SI, "%hd", "32767", __LINE__,
313: #endif
314: T_I2, "%d", "-77", __LINE__,
315: T_I1, "abc%d", "abc77", __LINE__,
316: T_L1, "%ld", "65000", __LINE__,
317: #if ANSI
318: T_I1, "%i", "77", __LINE__,
319: T_I1, "%i", "+77", __LINE__,
320: T_I2, "%i", "-77", __LINE__,
321: T_I1, "%i", "0115", __LINE__,
322: T_I1, "%i", "0x4d", __LINE__,
323: T_I1, "%i", "0X4d", __LINE__,
324: T_SI, "%hi", "0x7fff", __LINE__,
325: T_SU, "%ho", "077777", __LINE__,
326: T_SU, "%hu", "32767", __LINE__,
327: T_SU, "%hx", "7fff", __LINE__,
328: T_L1, "%lo", "0176750", __LINE__,
329: T_L1, "%lu", "65000", __LINE__,
330: T_L1, "%lx", "fde8", __LINE__,
331: #endif
332: T_I1, "%o", "0115", __LINE__,
333: T_I1, "%u", "77", __LINE__,
334: T_I1, "%x", "4d", __LINE__,
335: T_I1, "%x", "4D", __LINE__,
336: T_I1, "%X", "4d", __LINE__,
337: T_I1, "%X", "4D", __LINE__,
338: T_S, "%s", " this is", __LINE__,
339: T_C1, "%c", "athis is", __LINE__,
340: T_C2, "%c", " this is", __LINE__,
341: T_F, "%f", "3.", __LINE__,
342: T_F, "%e", "3.", __LINE__,
343: T_F, "%f", ".3e+01", __LINE__,
344: T_F, "%e", ".3e+01", __LINE__,
345: T_F, "%f", "3.0", __LINE__,
346: T_F, "%g", "3.0", __LINE__,
347: T_D1, "%le", "12.3456789", __LINE__,
348: T_D1, "%lf", "12.3456789", __LINE__,
349: T_D1, "%lg", "1.23456789e+01", __LINE__,
350: #if ANSI
351: T_F, "%E", ".3e+01", __LINE__,
352: T_F, "%G", "3.0", __LINE__,
353: T_D8, "%Le", "98.7654", __LINE__,
354: T_D8, "%Lf", "98.7654", __LINE__,
355: T_D8, "%Lg", "9.87654e+01", __LINE__,
356: #endif
357: 0, (char *)0, (char *)0, __LINE__,
358: };
359:
360:
361:
362: /*
363: * SCAN - this test the scanf, etc. scanf, etc. number cracking.
364: * We make the reasonable assumption that the scanning routines
365: * for sscanf are common with those for scanf, fscanf, etc. and only
366: * test one set.
367: */
368: void scan()
369: {
370: #ifndef SKIP_SCAN
371: int i, n;
372: struct input *pi;
373: char buffer[64];
374: char ctmp;
375: short stmp;
376: unsigned short sutmp;
377: int itmp;
378: long ltmp;
379: double dtmp;
380: #if ANSI
381: long double ldtmp;
382: #endif
383: float ftmp;
384: int *ptmp;
385: char *p = buffer;
386: char *q = 0;
387:
388: Filename = "d49a.c";
389:
390: for (pi = Input; pi->fmt; ++pi)
391: {
392: switch (pi->type)
393: {
394: case T_I1 :
395: sscanf(pi->in, pi->fmt, &itmp);
396: iequals(pi->line, itmp, Ival1);
397: itmp = 0;
398: break;
399: case T_SI :
400: sscanf(pi->in, pi->fmt, &stmp);
401: iequals(pi->line, stmp, Sval);
402: stmp = 0;
403: break;
404: case T_SU :
405: sscanf(pi->in, pi->fmt, &sutmp);
406: iequals(pi->line, sutmp, Suval);
407: sutmp = 0;
408: break;
409: case T_L1 :
410: sscanf(pi->in, pi->fmt, <mp);
411: lequals(pi->line, ltmp, Lval1);
412: ltmp = 0;
413: break;
414: case T_D1 :
415: sscanf(pi->in, pi->fmt, &dtmp);
416: dequals(pi->line, dtmp, Dval1);
417: dtmp = 0;
418: break;
419: #if ANSI
420: case T_D8 :
421: sscanf(pi->in, pi->fmt, &ldtmp);
422: ldequals(pi->line, ldtmp, Dval8);
423: ldtmp = 0;
424: break;
425: #endif
426: case T_F :
427: sscanf(pi->in, pi->fmt, &ftmp);
428: dequals(pi->line, ftmp, Fval);
429: ftmp = 0;
430: break;
431: case T_S :
432: sscanf(pi->in, pi->fmt, buffer);
433: stequals(pi->line, buffer, "this");
434: buffer[0] = 0;
435: break;
436: case T_C1 :
437: sscanf(pi->in, pi->fmt, &ctmp);
438: iequals(pi->line, ctmp, 'a');
439: ctmp = 0;
440: break;
441: case T_C2 :
442: sscanf(pi->in, pi->fmt, &ctmp);
443: iequals(pi->line, ctmp, ' ');
444: ctmp = 0;
445: break;
446: }
447: }
448:
449: /* special cases */
450:
451: /* if a directive fails, no more input is consumed */
452: {
453: char filename[256];
454: FILE *fd;
455: int tmp1 = 0;
456: int tmp2 = 0;
457: char c = 0;
458:
459: save_name(tmpnam(filename));
460: fd = fopen(filename, "w+");
461: fprintf(fd, "xxx 17 yyy 18");
462: rewind(fd);
463: fscanf(fd, "xxx %d zzz %d", &tmp1, &tmp2);
464: iequals(__LINE__, tmp1, 17);
465: iequals(__LINE__, tmp2, 0);
466: fscanf(fd, "yyy %d", &tmp2);
467: iequals(__LINE__, tmp2, 18);
468: fscanf(fd, "%c", &c);
469: iequals(__LINE__, c, 0);
470:
471: fclose(fd);
472: remove(filename);
473: }
474:
475: #if ANSI
476: /* skip white space unless %c, %n, or %[ ] */
477: sscanf(" \f\n\r\t\v10", "%d", &Ival1);
478: iequals(__LINE__, Ival1, 10);
479: sscanf(" \f\n\r\t\vA", "%c%c%c%c%c%c%c", p+0, p+1, p+2, p+3, p+4, p+5, p+6);
480: iequals(__LINE__, p[0], ' ');
481: iequals(__LINE__, p[1], '\f');
482: iequals(__LINE__, p[2], '\n');
483: iequals(__LINE__, p[3], '\r');
484: iequals(__LINE__, p[4], '\t');
485: iequals(__LINE__, p[5], '\v');
486: iequals(__LINE__, p[6], 'A');
487:
488: sscanf("xxx yyy", "xxx%n%c", &Ival1, &Cval);
489: iequals(__LINE__, Ival1, 3);
490: iequals(__LINE__, Cval, ' ');
491:
492: p = " \f\n\r\t\vXXX";
493: sscanf(p, "%s", buffer);
494: stequals(__LINE__, buffer, "XXX");
495: sscanf(p, "%[ \f\n\r\t\v]", buffer);
496: stequals(__LINE__, buffer, " \f\n\r\t\v");
497:
498: /* assignment supression */
499: Ival1 = 1;
500: Ival2 = 2;
501: sscanf("77 78", "%*d%d", &Ival1, &Ival2);
502: iequals(__LINE__, Ival1, 78);
503: iequals(__LINE__, Ival2, 2);
504:
505: /* field widths */
506: sscanf("123456", "%3d%d", &Ival1, &Ival2);
507: iequals(__LINE__, Ival1, 123);
508: iequals(__LINE__, Ival2, 456);
509: str_cpye(buffer+30, "XXXXXXX");
510: sscanf("123456789", "%3d%3s%2c", &Ival2, buffer, buffer+30);
511: iequals(__LINE__, Ival2, 123);
512: stequals(__LINE__, buffer, "456");
513: iequals(__LINE__, buffer[30], '7');
514: iequals(__LINE__, buffer[31], '8');
515: iequals(__LINE__, buffer[32], 'X');
516: sscanf("abcabcabc", "%4[abc]", buffer);
517: stequals(__LINE__, buffer, "abca");
518: sscanf("xyzxyzxyz", "%4[^abc]", buffer);
519: stequals(__LINE__, buffer, "xyzx");
520:
521: /* conversion count */
522: sscanf("123 5", "%d%n", &i, &n);
523: iequals(__LINE__, i, 123);
524: iequals(__LINE__, n, 3);
525:
526: sscanf("123 5", "%d%hn", &i, &stmp);
527: iequals(__LINE__, i, 123);
528: iequals(__LINE__, stmp, 3);
529:
530: sscanf("123 5", "%d%ln", &i, <mp);
531: iequals(__LINE__, i, 123);
532: lequals(__LINE__, ltmp, 3L);
533:
534: /* '%%' is an escape for '%' */
535: str_cpye(buffer, "xxxxxx");
536: sscanf("%%aaa", "%%%%%s", buffer);
537: stequals(__LINE__, buffer, "aaa");
538:
539: /* scan sets */
540: sscanf("ddccbbaaxxxxx", "%[abcd]", buffer);
541: stequals(__LINE__, buffer, "ddccbbaa");
542:
543: sscanf("xxyyzzaabbccdd", "%[^abcd]", buffer);
544: stequals(__LINE__, buffer, "xxyyzz");
545:
546: sscanf("dd]cc]bb]aaxxxxx", "%[]abcd]", buffer);
547: stequals(__LINE__, buffer, "dd]cc]bb]aa");
548:
549: sscanf("xxyyzz]aabbccdd", "%[^]abcd]", buffer);
550: stequals(__LINE__, buffer, "xxyyzz");
551:
552: /* exceptional behaviour of '-' is implementation defined */
553: sscanf("-", "%[a-z]", buffer);
554: stequals(- __LINE__, buffer, "-");
555:
556: /* %p should be idempotent */
557: sprintf(buffer, "%p", p);
558: sscanf(buffer, "%p", &q);
559: aequals(__LINE__, p, q);
560: #endif
561: #endif /* SKIP_SCAN */
562: }
563:
564: #define IS_SPACE(c) ((c) == ' ') /* Standard only allows space padding */
565: /*
566: * fpsteq - When checking floating point output, the standard requires
567: * a minimum of 2 digits for the exponent. More is OK, so this routine
568: * checks for conformance without being sensitive to the exact number
569: * of digits. When we know that the string is wrong, we call
570: * stequals to create a meaningful error message. Also, compensate
571: * for differing number of white space in filling up the field width.
572: */
573: void fpsteq(line, pval, pres)
574: int line;
575: char *pval;
576: char *pres;
577: {
578: char result[32], value[32];
579: int len;
580: char *p, *q;
581:
582: /* check for field width (only on leading space) */
583: if (IS_SPACE(*pval) && str_len(pres) != str_len(pval))
584: {
585: /* this will fail */
586: stequals(line, pval, pres);
587: return;
588: }
589:
590: /* get rid of leading whitespace */
591: while (IS_SPACE(*pval))
592: ++pval;
593: while (IS_SPACE(*pres))
594: ++pres;
595: if (str_str(pres, "E+") || str_str(pres, "E-") ||
596: str_str(pres, "e+") || str_str(pres, "e-"))
597: {
598: len = str_cspn(pres, "Ee");
599: if (len != str_cspn(pval, "Ee"))
600: {
601: /* this will fail */
602: stequals(line, pval, pres);
603: return;
604: }
605: st_ncpy(result, pres, len);
606: result[len] = 0;
607: st_ncpy(value, pval, len);
608: value[len] = 0;
609: if (str_cmp(result, value))
610: {
611: /* this will fail */
612: stequals(line, pval, pres);
613: }
614: else /* OK so far, result matches value */
615: {
616: /* does pval have at least 2 digits of exponent? */
617: p = pval + len + 2;
618: if (str_len(p) < 2)
619: {
620: /* this will fail */
621: stequals(line, pval, pres);
622: }
623: else /* OK so far, exponent >= 2 digits */
624: {
625: while (*p == '0')
626: ++p;
627: q = pres + len + 2;
628: while (*q == '0')
629: ++q;
630: if (str_cmp(p, q))
631: {
632: /* this will fail */
633: stequals(line, pval, pres);
634: }
635: else /* complete success, exponents match numerically */
636: stequals(line, pval, pval); /* just to get trace */
637: }
638: }
639: }
640: else /* no exponent in output format */
641: stequals(line, pval, pres);
642: }
643:
644: #endif /* !SKIP49 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.