Tor 0.4.9.0-alpha-dev
getdelim.c
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
37ssize_t
38compat_getdelim_(char **buf, size_t *bufsiz, int delimiter, FILE *fp)
39{
40 char *ptr, *eptr;
41
42
43 if (*buf == NULL || *bufsiz == 0) {
44 *bufsiz = BUFSIZ;
45 if ((*buf = raw_malloc(*bufsiz)) == NULL)
46 return -1;
47 }
48
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;
57 }
58 }
59 return -1;
60 }
61 *ptr++ = c;
62 if (c == delimiter) {
63 *ptr = '\0';
64 return ptr - *buf;
65 }
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;
77 }
78 }
79}
ssize_t compat_getdelim_(char **lineptr, size_t *n, int delim, FILE *stream)
Definition: getdelim.c:38