/* * Copyright (c) 1995, 1996 Gunther Schadow. All rights reserved. * * This program 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 of the License, or * (at your option) any later version. * * This program 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 program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "pg_config.h" #include "ioext.h" #include "misc.h" #include /* FROM: iogetline.c */ /* Algorithm based on that used by Berkeley pre-4.4 fgets implementation. * * Read chars into buf (of size n), until any char in delim is seen. * Return number of chars read (at most n-1). * If extract_delim < 0, leave delimiter unread. * If extract_delim > 0, insert delim in output. */ _IO_size_t _IO_getline_dset(fp, buf, n, delim, extract_delim) _IO_FILE *fp; char* buf; _IO_size_t n; const char* delim; int extract_delim; { register char *ptr = buf; if (n <= 0) return EOF; n--; /* Leave space for final '\0'. */ do { _IO_size_t len = fp->_IO_read_end - fp->_IO_read_ptr; char *t; if (len <= 0) if (__underflow(fp) == EOF) break; else len = fp->_IO_read_end - fp->_IO_read_ptr; if (len >= n) len = n; t = (char*)memchrs((void*)fp->_IO_read_ptr, delim, len); if (t != NULL) { _IO_size_t old_len = ptr-buf; len = t - fp->_IO_read_ptr; if (extract_delim >= 0) { t++; old_len++; if (extract_delim > 0) len++; } memcpy((void*)ptr, (void*)fp->_IO_read_ptr, len); ptr[len] = 0; fp->_IO_read_ptr = t; return old_len + len; } memcpy((void*)ptr, (void*)fp->_IO_read_ptr, len); fp->_IO_read_ptr += len; ptr += len; n -= len; } while (n != 0); *ptr = 0; return ptr - buf; }