|
|
1.1 root 1: /*
2: Copyright (C) 1993 Free Software Foundation
3:
4: This file is part of the GNU IO Library. This library is free
5: software; you can redistribute it and/or modify it under the
6: terms of the GNU General Public License as published by the
7: Free Software Foundation; either version 2, or (at your option)
8: any later version.
9:
10: This library is distributed in the hope that it will be useful,
11: but WITHOUT ANY WARRANTY; without even the implied warranty of
12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13: GNU General Public License for more details.
14:
15: You should have received a copy of the GNU General Public License
16: along with GNU CC; see the file COPYING. If not, write to
17: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18:
19: As a special exception, if you link this library with files
20: compiled with a GNU compiler to produce an executable, this does not cause
21: the resulting executable to be covered by the GNU General Public License.
22: This exception does not however invalidate any other reasons why
23: the executable file might be covered by the GNU General Public License. */
24:
25: /* Generic or default I/O operations. */
26:
27: #include "libioP.h"
28: #include <stdlib.h>
29: #include <string.h>
30:
31: void _IO_un_link(fp)
32: _IO_FILE *fp;
33: {
34: if (fp->_flags & _IO_LINKED) {
35: _IO_FILE **f;
36: for (f = &_IO_list_all; *f != NULL; f = &(*f)->_chain) {
37: if (*f == fp) {
38: *f = fp->_chain;
39: break;
40: }
41: }
42: fp->_flags &= ~_IO_LINKED;
43: }
44: }
45:
46: void _IO_link_in(fp)
47: _IO_FILE *fp;
48: {
49: if ((fp->_flags & _IO_LINKED) == 0) {
50: fp->_flags |= _IO_LINKED;
51: fp->_chain = _IO_list_all;
52: _IO_list_all = fp;
53: }
54: }
55:
56: /* Return minimum _pos markers
57: Assumes the current get area is the main get area. */
58:
59: _IO_size_t
60: _IO_least_marker(fp)
61: register _IO_FILE *fp;
62: {
63: _IO_ssize_t least_so_far = fp->_IO_read_end - fp->_IO_read_base;
64: register struct _IO_marker *mark;
65: for (mark = fp->_markers; mark != NULL; mark = mark->_next)
66: if (mark->_pos < least_so_far)
67: least_so_far = mark->_pos;
68: return least_so_far;
69: }
70:
71: /* Switch current get area from backup buffer to (start of) main get area. */
72:
73: void
74: _IO_switch_to_main_get_area(fp)
75: _IO_FILE *fp;
76: {
77: char *tmp;
78: fp->_flags &= ~_IO_IN_BACKUP;
79: /* Swap _IO_read_end and _IO_save_end. */
80: tmp = fp->_IO_read_end; fp->_IO_read_end= fp->_IO_save_end; fp->_IO_save_end= tmp;
81: /* Swap _IO_read_base and _IO_save_base. */
82: tmp = fp->_IO_read_base; fp->_IO_read_base = fp->_IO_save_base; fp->_IO_save_base = tmp;
83: fp->_IO_read_ptr = fp->_IO_read_base;
84: }
85:
86: /* Switch current get area from main get area to (end of) backup area. */
87:
88: void
89: _IO_switch_to_backup_area(fp)
90: register _IO_FILE *fp;
91: {
92: char *tmp;
93: fp->_flags |= _IO_IN_BACKUP;
94: /* Swap _IO_read_end and _IO_save_end. */
95: tmp = fp->_IO_read_end; fp->_IO_read_end = fp->_IO_save_end; fp->_IO_save_end = tmp;
96: /* Swap _gbase and _IO_save_base. */
97: tmp = fp->_IO_read_base; fp->_IO_read_base = fp->_IO_save_base; fp->_IO_save_base = tmp;
98: fp->_IO_read_ptr = fp->_IO_read_end;
99: }
100:
101: int
102: _IO_switch_to_get_mode(fp)
103: register _IO_FILE *fp;
104: {
105: if (fp->_IO_write_ptr > fp->_IO_write_base)
106: if (fp->_jumps->__overflow(fp, EOF) == EOF)
107: return EOF;
108: if (_IO_in_backup(fp))
109: fp->_IO_read_base = fp->_aux_limit;
110: else
111: {
112: fp->_IO_read_base = fp->_IO_buf_base;
113: if (fp->_IO_write_ptr > fp->_IO_read_end)
114: fp->_IO_read_end = fp->_IO_write_ptr;
115: }
116: fp->_IO_read_ptr = fp->_IO_write_ptr;
117:
118: fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end = fp->_IO_read_ptr;
119:
120: fp->_flags &= ~_IO_CURRENTLY_PUTTING;
121: return 0;
122: }
123:
124: void
125: _IO_free_backup_area(fp)
126: register _IO_FILE *fp;
127: {
128: if (_IO_in_backup (fp))
129: _IO_switch_to_main_get_area(fp); /* Just in case. */
130: free (fp->_IO_save_base);
131: fp->_IO_save_base = NULL;
132: fp->_IO_save_end = NULL;
133: fp->_aux_limit = NULL;
134: }
135:
136: #if 0
137: int
138: _IO_switch_to_put_mode(fp)
139: register _IO_FILE *fp;
140: {
141: fp->_IO_write_base = fp->_IO_read_ptr;
142: fp->_IO_write_ptr = fp->_IO_read_ptr;
143: /* Following is wrong if line- or un-buffered? */
144: fp->_IO_write_end = fp->_flags & _IO_IN_BACKUP ? fp->_IO_read_end : fp->_IO_buf_end;
145:
146: fp->_IO_read_ptr = fp->_IO_read_end;
147: fp->_IO_read_base = fp->_IO_read_end;
148:
149: fp->_flags |= _IO_CURRENTLY_PUTTING;
150: return 0;
151: }
152: #endif
153:
154: int __overflow(f, ch)
155: _IO_FILE *f;
156: int ch;
157: {
158: return f->_jumps->__overflow(f, ch);
159: }
160:
161: int
162: __underflow(fp)
163: _IO_FILE *fp;
164: {
165: if (_IO_in_put_mode(fp))
166: if (_IO_switch_to_get_mode(fp) == EOF) return EOF;
167: if (fp->_IO_read_ptr < fp->_IO_read_end)
168: return *(unsigned char*)fp->_IO_read_ptr;
169: if (_IO_in_backup(fp))
170: {
171: _IO_switch_to_main_get_area(fp);
172: if (fp->_IO_read_ptr < fp->_IO_read_end)
173: return *fp->_IO_read_ptr;
174: }
175: if (_IO_have_markers(fp))
176: {
177: /* Append [_gbase.._IO_read_end] to backup area. */
178: int least_mark = _IO_least_marker(fp);
179: /* needed_size is how much space we need in the backup area. */
180: int needed_size = (fp->_IO_read_end - fp->_IO_read_base) - least_mark;
181: int current_Bsize = fp->_IO_save_end - fp->_IO_save_base;
182: int avail; /* Extra space available for future expansion. */
183: int delta;
184: struct _IO_marker *mark;
185: if (needed_size > current_Bsize)
186: {
187: char *new_buffer;
188: avail = 100;
189: new_buffer = (char*)malloc(avail+needed_size);
190: if (new_buffer == NULL)
191: return EOF; /* FIXME */
192: if (least_mark < 0)
193: {
194: memcpy(new_buffer + avail,
195: fp->_IO_save_end + least_mark,
196: -least_mark);
197: memcpy(new_buffer +avail - least_mark,
198: fp->_IO_read_base,
199: fp->_IO_read_end - fp->_IO_read_base);
200: }
201: else
202: memcpy(new_buffer + avail,
203: fp->_IO_read_base + least_mark,
204: needed_size);
205: free (fp->_IO_save_base);
206: fp->_IO_save_base = new_buffer;
207: fp->_IO_save_end = new_buffer + avail + needed_size;
208: }
209: else
210: {
211: avail = current_Bsize - needed_size;
212: if (least_mark < 0)
213: {
214: memmove(fp->_IO_save_base + avail,
215: fp->_IO_save_end + least_mark,
216: -least_mark);
217: memcpy(fp->_IO_save_base + avail - least_mark,
218: fp->_IO_read_base,
219: fp->_IO_read_end - fp->_IO_read_base);
220: }
221: else if (needed_size > 0)
222: memcpy(fp->_IO_save_base + avail,
223: fp->_IO_read_base + least_mark,
224: needed_size);
225: }
226: /* FIXME: Dubious arithmetic if pointers are NULL */
227: fp->_aux_limit = fp->_IO_save_base + avail;
228: /* Adjust all the streammarkers. */
229: delta = fp->_IO_read_end - fp->_IO_read_base;
230: for (mark = fp->_markers; mark != NULL; mark = mark->_next)
231: mark->_pos -= delta;
232: }
233: else if (_IO_have_backup(fp))
234: _IO_free_backup_area(fp);
235: return fp->_jumps->__underflow(fp);
236: }
237:
238: void
239: _IO_setb(f, b, eb, a)
240: _IO_FILE *f;
241: char *b;
242: char *eb;
243: int a;
244: {
245: if (f->_IO_buf_base && !(f->_flags & _IO_USER_BUF))
246: FREE_BUF(f->_IO_buf_base);
247: f->_IO_buf_base = b;
248: f->_IO_buf_end = eb;
249: if (a)
250: f->_flags &= ~_IO_USER_BUF;
251: else
252: f->_flags |= _IO_USER_BUF;
253: }
254:
255: void
256: _IO_doallocbuf(fp)
257: register _IO_FILE *fp;
258: {
259: if (fp->_IO_buf_base)
260: return;
261: if (!(fp->_flags & _IO_UNBUFFERED))
262: if (fp->_jumps->__doallocate(fp) != EOF)
263: return;
264: _IO_setb(fp, fp->_shortbuf, fp->_shortbuf+1, 0);
265: }
266:
267: int
268: _IO_default_underflow (fp)
269: _IO_FILE *fp;
270: {
271: return EOF;
272: }
273:
274: _IO_size_t
275: _IO_default_xsputn(f, data, n)
276: register _IO_FILE *f;
277: const void *data;
278: _IO_size_t n;
279: {
280: register const char *s = data;
281: register _IO_size_t more = n;
282: if (more <= 0)
283: return 0;
284: for (;;)
285: {
286: _IO_size_t count = f->_IO_write_end - f->_IO_write_ptr; /* Space available. */
287: if (count > 0)
288: {
289: if (count > more)
290: count = more;
291: if (count > 20)
292: {
293: memcpy(f->_IO_write_ptr, s, count);
294: s += count;
295: f->_IO_write_ptr += count;
296: }
297: else if (count <= 0)
298: count = 0;
299: else
300: {
301: register char *p = f->_IO_write_ptr;
302: register _IO_ssize_t i;
303: for (i = count; --i >= 0; ) *p++ = *s++;
304: f->_IO_write_ptr = p;
305: }
306: more -= count;
307: }
308: if (more == 0 || __overflow(f, (unsigned char)*s++) == EOF)
309: break;
310: more--;
311: }
312: return n - more;
313: }
314:
315: _IO_size_t
316: _IO_sgetn(fp, data, n)
317: _IO_FILE *fp;
318: void *data;
319: _IO_size_t n;
320: {
321: /* FIXME handle putback buffer here! */
322: return fp->_jumps->__xsgetn(fp, data, n);
323: }
324:
325: _IO_size_t
326: _IO_default_xsgetn(fp, data, n)
327: _IO_FILE *fp;
328: void *data;
329: _IO_size_t n;
330: {
331: register _IO_size_t more = n;
332: register char *s = data;
333: for (;;)
334: {
335: _IO_size_t count = fp->_IO_read_end - fp->_IO_read_ptr; /* Data available. */
336: if (count > 0)
337: {
338: if (count > more)
339: count = more;
340: if (count > 20)
341: {
342: memcpy(s, fp->_IO_read_ptr, count);
343: s += count;
344: fp->_IO_read_ptr += count;
345: }
346: else if (count <= 0)
347: count = 0;
348: else
349: {
350: register char *p = fp->_IO_read_ptr;
351: register int i = (int)count;
352: while (--i >= 0) *s++ = *p++;
353: fp->_IO_read_ptr = p;
354: }
355: more -= count;
356: }
357: if (more == 0 || __underflow(fp) == EOF)
358: break;
359: }
360: return n - more;
361: }
362:
363: int
364: _IO_sync(fp)
365: register _IO_FILE *fp;
366: {
367: if (fp->_IO_read_ptr == fp->_IO_read_end && fp->_IO_write_ptr == fp->_IO_write_base)
368: return 0;
369: return EOF;
370: }
371:
372: int
373: _IO_default_setbuf(fp, p, len)
374: register _IO_FILE *fp;
375: char* p;
376: _IO_ssize_t len;
377: {
378: if (fp->_jumps->__sync(fp) == EOF)
379: return EOF;
380: if (p == NULL || len == 0)
381: {
382: fp->_flags |= _IO_UNBUFFERED;
383: _IO_setb(fp, fp->_shortbuf, fp->_shortbuf+1, 0);
384: }
385: else
386: {
387: fp->_flags &= ~_IO_UNBUFFERED;
388: _IO_setb(fp, p, p+len, 0);
389: }
390: fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end = 0;
391: fp->_IO_read_base = fp->_IO_read_ptr = fp->_IO_read_end = 0;
392: return 0;
393: }
394:
395: _IO_pos_t
396: _IO_default_seekpos(fp, pos, mode)
397: _IO_FILE *fp;
398: _IO_pos_t pos;
399: _IO_seekflags mode;
400: {
401: return fp->_jumps->__seekoff(fp, _IO_pos_as_off(pos), mode);
402: }
403:
404: int
405: _IO_default_doallocate(fp)
406: _IO_FILE *fp;
407: {
408: char *buf = ALLOC_BUF(_IO_BUFSIZ);
409: if (buf == NULL)
410: return EOF;
411: _IO_setb(fp, buf, buf+_IO_BUFSIZ, 1);
412: return 1;
413: }
414:
415: void
416: _IO_init(fp, flags)
417: register _IO_FILE *fp;
418: int flags;
419: {
420: fp->_flags = _IO_MAGIC|flags;
421: fp->_IO_buf_base = NULL;
422: fp->_IO_buf_end = NULL;
423: fp->_IO_read_base = NULL;
424: fp->_IO_read_ptr = NULL;
425: fp->_IO_read_end = NULL;
426: fp->_IO_write_base = NULL;
427: fp->_IO_write_ptr = NULL;
428: fp->_IO_write_end = NULL;
429: fp->_chain = NULL; /* Not necessary. */
430:
431: fp->_IO_save_base = NULL;
432: fp->_aux_limit = NULL;
433: fp->_IO_save_end = NULL;
434: fp->_markers = NULL;
435: fp->_cur_column = 0;
436: }
437:
438: int
439: _IO_default_sync (fp)
440: _IO_FILE *fp;
441: {
442: return 0;
443: }
444:
445: void _IO_default_finish (fp)
446: _IO_FILE *fp;
447: {
448: struct _IO_marker *mark;
449: if (fp->_IO_buf_base && !(fp->_flags & _IO_USER_BUF))
450: FREE_BUF(fp->_IO_buf_base);
451:
452: for (mark = fp->_markers; mark != NULL; mark = mark->_next)
453: mark->_sbuf = NULL;
454:
455: free (fp->_IO_save_base);
456:
457: _IO_un_link(fp);
458: }
459:
460: _IO_pos_t
461: _IO_default_seekoff(fp, offset, mode)
462: register _IO_FILE *fp;
463: _IO_off_t offset;
464: _IO_seekflags mode;
465: {
466: return _IO_pos_BAD;
467: }
468:
469: int
470: _IO_sputbackc(fp, c) /* ungetc(c, fp) */
471: register _IO_FILE *fp;
472: int c;
473: {
474: if (fp->_IO_read_ptr > fp->_IO_read_base
475: && (unsigned char)fp->_IO_read_ptr[-1] == (unsigned char)c)
476: {
477: fp->_IO_read_ptr--;
478: return (unsigned char)c;
479: }
480: return fp->_jumps->__pbackfail(fp, c);
481: }
482:
483: int
484: _IO_sungetc(fp)
485: register _IO_FILE *fp;
486: {
487: if (fp->_IO_read_ptr > fp->_IO_read_base)
488: {
489: fp->_IO_read_ptr--;
490: return (unsigned char)*fp->_IO_read_ptr;
491: }
492: else
493: return fp->_jumps->__pbackfail(fp, EOF);
494: }
495:
496: #if 0 /* Work in progress */
497: void
498: _IO_set_column(fp, c)
499: register _IO_FILE *fp;
500: int c;
501: {
502: if (c == -1)
503: fp->_collumn = -1;
504: else
505: fp->_collumn = c - (fp->_IO_write_ptr - fp->_IO_write_base);
506: }
507: #else
508: int
509: _IO_set_column(fp, i)
510: register _IO_FILE *fp;
511: int i;
512: {
513: fp->_cur_column = i+1;
514: return 0;
515: }
516: #endif
517:
518:
519: unsigned
520: _IO_adjust_column(start, line, count)
521: unsigned start;
522: const char *line;
523: int count;
524: {
525: register const char *ptr = line + count;
526: while (ptr > line)
527: if (*--ptr == '\n')
528: return line + count - ptr - 1;
529: return start + count;
530: }
531:
532: int
533: _IO_get_column(fp)
534: register _IO_FILE *fp;
535: {
536: if (fp->_cur_column)
537: return _IO_adjust_column(fp->_cur_column - 1,
538: fp->_IO_write_base,
539: fp->_IO_write_ptr - fp->_IO_write_base);
540: return -1;
541: }
542:
543: int
544: _IO_flush_all()
545: {
546: int result = 0;
547: _IO_FILE *fp;
548: for (fp = _IO_list_all; fp != NULL; fp = fp->_chain)
549: if (fp->_jumps->__overflow(fp, EOF) == EOF)
550: result = EOF;
551: return result;
552: }
553:
554: void
555: _IO_flush_all_linebuffered()
556: {
557: _IO_FILE *fp;
558: for (fp = _IO_list_all; fp != NULL; fp = fp->_chain)
559: if (fp->_flags & _IO_LINE_BUF)
560: fp->_jumps->__overflow(fp, EOF);
561: }
562:
563: void _IO_init_marker(marker, fp)
564: struct _IO_marker *marker;
565: _IO_FILE *fp;
566: {
567: marker->_sbuf = fp;
568: if (_IO_in_put_mode(fp))
569: _IO_switch_to_get_mode(fp);
570: if (_IO_in_backup(fp))
571: marker->_pos = fp->_IO_read_ptr - fp->_IO_read_end;
572: else
573: marker->_pos = fp->_IO_read_ptr - fp->_IO_read_base;
574:
575: /* Should perhaps sort the chain? */
576: marker->_next = fp->_markers;
577: fp->_markers = marker;
578: }
579:
580: void
581: _IO_remove_marker (marker)
582: register struct _IO_marker * marker;
583: {
584: /* Unlink from sb's chain. */
585: register struct _IO_marker **ptr = &marker->_sbuf->_markers;
586: for (; ; ptr = &(*ptr)->_next)
587: {
588: if (*ptr == NULL)
589: break;
590: else if (*ptr == marker)
591: {
592: *ptr = marker->_next;
593: return;
594: }
595: }
596: #if 0
597: if _sbuf has a backup area that is no longer needed, should we delete
598: it now, or wait until the next underflow?
599: #endif
600: }
601:
602: #define BAD_DELTA EOF
603:
604: int
605: _IO_marker_difference(mark1, mark2)
606: struct _IO_marker *mark1;
607: struct _IO_marker *mark2;
608: {
609: return mark1->_pos - mark2->_pos;
610: }
611:
612: /* Return difference between MARK and current posistion of MARK's stream. */
613: int
614: _IO_marker_delta(mark)
615: struct _IO_marker *mark;
616: {
617: int cur_pos;
618: if (mark->_sbuf == NULL)
619: return BAD_DELTA;
620: if (_IO_in_backup(mark->_sbuf))
621: cur_pos = mark->_sbuf->_IO_read_ptr - mark->_sbuf->_IO_read_end;
622: else
623: cur_pos = mark->_sbuf->_IO_read_ptr - mark->_sbuf->_IO_read_base;
624: return mark->_pos - cur_pos;
625: }
626:
627: int _IO_seekmark(fp, mark, delta)
628: _IO_FILE *fp;
629: struct _IO_marker *mark;
630: int delta;
631: {
632: if (mark->_sbuf != fp)
633: return EOF;
634: if (mark->_pos >= 0)
635: {
636: if (_IO_in_backup(fp))
637: _IO_switch_to_main_get_area(fp);
638: fp->_IO_read_ptr = fp->_IO_read_base + mark->_pos;
639: }
640: else
641: {
642: if (!_IO_in_backup(fp))
643: _IO_switch_to_backup_area(fp);
644: fp->_IO_read_ptr = fp->_IO_read_end + mark->_pos;
645: }
646: return 0;
647: }
648:
649: void _IO_unsave_markers(fp)
650: register _IO_FILE *fp;
651: {
652: register struct _IO_marker *mark = fp->_markers;
653: if (mark)
654: {
655: #ifdef TODO
656: streampos offset = seekoff(0, ios::cur, ios::in);
657: if (offset != EOF)
658: {
659: offset += eGptr() - Gbase();
660: for ( ; mark != NULL; mark = mark->_next)
661: mark->set_streampos(mark->_pos + offset);
662: }
663: else
664: {
665: for ( ; mark != NULL; mark = mark->_next)
666: mark->set_streampos(EOF);
667: }
668: #endif
669: fp->_markers = 0;
670: }
671:
672: _IO_free_backup_area(fp);
673: }
674:
675: int
676: _IO_nobackup_pbackfail(fp, c)
677: register _IO_FILE *fp;
678: int c;
679: {
680: if (fp->_IO_read_ptr > fp->_IO_read_base)
681: fp->_IO_read_ptr--;
682: if (c != EOF && *fp->_IO_read_ptr != c)
683: *fp->_IO_read_ptr = c;
684: return (unsigned char)c;
685: }
686:
687: int
688: _IO_default_pbackfail(fp, c)
689: register _IO_FILE *fp;
690: int c;
691: {
692: if (fp->_IO_read_ptr <= fp->_IO_read_base)
693: {
694: /* Need to handle a filebuf in write mode (switch to read mode). FIXME!*/
695: if (_IO_have_backup(fp) && !_IO_in_backup(fp))
696: _IO_switch_to_backup_area(fp);
697:
698: if (!_IO_have_backup(fp))
699: {
700: /* No backup buffer: allocate one. */
701: /* Use nshort buffer, if unused? (probably not) FIXME */
702: int backup_size = 128;
703: char *bbuf = (char*)malloc(backup_size);
704: if (bbuf == NULL)
705: return EOF;
706: fp->_IO_save_base = bbuf;
707: fp->_IO_save_end = fp->_IO_save_base + backup_size;
708: fp->_aux_limit = fp->_IO_save_end;
709: _IO_switch_to_backup_area(fp);
710: }
711: else if (fp->_IO_read_ptr <= fp->_IO_read_base)
712: {
713: /* Increase size of existing backup buffer. */
714: _IO_size_t new_size;
715: _IO_size_t old_size = fp->_IO_read_end - fp->_IO_read_base;
716: char *new_buf;
717: new_size = 2 * old_size;
718: new_buf = (char*)malloc(new_size);
719: if (new_buf == NULL)
720: return EOF;
721: memcpy(new_buf+(new_size-old_size), fp->_IO_read_base, old_size);
722: free (fp->_IO_read_base);
723: _IO_setg(fp,
724: new_buf, new_buf+(new_size-old_size), new_buf+new_size);
725: fp->_aux_limit = fp->_IO_read_ptr;
726: }
727: }
728: fp->_IO_read_ptr--;
729: if (c != EOF && *fp->_IO_read_ptr != c)
730: *fp->_IO_read_ptr = c;
731: return (unsigned char)*fp->_IO_read_ptr;
732: }
733:
734: _IO_pos_t
735: _IO_default_seek(fp, offset, dir)
736: _IO_FILE *fp;
737: _IO_off_t offset;
738: int dir;
739: {
740: return _IO_pos_BAD;
741: }
742:
743: int
744: _IO_default_stat(fp, st)
745: _IO_FILE *fp;
746: void* st;
747: {
748: return EOF;
749: }
750:
751: _IO_ssize_t
752: _IO_default_read(fp, data, n)
753: register _IO_FILE* fp;
754: void* data;
755: _IO_ssize_t n;
756: {
757: return -1;
758: }
759:
760: _IO_ssize_t
761: _IO_default_write(fp, data, n)
762: register _IO_FILE* fp;
763: const void* data;
764: _IO_ssize_t n;
765: {
766: return 0;
767: }
768:
769:
770: #ifdef TODO
771: #if defined(linux)
772: #define IO_CLEANUP ;
773: #endif
774:
775: #ifdef IO_CLEANUP
776: IO_CLEANUP
777: #else
778: struct __io_defs {
779: __io_defs() { }
780: ~__io_defs() { _IO_flush_all(); }
781: };
782: __io_defs io_defs__;
783: #endif
784:
785: #endif /* TODO */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.