diff options
author | nicoo <nicoo@debian.org> | 2020-02-12 13:42:22 +0100 |
---|---|---|
committer | Nicolas Braud-Santoni <nicolas@braud-santoni.eu> | 2020-02-12 13:42:22 +0100 |
commit | c79050aa44b8836d836c5dd22a383a073c28b74b (patch) | |
tree | 7bcca9fabd7718bf87ca600a6594f57b76d8de7d /openbsd-compat/bsd-getline.c |
Import upstream release 1.3.0
Closes: #951184
Diffstat (limited to 'openbsd-compat/bsd-getline.c')
-rw-r--r-- | openbsd-compat/bsd-getline.c | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/openbsd-compat/bsd-getline.c b/openbsd-compat/bsd-getline.c new file mode 100644 index 0000000..52b44f7 --- /dev/null +++ b/openbsd-compat/bsd-getline.c | |||
@@ -0,0 +1,115 @@ | |||
1 | /* $NetBSD: getline.c,v 1.1.1.6 2015/01/02 20:34:27 christos Exp $ */ | ||
2 | |||
3 | /* NetBSD: getline.c,v 1.2 2014/09/16 17:23:50 christos Exp */ | ||
4 | |||
5 | /*- | ||
6 | * Copyright (c) 2011 The NetBSD Foundation, Inc. | ||
7 | * All rights reserved. | ||
8 | * | ||
9 | * This code is derived from software contributed to The NetBSD Foundation | ||
10 | * by Christos Zoulas. | ||
11 | * | ||
12 | * Redistribution and use in source and binary forms, with or without | ||
13 | * modification, are permitted provided that the following conditions | ||
14 | * are met: | ||
15 | * 1. Redistributions of source code must retain the above copyright | ||
16 | * notice, this list of conditions and the following disclaimer. | ||
17 | * 2. Redistributions in binary form must reproduce the above copyright | ||
18 | * notice, this list of conditions and the following disclaimer in the | ||
19 | * documentation and/or other materials provided with the distribution. | ||
20 | * | ||
21 | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | ||
22 | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | ||
23 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | ||
24 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | ||
25 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | ||
26 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | ||
27 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | ||
28 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | ||
29 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | ||
30 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | ||
31 | * POSSIBILITY OF SUCH DAMAGE. | ||
32 | */ | ||
33 | |||
34 | /* NETBSD ORIGINAL: external/bsd/file/dist/src/getline.c */ | ||
35 | |||
36 | #include "openbsd-compat.h" | ||
37 | |||
38 | #if 0 | ||
39 | #include "file.h" | ||
40 | #endif | ||
41 | |||
42 | #if !HAVE_GETLINE | ||
43 | #include <stdlib.h> | ||
44 | #include <stdio.h> | ||
45 | #ifdef HAVE_UNISTD_H | ||
46 | #include <unistd.h> | ||
47 | #endif | ||
48 | #include <errno.h> | ||
49 | #include <string.h> | ||
50 | |||
51 | static ssize_t | ||
52 | getdelim(char **buf, size_t *bufsiz, int delimiter, FILE *fp) | ||
53 | { | ||
54 | char *ptr, *eptr; | ||
55 | |||
56 | |||
57 | if (*buf == NULL || *bufsiz == 0) { | ||
58 | if ((*buf = malloc(BUFSIZ)) == NULL) | ||
59 | return -1; | ||
60 | *bufsiz = BUFSIZ; | ||
61 | } | ||
62 | |||
63 | for (ptr = *buf, eptr = *buf + *bufsiz;;) { | ||
64 | int c = fgetc(fp); | ||
65 | if (c == -1) { | ||
66 | if (feof(fp)) { | ||
67 | ssize_t diff = (ssize_t)(ptr - *buf); | ||
68 | if (diff != 0) { | ||
69 | *ptr = '\0'; | ||
70 | return diff; | ||
71 | } | ||
72 | } | ||
73 | return -1; | ||
74 | } | ||
75 | *ptr++ = (char)c; | ||
76 | if (c == delimiter) { | ||
77 | *ptr = '\0'; | ||
78 | return ptr - *buf; | ||
79 | } | ||
80 | if (ptr + 2 >= eptr) { | ||
81 | char *nbuf; | ||
82 | size_t nbufsiz = *bufsiz * 2; | ||
83 | ssize_t d = ptr - *buf; | ||
84 | if ((nbuf = realloc(*buf, nbufsiz)) == NULL) | ||
85 | return -1; | ||
86 | *buf = nbuf; | ||
87 | *bufsiz = nbufsiz; | ||
88 | eptr = nbuf + nbufsiz; | ||
89 | ptr = nbuf + d; | ||
90 | } | ||
91 | } | ||
92 | } | ||
93 | |||
94 | ssize_t | ||
95 | getline(char **buf, size_t *bufsiz, FILE *fp) | ||
96 | { | ||
97 | return getdelim(buf, bufsiz, '\n', fp); | ||
98 | } | ||
99 | |||
100 | #endif | ||
101 | |||
102 | #ifdef TEST | ||
103 | int | ||
104 | main(int argc, char *argv[]) | ||
105 | { | ||
106 | char *p = NULL; | ||
107 | ssize_t len; | ||
108 | size_t n = 0; | ||
109 | |||
110 | while ((len = getline(&p, &n, stdin)) != -1) | ||
111 | (void)printf("%" SIZE_T_FORMAT "d %s", len, p); | ||
112 | free(p); | ||
113 | return 0; | ||
114 | } | ||
115 | #endif | ||