23 |
# include <config.h> |
# include <config.h> |
24 |
#endif |
#endif |
25 |
|
|
26 |
|
#include "getdelim.h" |
27 |
|
|
28 |
|
#include <limits.h> |
29 |
#include <stdlib.h> |
#include <stdlib.h> |
30 |
#include <errno.h> |
#include <errno.h> |
31 |
|
|
32 |
#include "getdelim.h" |
#ifndef SSIZE_MAX |
33 |
|
# define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2)) |
34 |
|
#endif |
35 |
#if !HAVE_FLOCKFILE |
#if !HAVE_FLOCKFILE |
36 |
# undef flockfile |
# undef flockfile |
37 |
# define flockfile(x) ((void) 0) |
# define flockfile(x) ((void) 0) |
50 |
ssize_t |
ssize_t |
51 |
getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) |
getdelim (char **lineptr, size_t *n, int delimiter, FILE *fp) |
52 |
{ |
{ |
53 |
int result = 0; |
ssize_t result; |
54 |
ssize_t cur_len = 0; |
size_t cur_len = 0; |
55 |
|
|
56 |
if (lineptr == NULL || n == NULL || fp == NULL) |
if (lineptr == NULL || n == NULL || fp == NULL) |
57 |
{ |
{ |
78 |
|
|
79 |
i = getc (fp); |
i = getc (fp); |
80 |
if (i == EOF) |
if (i == EOF) |
81 |
{ |
{ |
82 |
result = -1; |
result = -1; |
83 |
break; |
break; |
84 |
} |
} |
85 |
|
|
86 |
/* Make enough space for len+1 (for final NUL) bytes. */ |
/* Make enough space for len+1 (for final NUL) bytes. */ |
87 |
if (cur_len + 1 >= *n) |
if (cur_len + 1 >= *n) |
88 |
{ |
{ |
89 |
size_t needed = 2 * (cur_len + 1) + 1; /* Be generous. */ |
size_t needed_max = |
90 |
|
SSIZE_MAX < SIZE_MAX ? (size_t) SSIZE_MAX + 1 : SIZE_MAX; |
91 |
|
size_t needed = 2 * *n + 1; /* Be generous. */ |
92 |
char *new_lineptr; |
char *new_lineptr; |
93 |
|
|
94 |
if (needed < cur_len) |
if (needed_max < needed) |
95 |
|
needed = needed_max; |
96 |
|
if (cur_len + 1 >= needed) |
97 |
{ |
{ |
98 |
result = -1; |
result = -1; |
99 |
goto unlock_return; |
goto unlock_return; |