|
|
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.