📄 genops.c
字号:
return fp;}_IO_pos_t_IO_default_seekpos (fp, pos, mode) _IO_FILE *fp; _IO_pos_t pos; int mode;{ return _IO_SEEKOFF (fp, _IO_pos_as_off (pos), 0, mode);}int_IO_default_doallocate (fp) _IO_FILE *fp;{ char *buf; ALLOC_BUF (buf, _IO_BUFSIZ, EOF); _IO_setb (fp, buf, buf+_IO_BUFSIZ, 1); return 1;}void_IO_init (fp, flags) _IO_FILE *fp; int flags;{ fp->_flags = _IO_MAGIC|flags; fp->_IO_buf_base = NULL; fp->_IO_buf_end = NULL; fp->_IO_read_base = NULL; fp->_IO_read_ptr = NULL; fp->_IO_read_end = NULL; fp->_IO_write_base = NULL; fp->_IO_write_ptr = NULL; fp->_IO_write_end = NULL; fp->_chain = NULL; /* Not necessary. */ fp->_IO_save_base = NULL; fp->_IO_backup_base = NULL; fp->_IO_save_end = NULL; fp->_markers = NULL; fp->_cur_column = 0;#ifdef _IO_MTSAFE_IO _IO_lock_init (*fp->_lock);#endif}int_IO_default_sync (fp) _IO_FILE *fp;{ return 0;}/* The way the C++ classes are mapped into the C functions in the current implementation, this function can get called twice! */void_IO_default_finish (fp, dummy) _IO_FILE *fp; int dummy;{ struct _IO_marker *mark; if (fp->_IO_buf_base && !(fp->_flags & _IO_USER_BUF)) { FREE_BUF (fp->_IO_buf_base, _IO_blen (fp)); fp->_IO_buf_base = fp->_IO_buf_end = NULL; } for (mark = fp->_markers; mark != NULL; mark = mark->_next) mark->_sbuf = NULL; if (fp->_IO_save_base) { free (fp->_IO_save_base); fp->_IO_save_base = NULL; }#ifdef _IO_MTSAFE_IO _IO_lock_fini (*fp->_lock);#endif _IO_un_link (fp);}_IO_pos_t_IO_default_seekoff (fp, offset, dir, mode) _IO_FILE *fp; _IO_off_t offset; int dir; int mode;{ return _IO_pos_BAD;}int_IO_sputbackc (fp, c) _IO_FILE *fp; int c;{ int result; if (fp->_IO_read_ptr > fp->_IO_read_base && (unsigned char)fp->_IO_read_ptr[-1] == (unsigned char)c) { fp->_IO_read_ptr--; result = (unsigned char) c; } else result = _IO_PBACKFAIL (fp, c); if (result != EOF) fp->_flags &= ~_IO_EOF_SEEN; return result;}int_IO_sungetc (fp) _IO_FILE *fp;{ int result; if (fp->_IO_read_ptr > fp->_IO_read_base) { fp->_IO_read_ptr--; result = (unsigned char) *fp->_IO_read_ptr; } else result = _IO_PBACKFAIL (fp, EOF); if (result != EOF) fp->_flags &= ~_IO_EOF_SEEN; return result;}#if 0 /* Work in progress *//* Seems not to be needed. */#if 0void_IO_set_column (fp, c) _IO_FILE *fp; int c;{ if (c == -1) fp->_column = -1; else fp->_column = c - (fp->_IO_write_ptr - fp->_IO_write_base);}#elseint_IO_set_column (fp, i) _IO_FILE *fp; int i;{ fp->_cur_column = i + 1; return 0;}#endif#endifunsigned_IO_adjust_column (start, line, count) unsigned start; const char *line; int count;{ const char *ptr = line + count; while (ptr > line) if (*--ptr == '\n') return line + count - ptr - 1; return start + count;}#if 0/* Seems not to be needed. --drepper */int_IO_get_column (fp) _IO_FILE *fp;{ if (fp->_cur_column) return _IO_adjust_column (fp->_cur_column - 1, fp->_IO_write_base, fp->_IO_write_ptr - fp->_IO_write_base); return -1;}#endifint_IO_flush_all (){ int result = 0; _IO_FILE *fp; for (fp = _IO_list_all; fp != NULL; fp = fp->_chain) if (fp->_IO_write_ptr > fp->_IO_write_base && _IO_OVERFLOW (fp, EOF) == EOF) result = EOF; return result;}void_IO_flush_all_linebuffered (){ _IO_FILE *fp; for (fp = _IO_list_all; fp != NULL; fp = fp->_chain) if ((fp->_flags & _IO_NO_WRITES) == 0 && fp->_flags & _IO_LINE_BUF) _IO_OVERFLOW (fp, EOF);}static void _IO_unbuffer_all __P ((void));static void_IO_unbuffer_all (){ _IO_FILE *fp; for (fp = _IO_list_all; fp != NULL; fp = fp->_chain) if (! (fp->_flags & _IO_UNBUFFERED)) _IO_SETBUF (fp, NULL, 0);}void_IO_cleanup (){ _IO_flush_all (); /* We currently don't have a reliable mechanism for making sure that C++ static destructors are executed in the correct order. So it is possible that other static destructors might want to write to cout - and they're supposed to be able to do so. The following will make the standard streambufs be unbuffered, which forces any output from late destructors to be written out. */ _IO_unbuffer_all ();}void_IO_init_marker (marker, fp) struct _IO_marker *marker; _IO_FILE *fp;{ marker->_sbuf = fp; if (_IO_in_put_mode (fp)) _IO_switch_to_get_mode (fp); if (_IO_in_backup (fp)) marker->_pos = fp->_IO_read_ptr - fp->_IO_read_end; else marker->_pos = fp->_IO_read_ptr - fp->_IO_read_base; /* Should perhaps sort the chain? */ marker->_next = fp->_markers; fp->_markers = marker;}void_IO_remove_marker (marker) struct _IO_marker *marker;{ /* Unlink from sb's chain. */ struct _IO_marker **ptr = &marker->_sbuf->_markers; for (; ; ptr = &(*ptr)->_next) { if (*ptr == NULL) break; else if (*ptr == marker) { *ptr = marker->_next; return; } }#if 0 if _sbuf has a backup area that is no longer needed, should we delete it now, or wait until the next underflow?#endif}#define BAD_DELTA EOFint_IO_marker_difference (mark1, mark2) struct _IO_marker *mark1; struct _IO_marker *mark2;{ return mark1->_pos - mark2->_pos;}/* Return difference between MARK and current position of MARK's stream. */int_IO_marker_delta (mark) struct _IO_marker *mark;{ int cur_pos; if (mark->_sbuf == NULL) return BAD_DELTA; if (_IO_in_backup (mark->_sbuf)) cur_pos = mark->_sbuf->_IO_read_ptr - mark->_sbuf->_IO_read_end; else cur_pos = mark->_sbuf->_IO_read_ptr - mark->_sbuf->_IO_read_base; return mark->_pos - cur_pos;}int_IO_seekmark (fp, mark, delta) _IO_FILE *fp; struct _IO_marker *mark; int delta;{ if (mark->_sbuf != fp) return EOF; if (mark->_pos >= 0) { if (_IO_in_backup (fp)) _IO_switch_to_main_get_area (fp); fp->_IO_read_ptr = fp->_IO_read_base + mark->_pos; } else { if (!_IO_in_backup (fp)) _IO_switch_to_backup_area (fp); fp->_IO_read_ptr = fp->_IO_read_end + mark->_pos; } return 0;}void_IO_unsave_markers (fp) _IO_FILE *fp;{ struct _IO_marker *mark = fp->_markers; if (mark) {#ifdef TODO streampos offset = seekoff (0, ios::cur, ios::in); if (offset != EOF) { offset += eGptr () - Gbase (); for ( ; mark != NULL; mark = mark->_next) mark->set_streampos (mark->_pos + offset); } else { for ( ; mark != NULL; mark = mark->_next) mark->set_streampos (EOF); }#endif fp->_markers = 0; } if (_IO_have_backup (fp)) _IO_free_backup_area (fp);}#if 0/* Seems not to be needed. --drepper */int_IO_nobackup_pbackfail (fp, c) _IO_FILE *fp; int c;{ if (fp->_IO_read_ptr > fp->_IO_read_base) fp->_IO_read_ptr--; if (c != EOF && *fp->_IO_read_ptr != c) *fp->_IO_read_ptr = c; return (unsigned char) c;}#endifint_IO_default_pbackfail (fp, c) _IO_FILE *fp; int c;{ if (fp->_IO_read_ptr <= fp->_IO_read_base) { /* Need to handle a filebuf in write mode (switch to read mode). FIXME!*/ if (_IO_have_backup (fp) && !_IO_in_backup (fp)) _IO_switch_to_backup_area (fp); if (!_IO_have_backup (fp)) { /* No backup buffer: allocate one. */ /* Use nshort buffer, if unused? (probably not) FIXME */ int backup_size = 128; char *bbuf = (char *) malloc (backup_size); if (bbuf == NULL) return EOF; fp->_IO_save_base = bbuf; fp->_IO_save_end = fp->_IO_save_base + backup_size; fp->_IO_backup_base = fp->_IO_save_end; _IO_switch_to_backup_area (fp); } else if (fp->_IO_read_ptr <= fp->_IO_read_base) { /* Increase size of existing backup buffer. */ _IO_size_t new_size; _IO_size_t old_size = fp->_IO_read_end - fp->_IO_read_base; char *new_buf; new_size = 2 * old_size; new_buf = (char *) malloc (new_size); if (new_buf == NULL) return EOF; memcpy (new_buf + (new_size - old_size), fp->_IO_read_base, old_size); free (fp->_IO_read_base); _IO_setg (fp, new_buf, new_buf + (new_size - old_size), new_buf + new_size); fp->_IO_backup_base = fp->_IO_read_ptr; } } --fp->_IO_read_ptr; if (c != EOF && *fp->_IO_read_ptr != c) *fp->_IO_read_ptr = c; return (unsigned char) *fp->_IO_read_ptr;}_IO_pos_t_IO_default_seek (fp, offset, dir) _IO_FILE *fp; _IO_off_t offset; int dir;{ return _IO_pos_BAD;}int_IO_default_stat (fp, st) _IO_FILE *fp; void* st;{ return EOF;}_IO_ssize_t_IO_default_read (fp, data, n) _IO_FILE* fp; void *data; _IO_ssize_t n;{ return -1;}_IO_ssize_t_IO_default_write (fp, data, n) _IO_FILE *fp; const void *data; _IO_ssize_t n;{ return 0;}#ifdef TODO#if defined(linux)#define IO_CLEANUP ;#endif#ifdef IO_CLEANUP IO_CLEANUP#elsestruct __io_defs { __io_defs() { } ~__io_defs() { _IO_cleanup (); }};__io_defs io_defs__;#endif#endif /* TODO */#ifdef weak_aliasweak_alias (_IO_cleanup, _cleanup)#endif#ifdef text_set_elementtext_set_element(__libc_atexit, _cleanup);#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -