|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 2023 (0x7e7) Types: TextFile Names: »strtod.c«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89 └─⟦f68d31fd9⟧ »./gawk-2.11.tar.Z« └─⟦2fc192871⟧ └─⟦this⟧ »gawk-2.11/missing.d/strtod.c« └─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦6dcdebfcf⟧ »EurOpenD3/gnu/gawk/gawk-2.11.1.tar.Z« └─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89 └─⟦6dcdebfcf⟧ »./gawk-2.11.1.tar.Z« └─⟦3c42ca21a⟧ └─⟦this⟧ »gawk-2.11/missing.d/strtod.c«
/* * strtod.c * * Stupid version of System V strtod(3) library routine. * Does no overflow/underflow checking. * * A real number is defined to be * optional leading white space * optional sign * string of digits with optional decimal point * optional 'e' or 'E' * followed by optional sign or space * followed by an integer * * if ptr is not NULL a pointer to the character terminating the * scan is returned in *ptr. If no number formed, *ptr is set to str * and 0 is returned. * * For speed, we don't do the conversion ourselves. Instead, we find * the end of the number and then call atof() to do the dirty work. * This bought us a 10% speedup on a sample program at uunet.uu.net. */ #include <ctype.h> extern double atof(); double strtod (s, ptr) register char *s, **ptr; { double ret = 0.0; char *start = s; char *begin = NULL; int success = 0; /* optional white space */ while (isspace(*s)) s++; /* optional sign */ if (*s == '+' || *s == '-') { s++; if (*(s-1) == '-') begin = s - 1; else begin = s; } /* string of digits with optional decimal point */ if (isdigit(*s) && ! begin) begin = s; while (isdigit(*s)) { s++; success++; } if (*s == '.') { if (! begin) begin = s; s++; while (isdigit(*s)) s++; success++; } if (s == start || success == 0) /* nothing there */ goto out; /* * optional 'e' or 'E' * followed by optional sign or space * followed by an integer */ if (*s == 'e' || *s == 'E') { s++; /* XXX - atof probably doesn't allow spaces here */ while (isspace(*s)) s++; if (*s == '+' || *s == '-') s++; while (isdigit(*s)) s++; } /* go for it */ ret = atof(begin); out: if (! success) s = start; /* in case all we did was skip whitespace */ if (ptr) *ptr = s; return ret; } #ifdef TEST main (argc, argv) int argc; char **argv; { double d; char *p; for (argc--, argv++; argc; argc--, argv++) { d = strtod (*argv, & p); printf ("%lf [%s]\n", d, p); } } #endif