|
|
1.1 root 1: /*ident "@(#)ctrans:lib/stream/flt.c 1.1.4.1" */
2: /**************************************************************************
3: Copyright (c) 1984 AT&T
4: All Rights Reserved
5:
6: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T
7:
8: The copyright notice above does not evidence any
9: actual or intended publication of such source code.
10:
11: flt.c:
12:
13: *****************************************************************************/
14:
15: #include <iostream.h>
16: #include <ctype.h>
17: #include <stdio.h>
18: #include <libc.h>
19: #include <string.h>
20:
21: #define OSTREAM ostream
22: #define ISTREAM istream
23:
24: // This file contains all the functions having to do with i/o of
25: // floats and doubles. It drags in lots of stuff from stdio, which
26: // is why I made it separate.
27:
28: istream& ISTREAM::operator>>(double& d)
29: /*
30: {+|-} d* {.} d* { e|E {+|-} d+ }
31: except that
32: - a dot must be pre- or succeeded by at least one digit
33: - an exponent must be preceded by at least one digit
34: */
35: {
36: register c = 0;
37: register anydigits = 0 ;
38: char buf[256];
39: register char* p = buf;
40: register streambuf* nbp = bp;
41:
42: if (!ipfx() ) return *this ;
43:
44: /* get the sign */
45: switch (c = nbp->sgetc()) {
46: case EOF:
47: setstate(eofbit|failbit) ;
48: return *this;
49: case '-':
50: case '+':
51: *p++ = c;
52: c = bp->snextc();
53: }
54:
55: /* get integral part */
56: while (isdigit(c)) {
57: *p++ = c;
58: c = bp->snextc();
59: anydigits = 1 ;
60: }
61:
62: /* get fraction */
63: if (c == '.') {
64: do {
65: *p++ = c;
66: c = bp->snextc();
67: anydigits = 1 ;
68: } while (isdigit(c));
69: }
70:
71: /* get exponent */
72: if ( anydigits && (c == 'e' || c == 'E')) {
73: *p++ = c;
74: switch (c = nbp->snextc()) {
75: case EOF:
76: setstate(eofbit|failbit) ;
77: return *this;
78: case '-':
79: case '+':
80: *p++ = c;
81: c = bp->snextc();
82: }
83: while (isdigit(c)) {
84: *p++ = c;
85: c = bp->snextc();
86: }
87: }
88:
89: *p = 0;
90: d = atof(buf);
91:
92: if (c == EOF) setstate(eofbit) ;
93: if (!anydigits) setstate(badbit) ;
94: return *this;
95: }
96:
97:
98: istream& ISTREAM::operator>>(float& f)
99: {
100: double d;
101:
102:
103: if (!ipfx() ) return *this ;
104:
105: *this >> d ;
106: if ( good() ) f = d;
107:
108: return *this;
109: }
110:
111: ostream& OSTREAM::operator<<(float f) { return *this << (double)f ; }
112:
113: static const int fltbits =
114: ios::scientific|ios::fixed|ios::uppercase ;
115:
116: ostream& OSTREAM::operator<<(double d)
117: {
118: char buf[32];
119: int w = width(0) ;
120: int p = precision() ;
121: int explicitp = ( p > 0 ) || (flags()&ios::fixed) ;
122: if (!opfx()) return *this;
123: long bits = flags() & fltbits ;
124: char fmt[20] ;
125: strcpy(fmt,"%") ;
126: if ( flags() & ios::showpoint ) {
127: strcat(fmt,"#") ;
128: }
129: if ( flags() & ios::showpos ) {
130: strcat(fmt,"+") ;
131: }
132: if ( explicitp ) {
133: strcat(fmt,".*") ;
134: }
135:
136: long mode = flags()
137: & (ios::scientific|ios::fixed|ios::uppercase);
138:
139: switch(mode) {
140: case ios::scientific : strcat(fmt,"e") ; break ;
141: case ios::scientific|ios::uppercase :
142: strcat(fmt,"E") ; break;
143: case ios::fixed : strcat(fmt,"f") ; break ;
144: case ios::fixed|ios::uppercase: strcat(fmt,"F") ; break ;
145: case ios::uppercase : strcat(fmt,"G") ; break ;
146: default : strcat(fmt,"g") ; break ;
147: }
148:
149: if ( explicitp ) {
150: sprintf(buf,fmt,p,d) ;
151: }
152: else {
153: sprintf(buf,fmt,d) ;
154: }
155:
156: int padf = w-strlen(buf) ;
157: if ( padf < 0 ) padf = 0 ;
158: if ( padf && !(flags()&ios::left) ) {
159: while ( padf-- > 0 ) put(fill()) ;
160: }
161: *this << buf ;
162: while ( padf-- > 0 ) put(fill()) ;
163: osfx() ;
164: return *this ;
165: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.