Line data Source code
1 : /* $NetBSD: getdelim.c,v 1.2 2015/12/25 20:12:46 joerg Exp $ */ 2 : /* NetBSD-src: getline.c,v 1.2 2014/09/16 17:23:50 christos Exp */ 3 : 4 : /*- 5 : * Copyright (c) 2011 The NetBSD Foundation, Inc. 6 : * All rights reserved. 7 : * 8 : * This code is derived from software contributed to The NetBSD Foundation 9 : * by Christos Zoulas. 10 : * 11 : * Redistribution and use in source and binary forms, with or without 12 : * modification, are permitted provided that the following conditions 13 : * are met: 14 : * 1. Redistributions of source code must retain the above copyright 15 : * notice, this list of conditions and the following disclaimer. 16 : * 2. Redistributions in binary form must reproduce the above copyright 17 : * notice, this list of conditions and the following disclaimer in the 18 : * documentation and/or other materials provided with the distribution. 19 : * 20 : * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 21 : * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 : * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 : * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 24 : * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 : * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 : * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 : * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 : * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 : * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 : * POSSIBILITY OF SUCH DAMAGE. 31 : */ 32 : 33 : #ifndef BUFSIZ 34 : #define BUFSIZ 512 35 : #endif 36 : 37 : ssize_t 38 0 : compat_getdelim_(char **buf, size_t *bufsiz, int delimiter, FILE *fp) 39 : { 40 0 : char *ptr, *eptr; 41 : 42 : 43 0 : if (*buf == NULL || *bufsiz == 0) { 44 0 : *bufsiz = BUFSIZ; 45 0 : if ((*buf = raw_malloc(*bufsiz)) == NULL) 46 : return -1; 47 : } 48 : 49 0 : for (ptr = *buf, eptr = *buf + *bufsiz;;) { 50 0 : int c = fgetc(fp); 51 0 : if (c == -1) { 52 0 : if (feof(fp)) { 53 0 : ssize_t diff = (ssize_t)(ptr - *buf); 54 0 : if (diff != 0) { 55 0 : *ptr = '\0'; 56 0 : return diff; 57 : } 58 : } 59 : return -1; 60 : } 61 0 : *ptr++ = c; 62 0 : if (c == delimiter) { 63 0 : *ptr = '\0'; 64 0 : return ptr - *buf; 65 : } 66 0 : if (ptr + 2 >= eptr) { 67 0 : char *nbuf; 68 0 : size_t nbufsiz = *bufsiz * 2; 69 0 : ssize_t d = ptr - *buf; 70 0 : if (nbufsiz < *bufsiz || 71 0 : (nbuf = raw_realloc(*buf, nbufsiz)) == NULL) 72 0 : return -1; 73 0 : *buf = nbuf; 74 0 : *bufsiz = nbufsiz; 75 0 : eptr = nbuf + nbufsiz; 76 0 : ptr = nbuf + d; 77 : } 78 : } 79 : }