|
|
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: #include <iostream.h> ! 26: ! 27: static int __xalloc = 0; ! 28: ! 29: int ios::xalloc() ! 30: { ! 31: return __xalloc++; ! 32: } ! 33: ! 34: static ios::fmtflags __used_fmt_flags ! 35: = ios::skipws | ios::left | ios::right | ios::internal ! 36: | ios::dec | ios::oct | ios::hex | ios::showbase | ios::showpoint ! 37: | ios::uppercase | ios::showpos | ios::scientific | ios::fixed ! 38: | ios::unitbuf | ios::stdio | ios::dont_close; ! 39: ! 40: ios::fmtflags ios::bitalloc() ! 41: { ! 42: fmtflags bit_to_try = (fmtflags)1; ! 43: for (; bit_to_try; bit_to_try <<= 1) ! 44: { ! 45: if ((__used_fmt_flags & bit_to_try) == 0) ! 46: { ! 47: __used_fmt_flags |= bit_to_try; ! 48: return bit_to_try; ! 49: } ! 50: } ! 51: return 0; ! 52: } ! 53: ! 54: // NOTE: This implementation of ios::iword and ios::pword assumes ! 55: // that these methods are seldom used, so we want to minimize ! 56: // the space and time overhead when NOT using these methods. ! 57: // ! 58: // ANSI specifies two conceptually-infinite arrays, one whose ! 59: // elements are longs, and one whose elements are (void*)s. ! 60: // We implement this as a single array, each of whose element is ! 61: // a (struct ptr_and_long), which has space for both a long and a void*. ! 62: // We also specify that (the i field of) the 0'th element of the array ! 63: // contains the allocated length of the array (not counting that ! 64: // initial element). ! 65: ! 66: struct ptr_and_long { ! 67: void *p; ! 68: long i; ! 69: }; ! 70: ! 71: static struct ptr_and_long& ! 72: get_array_element(ios& io, int index) ! 73: { ! 74: if (index < 0) ! 75: io._throw_failure(); ! 76: register struct ptr_and_long *array = (ptr_and_long*)io._arrays; ! 77: int old_length = array == NULL ? 0 : array[0].i; ! 78: if (index >= old_length) ! 79: { ! 80: register int i; ! 81: int new_length = index + 10; ! 82: register struct ptr_and_long *new_array ! 83: = new ptr_and_long[1 + new_length]; ! 84: if (array != NULL) ! 85: { ! 86: for (i = 1; i <= old_length; i++) ! 87: new_array[i] = array[i]; ! 88: delete [] array; ! 89: } ! 90: for (i = old_length + 1; i <= new_length; i++) ! 91: { ! 92: new_array[i].i = 0; ! 93: new_array[i].p = (void*)0; ! 94: } ! 95: new_array[0].i = new_length; ! 96: new_array[0].p = (void*)0; ! 97: io._arrays = (void*)new_array; ! 98: array = new_array; ! 99: } ! 100: return array[index+1]; ! 101: } ! 102: ! 103: long& ios::iword(int index) ! 104: { ! 105: return get_array_element(*this, index).i; ! 106: } ! 107: ! 108: void*& ios::pword(int index) ! 109: { ! 110: return get_array_element(*this, index).p; ! 111: } ! 112: ! 113: long ios::iword(int index) const ! 114: { ! 115: if (index < 0) ! 116: _throw_failure(); ! 117: register struct ptr_and_long *pl_array = (ptr_and_long*)_arrays; ! 118: int len = pl_array == NULL ? 0 : pl_array[0].i; ! 119: return index >= len ? 0 : pl_array[index+1].i; ! 120: } ! 121: ! 122: void* ios::pword(int index) const ! 123: { ! 124: if (index < 0) ! 125: _throw_failure(); ! 126: register struct ptr_and_long *pl_array = (ptr_and_long*)_arrays; ! 127: int len = pl_array == NULL ? 0 : pl_array[0].i; ! 128: return index >= len ? 0 : pl_array[index+1].p; ! 129: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.