1 /* Copyrigth 1993 H.Ogasawara (COR.) */
2 
3 #include	"config.h"
4 
5 #if DELCTRL
6 static unsigned char	ctrlmap[]={
7 	1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,
8 	1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
9 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
10 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
11 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
12 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
13 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
14 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,
15 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
16 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
17 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
18 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
19 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
20 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
21 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
22 	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
23 };
24 #endif
25 
26 
27 
28 #if HUMANFIO
29 /* ============================================= */
30 
31 #if SYSDOSLIB
32 #  include	<sys_doslib.h>
33 #else
34 #  include	<doslib.h>
35 #endif
36 #include	"microfio.h"
37 
38 #if MVOLENC
Merr(msg)39 Merr( msg )
40 char	*msg;
41 {
42 	FPUTS( msg, 2 );
43 }
44 #endif
45 
Mopen(fm,name)46 Mopen( fm, name )
47 m_file	*fm;
48 unsigned char	*name;
49 {
50 	if( *name == '-' && !name[1] ){
51 		fm->fn= 0;
52 	}else if( (fm->fn= OPEN( name, 0 )) < 0 )
53 		return	0;
54 	fm->limit= 0;
55 	return	1;
56 }
57 
Mcreate(fm,name)58 Mcreate( fm, name )
59 m_file	*fm;
60 unsigned char	*name;
61 {
62 	if( *name == '-' && !name[1] ){
63 		fm->fn= 1;
64 #if !MVOLENC
65 	}else if( (fm->fn= CREATE( (void*)getfname(name), 0x20 )) < 0 )
66 #else
67 	}else if( (fm->fn= CREATE( name, 0x20 )) < 0 )
68 #endif
69 		return	0;
70 	fm->ptr= fm->buf;
71 	fm->limit= fm->buf+MFBUFSIZE;
72 	return	1;
73 }
74 
75 #if !MVOLENC
Mappend(fm,name)76 Mappend( fm, name )
77 m_file	*fm;
78 unsigned char	*name;
79 {
80 	if( CHMOD( name, -1 ) < 0 )
81 		return	Mcreate( fm, name );
82 	if( (fm->fn= OPEN( name, 1 )) < 0 )
83 		return	0;
84 /*	SEEK( fm->fn, 0, 2 );*/
85 	fm->ptr= fm->buf;
86 	fm->limit= fm->buf+MFBUFSIZE;
87 	return	1;
88 }
89 
Mseek(fm,pos,mode)90 Mseek( fm, pos, mode )
91 m_file	*fm;
92 {
93 	int	p= SEEK( fm->fn, pos, mode );
94 	if( p < 0 ){
95 		p= SEEK( fm->fn, 0, 2 );
96 		for(; pos > p+MFBUFSIZE ; p+= MFBUFSIZE )
97 			WRITE( fm->fn, fm, MFBUFSIZE );
98 		WRITE( fm->fn, fm, pos-p );
99 	}
100 }
101 #endif	/* MVOLENC */
102 
Mclose(fm)103 Mclose( fm )
104 m_file	*fm;
105 {
106 	if( fm->fn >= 3 )
107 		return	CLOSE( fm->fn );
108 }
109 
Mread(fm,buf,len)110 Mread( fm, buf, len )
111 m_file	*fm;
112 unsigned char	*buf;
113 unsigned int	len;
114 {
115 	unsigned char	*str= buf,
116 			*ptr;
117 	for( ptr= fm->ptr ; len-- ;){
118 		if( ptr >= fm->limit ){
119 			int	size= READ( fm->fn, ptr= fm->buf, MFBUFSIZE );
120 			if( size <= 0 ){
121 				fm->limit= 0;
122 				break;
123 			}
124 			fm->limit= fm->buf+ size;
125 		}
126 		*str++= *ptr++;
127 	}
128 	fm->ptr= ptr;
129 	return	str-buf;
130 }
131 
132 #if !MVOLENC
Mgets(fm,buf,len)133 Mgets( fm, buf, len )
134 m_file	*fm;
135 unsigned char	*buf;
136 unsigned int	len;
137 {
138 	unsigned char	*str= buf,
139 			*ptr;
140 	for( ptr= fm->ptr ; len-- ; ptr++ ){
141 		if( ptr >= fm->limit ){
142 			int	size= READ( fm->fn, ptr= fm->buf, MFBUFSIZE );
143 			if( size <= 0 )
144 				return	0;
145 			fm->limit= fm->buf+ size;
146 		}
147 		if( *ptr == '\n' ){
148 			ptr++;
149 			break;
150 		}
151 #if DELCTRL
152 		if( !ctrlmap[*ptr] )
153 #else
154 		if( *ptr != '\r' )
155 #endif
156 			*str++= *ptr;
157 	}
158 	*str= '\0';
159 	fm->ptr= ptr;
160 	return	str-buf+1;
161 }
162 #endif /* MVOLENC */
163 
Mwrite(fm,ptr,len)164 Mwrite( fm, ptr, len )
165 m_file	*fm;
166 unsigned char	*ptr;
167 {
168 	unsigned char	*str;
169 	int		ret= 1;
170 	for( str= fm->ptr ; len-- ;){
171 		if( str >= fm->limit )
172 			ret= WRITE( fm->fn, str= fm->buf,MFBUFSIZE)>=MFBUFSIZE;
173 		*str++= *ptr++;
174 	}
175 	fm->ptr= str;
176 	return	ret;
177 }
178 
179 #if !MVOLENC
Mputs(fm,ptr)180 Mputs( fm, ptr )
181 m_file	*fm;
182 unsigned char	*ptr;
183 {
184 	unsigned char	*str;
185 	int		ret= 1;
186 	for( str= fm->ptr ; *ptr ;){
187 		if( str >= fm->limit )
188 			ret= WRITE( fm->fn, str= fm->buf,MFBUFSIZE)>=MFBUFSIZE;
189 		*str++= *ptr++;
190 	}
191 	fm->ptr= str;
192 	return	ret;
193 }
194 
Misfile(fm)195 Misfile( fm )
196 m_file	*fm;
197 {
198 	return	fm->fn >= 3;	/* 5 */
199 }
200 #endif /* MVOLENC */
201 
Mflush(fm)202 Mflush( fm )
203 m_file	*fm;
204 {
205 	if( fm->ptr > fm->buf ){
206 		WRITE( fm->fn, fm->buf, fm->ptr - fm->buf );
207 		fm->ptr= fm->buf;
208 	}
209 }
210 
211 #if !MVOLENC
Maccess(name)212 Maccess( name )
213 char	*name;
214 {
215 	return	CHMOD( name, -1 ) >= 0;
216 }
217 #endif
218 
219 
220 #else	/* HUMANFIO */
221 /* ============================================= */
222 /* Normal - file I/O rourtine */
223 #include	"microfio.h"
224 
225 #if NOERR
226 int	noerrflag= 0;
227 #endif
228 
229 void
Mputchar(ch)230 Mputchar( ch )
231 char	ch;
232 {
233 #if UNIX
234 	if( ch == '\r' )
235 		return;
236 #endif
237 	putchar( ch );
238 }
239 
240 void
Merrch(ch)241 Merrch( ch )
242 char	ch;
243 {
244 #if UNIX
245 	if( ch == '\r' )
246 		return;
247 #endif
248 #if NOERR
249 	if( !noerrflag )
250 #endif
251 		putc( ch, stderr );
252 }
253 
254 
Mprint(ptr)255 Mprint( ptr )
256 char	*ptr;
257 {
258 	for(; *ptr ; Mputchar( *ptr++ ) );
259 }
260 
Merr(ptr)261 Merr( ptr )
262 char	*ptr;
263 {
264 	for(; *ptr ; Merrch( *ptr++ ) );
265 }
266 
Mopen(fm,name)267 Mopen( fm, name )
268 m_file	*fm;
269 char	*name;
270 {
271 	if( *name == '-' && !name[1] ){
272 		fm->fp= stdin;
273 		fm->fn= fileno( stdin );
274 		return	1;
275 	}else if( fm->fp= fopen( name, BROPEN ) ){
276 		fm->fn= fileno( fm->fp );
277 		return	1;
278 	}
279 	return	0;
280 }
281 
Mcreate(fm,name)282 Mcreate( fm, name )
283 m_file	*fm;
284 char	*name;
285 {
286 	if( *name == '-' && !name[1] ){
287 		fm->fp= stdout;
288 		fm->fn= fileno( stdout );
289 		return	1;
290 #if !MVOLENC
291 	}else if( fm->fp= fopen( getfname(name), BWOPEN ) ){
292 #else
293 	}else if( fm->fp= fopen( name, BWOPEN ) ){
294 #endif
295 		fm->fn= fileno( fm->fp );
296 		return	1;
297 	}
298 	return	0;
299 }
300 
Mappend(fm,name)301 Mappend( fm, name )
302 m_file	*fm;
303 char	*name;
304 {
305 	if( access( name, 0 /*F_OK*/ ) < 0 )
306 		return	Mcreate( fm, name );
307 	if( fm->fp= fopen( name, BRWOPEN ) ){
308 		fm->fn= fileno( fm->fp );
309 		return	1;
310 	}
311 	return	0;
312 }
313 
Mclose(fm)314 Mclose( fm )
315 m_file	*fm;
316 {
317 	if( fm->fp != stdin && fm->fp != stdout )
318 		return	fclose( fm->fp );
319 }
320 
Mread(fm,buf,len)321 Mread( fm, buf, len )
322 m_file	*fm;
323 char	*buf;
324 {
325 	int	size= fread( buf, 1, len, fm->fp );
326 	return	size;
327 }
328 
329 #define	RDBUFSIZE	1024
Mgets(fm,buf,len)330 Mgets( fm, buf, len )
331 m_file	*fm;
332 unsigned char	*buf;
333 {
334 	unsigned char	readbuf[RDBUFSIZE];
335 	if( fgets( readbuf, RDBUFSIZE, fm->fp ) ){
336 		unsigned char	*str= buf,
337 				*ptr= readbuf;
338 		for(; *ptr && *ptr != '\r' && *ptr != '\n' ; ptr++ ){
339 #if DELCTRL
340 			if( !ctrlmap[*ptr] )
341 #endif
342 				*str++= *ptr;
343 		}
344 		*str= '\0';
345 		return	strlen( buf )+1;
346 	}
347 	return	0;
348 }
349 
Mwrite(fm,ptr,len)350 Mwrite( fm, ptr, len )
351 m_file	*fm;
352 char	*ptr;
353 {
354 	return	fwrite( ptr, 1, len, fm->fp ) >= len;
355 }
356 
Mputs(fm,ptr)357 Mputs( fm, ptr )
358 m_file	*fm;
359 char	*ptr;
360 {
361 #if UNIX
362 	for(; *ptr ; ptr++ ){
363 		if( *ptr != '\r' )
364 			putc( *ptr, fm->fp );
365 	}
366 #else
367 	fputs( ptr, fm->fp );
368 #endif
369 	return	1;
370 }
371 
Mflush(fm)372 Mflush( fm )
373 m_file	*fm;
374 {
375 	fflush( fm->fp );
376 }
377 
Mseek(fm,pos,mode)378 Mseek( fm, pos, mode )
379 m_file	*fm;
380 {
381 	fseek( fm->fp, pos, mode );
382 }
383 
Misfile(fm)384 Misfile( fm )
385 m_file	*fm;
386 {
387 	return	fm->fn >= 3;	/* tenuki */
388 }
389 
390 #if !MVOLENC
Maccess(name)391 Maccess( name )
392 {
393 	return	!access( name, 0 );
394 }
395 #endif
396 
397 #endif	/* !HUMANFIO */
398