From 1c1eb30c2079dca1fc594cbcc879b2e67a719275 Mon Sep 17 00:00:00 2001 From: Tom London Date: Fri, 19 Jan 1979 22:10:34 -0500 Subject: [PATCH] Bell 32V development Work on file usr/src/libc/gen/atof.c Co-Authored-By: John Reiser Synthesized-from: 32v --- usr/src/libc/gen/atof.c | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 usr/src/libc/gen/atof.c diff --git a/usr/src/libc/gen/atof.c b/usr/src/libc/gen/atof.c new file mode 100644 index 0000000000..281890716d --- /dev/null +++ b/usr/src/libc/gen/atof.c @@ -0,0 +1,49 @@ +union { + short foo0[4]; + double big; +} bar0 /* = {0x5c80,0,0,0} */ ; /* 2**56 as double floating point */ +union { + short foo1[4]; + double huge; +} bar1 /* = {0x8000,0,0,0} */ ; /* reserved operand */ + +double atof(p) register char *p; { +register double exp,val; +register char c; register int dpdig; +int scale; char sign,esign; + +abort(); /* THE REAL ROUTINE IS atofo.s !!!!! */ +while ((c= *p++)==' '); /* skip leading spaces */ +sign=0; +if (c=='-') ++sign; /* mark negative */ +else if (c=='+') ; /* ignore plus */ +else --p; /* get back on track */ + +val=0; dpdig=0; +/* true value is aproximately ((-1)**sign) * val * (10 ** dpdig) */ +while ((c= *p++)<='9' && c>='0') + if(val='0') + if(val='0') {scale *= 10; scale += c-'0';} + if (esign) scale = -scale; +} +dpdig += scale; +if (dpdig==0) return(val); +esign=0; if (dpdig<0) {++esign; dpdig = -dpdig;} +if (dpdig>38) if (esign) return(0); else return(sign? -bar1.huge : bar1.huge); +exp=1; while (dpdig) { + if (dpdig==21) {exp *= 1.0e+21; break;} + exp *= 10; --dpdig; +} +if (esign) return(val/exp); return(val*exp); +} -- 2.20.1