1 /************************************************************************/
2 /* */
3 /* Simplification of stdio: Input. */
4 /* */
5 /************************************************************************/
6
7 # include "appUtilConfig.h"
8
9 # include <stdlib.h>
10 # include <string.h>
11
12 # include "sioGeneral.h"
13 # include <appDebugon.h>
14
15 /************************************************************************/
16 /* */
17 /* Input... */
18 /* */
19 /************************************************************************/
20
sioInFillBuffer(SimpleInputStream * sis)21 int sioInFillBuffer( SimpleInputStream * sis )
22 {
23 int got;
24
25 if ( sis->sisN > 0 )
26 { sis->sisN--; return *(sis->sisP++); }
27
28 got= (*sis->sisReadBytes)( sis->sisPrivate, sis->sisBuffer, SIOsizBUF );
29
30 if ( got <= 0 )
31 { return EOF; }
32
33 sis->sisBytesRead += got;
34 sis->sisN= got;
35 sis->sisP= sis->sisBuffer;
36
37 sis->sisN--; return *(sis->sisP++);
38 }
39
sioInUngetLastRead(SimpleInputStream * sis)40 int sioInUngetLastRead( SimpleInputStream * sis )
41 {
42 if ( sis->sisP == sis->sisBuffer )
43 { LLDEB(sis->sisN,SIOsizBUF); return -1; }
44
45 sis->sisN++; sis->sisP--;
46
47 return 0;
48 }
49
sioInClose(SimpleInputStream * sis)50 int sioInClose( SimpleInputStream * sis )
51 {
52 int ret;
53
54 ret= (*sis->sisClose)( sis->sisPrivate );
55
56 free( sis );
57
58 return ret;
59 }
60
sioInGetBytesRead(SimpleInputStream * sis)61 long sioInGetBytesRead( SimpleInputStream * sis )
62 { return sis->sisBytesRead- sis->sisN; }
63
sioInOpen(void * specific,SIOinREADBYTES readBytes,SIOinCLOSE closeIt)64 SimpleInputStream * sioInOpen( void * specific,
65 SIOinREADBYTES readBytes,
66 SIOinCLOSE closeIt )
67 {
68 SimpleInputStream * sis;
69
70 sis= (SimpleInputStream *)malloc( sizeof(SimpleInputStream) );
71 if ( ! sis )
72 { XDEB(sis); return sis; }
73
74 sis->sisBytesRead= 0;
75 sis->sisN= 0;
76 sis->sisP= sis->sisBuffer;
77 sis->sisPrivate= specific;
78
79 sis->sisReadBytes= readBytes;
80 sis->sisClose= closeIt;
81
82 return sis;
83 }
84
sioInGetString(char * s,int size,SimpleInputStream * sis)85 char * sioInGetString( char * s,
86 int size,
87 SimpleInputStream * sis )
88 {
89 int c;
90 char * to= s;
91
92 if ( size == 0 )
93 { LDEB(size); return (char *)0; }
94 if ( size == 1 )
95 { LDEB(size); *s= '\0'; return s; }
96
97 c= sioInGetByte( sis );
98 if ( c == EOF )
99 { return (char *)0; }
100
101 while( size-- > 1 )
102 {
103 *(to++)= c;
104
105 if ( c == '\n' )
106 { break; }
107
108 c= sioInGetByte( sis );
109 if ( c == EOF )
110 { break; }
111 }
112
113 *to= '\0';
114
115 return s;
116 }
117
sioInReadBytes(SimpleInputStream * sis,unsigned char * buf,int count)118 int sioInReadBytes( SimpleInputStream * sis,
119 unsigned char * buf,
120 int count )
121 {
122 int done= 0;
123
124 while( done < count )
125 {
126 int todo;
127 int c;
128
129 c= sioInGetByte( sis );
130
131 if ( c == EOF )
132 { break; }
133
134 *(buf++)= c;
135 done++;
136
137 todo= count- done;
138 if ( todo > sis->sisN )
139 { todo= sis->sisN; }
140
141 memcpy( buf, sis->sisP, todo );
142
143 buf += todo; sis->sisP += todo; sis->sisN -= todo;
144 done += todo;
145 }
146
147 return done;
148 }
149
150