Merge branch 'maint-0.4.8' into release-0.4.8
[tor.git] / src / ext / getdelim.c
blob1c29baffd933c8ae113421bded3d5ce69390225b
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 */
4 /*-
5 * Copyright (c) 2011 The NetBSD Foundation, Inc.
6 * All rights reserved.
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Christos Zoulas.
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.
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.
33 #ifndef BUFSIZ
34 #define BUFSIZ 512
35 #endif
37 ssize_t
38 compat_getdelim_(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
40 char *ptr, *eptr;
43 if (*buf == NULL || *bufsiz == 0) {
44 *bufsiz = BUFSIZ;
45 if ((*buf = raw_malloc(*bufsiz)) == NULL)
46 return -1;
49 for (ptr = *buf, eptr = *buf + *bufsiz;;) {
50 int c = fgetc(fp);
51 if (c == -1) {
52 if (feof(fp)) {
53 ssize_t diff = (ssize_t)(ptr - *buf);
54 if (diff != 0) {
55 *ptr = '\0';
56 return diff;
59 return -1;
61 *ptr++ = c;
62 if (c == delimiter) {
63 *ptr = '\0';
64 return ptr - *buf;
66 if (ptr + 2 >= eptr) {
67 char *nbuf;
68 size_t nbufsiz = *bufsiz * 2;
69 ssize_t d = ptr - *buf;
70 if (nbufsiz < *bufsiz ||
71 (nbuf = raw_realloc(*buf, nbufsiz)) == NULL)
72 return -1;
73 *buf = nbuf;
74 *bufsiz = nbufsiz;
75 eptr = nbuf + nbufsiz;
76 ptr = nbuf + d;