Annotation of GNUtools/libg++/libio/stream.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 <stdarg.h>
                     26: #include "libioP.h"
                     27: #include "stream.h"
                     28: #include "strstream.h"
                     29: 
                     30: static char Buffer[_IO_BUFSIZ];
                     31: #define EndBuffer (Buffer+_IO_BUFSIZ)
                     32: static char* next_chunk = Buffer; // Start of available part of Buffer.
                     33: 
                     34: char* form(const char* format, ...)
                     35: {
                     36:     int space_left = EndBuffer - next_chunk;
                     37:     // If less that 25% of the space is available start over.
                     38:     if (space_left < (_IO_BUFSIZ>>2))
                     39:        next_chunk = Buffer;
                     40:     char* buf = next_chunk;
                     41: 
                     42:     strstreambuf stream(buf, EndBuffer-buf-1, buf);
                     43:     va_list ap;
                     44:     va_start(ap, format);
                     45:     int count = stream.vform(format, ap);
                     46:     va_end(ap);
                     47:     stream.sputc(0);
                     48:     next_chunk = buf + stream.pcount();
                     49:     return buf;
                     50: }
                     51: 
                     52: #define u_long unsigned long
                     53: 
                     54: static char* itoa(unsigned long i, int size, int neg, int base)
                     55: {
                     56:     // Conservative estimate: If base==2, might need 8 characters
                     57:     // for each input byte, but normally 3 is plenty.
                     58:     int needed = size ? size
                     59:        : (base >= 8 ? 3 : 8) * sizeof(unsigned long) + 2;
                     60:     int space_left = EndBuffer - next_chunk;
                     61:     if (space_left <= needed)
                     62:        next_chunk = Buffer; // start over.
                     63: 
                     64:     char* buf = next_chunk;
                     65: 
                     66:     register char* ptr = buf+needed+1;
                     67:     next_chunk = ptr;
                     68: 
                     69:     if (needed < (2+neg) || ptr > EndBuffer)
                     70:        return NULL;
                     71:     *--ptr = 0;
                     72:     
                     73:     if (i == 0)
                     74:        *--ptr = '0';
                     75:     while (i != 0 && ptr > buf) {
                     76:        int ch = i % base;
                     77:        i = i / base;
                     78:        if (ch >= 10)
                     79:            ch += 'a' - 10;
                     80:        else
                     81:            ch += '0';
                     82:        *--ptr = ch;
                     83:     }
                     84:     if (neg)
                     85:        *--ptr = '-';
                     86:     if (size == 0)
                     87:        return ptr;
                     88:     while (ptr > buf)
                     89:        *--ptr = ' ';
                     90:     return buf;
                     91: }
                     92: 
                     93: char* dec(long i, int len /* = 0 */)
                     94: {
                     95:     if (i >= 0) return itoa((unsigned long)i, len, 0, 10);
                     96:     else return itoa((unsigned long)(-i), len, 1, 10);
                     97: }
                     98: char* dec(int i, int len /* = 0 */)
                     99: {
                    100:     if (i >= 0) return itoa((unsigned long)i, len, 0, 10);
                    101:     else return itoa((unsigned long)(-i), len, 1, 10);
                    102: }
                    103: char* dec(unsigned long i, int len /* = 0 */)
                    104: {
                    105:     return itoa(i, len, 0, 10);
                    106: }
                    107: char* dec(unsigned int i, int len /* = 0 */)
                    108: {
                    109:     return itoa(i, len, 0, 10);
                    110: }
                    111: 
                    112: char* hex(long i, int len /* = 0 */)
                    113: {
                    114:     return itoa((unsigned long)i, len, 0, 16);
                    115: }
                    116: char* hex(int i, int len /* = 0 */)
                    117: {
                    118:     return itoa((unsigned long)i, len, 0, 16);
                    119: }
                    120: char* hex(unsigned long i, int len /* = 0 */)
                    121: {
                    122:     return itoa(i, len, 0, 16);
                    123: }
                    124: char* hex(unsigned int i, int len /* = 0 */)
                    125: {
                    126:     return itoa(i, len, 0, 16);
                    127: }
                    128: 
                    129: char* oct(long i, int len /* = 0 */)
                    130: {
                    131:     return itoa((unsigned long)i, len, 0, 8);
                    132: }
                    133: char* oct(int i, int len /* = 0 */)
                    134: {
                    135:     return itoa((unsigned long)i, len, 0, 8);
                    136: }
                    137: char* oct(unsigned long i, int len /* = 0 */)
                    138: {
                    139:     return itoa(i, len, 0, 8);
                    140: }
                    141: char* oct(unsigned int i, int len /* = 0 */)
                    142: {
                    143:     return itoa(i, len, 0, 8);
                    144: }

unix.superglobalmegacorp.com

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