Annotation of GNUtools/libg++/libio/genops.c, revision 1.1.1.1

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 */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.