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