diff options
author | obrien <obrien@FreeBSD.org> | 1999-10-04 08:17:54 +0000 |
---|---|---|
committer | obrien <obrien@FreeBSD.org> | 1999-10-04 08:17:54 +0000 |
commit | 55f2f61a7b5c896aa6f24aa9d026d740b45b6edb (patch) | |
tree | 50ded16eb354bed37a52d5661568400841645361 /contrib/libio/isgetline.cc | |
parent | 2cef6469c5bfaca5647a9b7478a519d0de7d7b64 (diff) | |
download | FreeBSD-src-55f2f61a7b5c896aa6f24aa9d026d740b45b6edb.zip FreeBSD-src-55f2f61a7b5c896aa6f24aa9d026d740b45b6edb.tar.gz |
Virgin import of EGCS 1.1.2's libio -- the C++ iostream facility.
Diffstat (limited to 'contrib/libio/isgetline.cc')
-rw-r--r-- | contrib/libio/isgetline.cc | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/contrib/libio/isgetline.cc b/contrib/libio/isgetline.cc new file mode 100644 index 0000000..02b3492 --- /dev/null +++ b/contrib/libio/isgetline.cc @@ -0,0 +1,141 @@ +/* This is part of libio/iostream, providing -*- C++ -*- input/output. +Copyright (C) 1993 Free Software Foundation + +This file is part of the GNU IO Library. This library is free +software; you can redistribute it and/or modify it under the +terms of the GNU General Public License as published by the +Free Software Foundation; either version 2, or (at your option) +any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this library; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As a special exception, if you link this library with files +compiled with a GNU compiler to produce an executable, this does not cause +the resulting executable to be covered by the GNU General Public License. +This exception does not however invalidate any other reasons why +the executable file might be covered by the GNU General Public License. */ + +#include <libioP.h> +#include "iostream.h" +#include <string.h> + +istream& istream::getline(char* buf, int len, char delim) +{ + _gcount = 0; + if (len <= 0) + { + set(ios::failbit); + return *this; + } + int ch; + if (ipfx1()) + { + streambuf *sb = rdbuf(); + _gcount = _IO_getline_info(sb, buf, len - 1, delim, -1, &ch); + if (ch != EOF) + ch = sb->sbumpc(); + if (ch == EOF) + set (_gcount == 0 ? (ios::failbit|ios::eofbit) : ios::eofbit); + else if (ch != (unsigned char) delim) + { + set(ios::failbit); + sb->sungetc(); // Leave delimiter unread. + } + } + else + ch = EOF; + buf[_gcount] = '\0'; + if (ch == (unsigned char)delim) + _gcount++; // The delimiter is counted in the gcount(). + return *this; +} + +istream& istream::get(char* buf, int len, char delim) +{ + _gcount = 0; + if (len <= 0) + { + set(ios::failbit); + return *this; + } + if (ipfx1()) + { + streambuf *sbuf = rdbuf(); + int ch; + _gcount = _IO_getline_info(sbuf, buf, len - 1, delim, -1, &ch); + if (_gcount == 0 && ch == EOF) + set(ios::failbit|ios::eofbit); + } + buf[_gcount] = '\0'; + return *this; +} + + +// from Doug Schmidt + +#define CHUNK_SIZE 512 + +/* Reads an arbitrarily long input line terminated by a user-specified + TERMINATOR. Super-nifty trick using recursion avoids unnecessary calls + to NEW! */ + +char *_sb_readline (streambuf *sb, long& total, char terminator) +{ + char buf[CHUNK_SIZE]; + char *ptr; + int ch; + + _IO_size_t count = _IO_getline_info(sb, buf, CHUNK_SIZE, terminator, + -1, &ch); + if (ch != EOF) + ch = sb->sbumpc(); + long old_total = total; + total += count; + if (ch != EOF && ch != terminator) { + total++; // Include ch in total. + ptr = _sb_readline(sb, total, terminator); + if (ptr) { + memcpy(ptr + old_total, buf, count); + ptr[old_total+count] = ch; + } + return ptr; + } + + ptr = new char[total+1]; + if (ptr != NULL) { + ptr[total] = '\0'; + memcpy(ptr + total - count, buf, count); + } + return ptr; +} + +/* Reads an arbitrarily long input line terminated by TERMINATOR. + This routine allocates its own memory, so the user should + only supply the address of a (char *). */ + +istream& istream::gets(char **s, char delim /* = '\n' */) +{ + if (ipfx1()) { + long size = 0; + streambuf *sb = rdbuf(); + *s = _sb_readline (sb, size, delim); + _gcount = *s ? size : 0; + if (sb->_flags & _IO_EOF_SEEN) { + set(ios::eofbit); + if (_gcount == 0) + set(ios::failbit); + } + } + else { + _gcount = 0; + *s = NULL; + } + return *this; +} |