Annotation of GNUtools/libg++/libio/ioextend.cc, 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: #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: }

unix.superglobalmegacorp.com

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