/src/tor/src/ext/getdelim.c
Line | Count | Source |
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 | | compat_getdelim_(char **buf, size_t *bufsiz, int delimiter, FILE *fp) |
39 | 0 | { |
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 | 0 | return -1; |
47 | 0 | } |
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 | 0 | } |
58 | 0 | } |
59 | 0 | return -1; |
60 | 0 | } |
61 | 0 | *ptr++ = c; |
62 | 0 | if (c == delimiter) { |
63 | 0 | *ptr = '\0'; |
64 | 0 | return ptr - *buf; |
65 | 0 | } |
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 | 0 | } |
78 | 0 | } |
79 | 0 | } |