Mercurial > hg > octave-nkf > gnulib-hg
diff lib/getndelim2.c @ 10006:b0a275071b2c
Test getndelim2.
* modules/getndelim2-tests: New file.
* tests/test-getndelim2.c: Likewise.
* lib/getndelim2.c (getndelim2): Never return 0. Lock the
stream.
* m4/getndelim2.m4 (gl_GETNDELIM2): Check for lock functions.
Signed-off-by: Eric Blake <ebb9@byu.net>
author | Eric Blake <ebb9@byu.net> |
---|---|
date | Mon, 28 Apr 2008 21:36:17 -0600 (2008-04-29) |
parents | bbbbbf4cd1c5 |
children | e435c0a7bace |
line wrap: on
line diff
--- a/lib/getndelim2.c +++ b/lib/getndelim2.c @@ -1,7 +1,7 @@ /* getndelim2 - Read a line from a stream, stopping at one of 2 delimiters, with bounded memory allocation. - Copyright (C) 1993, 1996, 1997, 1998, 2000, 2003, 2004, 2006 Free + Copyright (C) 1993, 1996, 1997, 1998, 2000, 2003, 2004, 2006, 2008 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify @@ -29,6 +29,14 @@ #if USE_UNLOCKED_IO # include "unlocked-io.h" #endif +#if !HAVE_FLOCKFILE +# undef flockfile +# define flockfile(x) ((void) 0) +#endif +#if !HAVE_FUNLOCKFILE +# undef funlockfile +# define funlockfile(x) ((void) 0) +#endif #include <limits.h> #include <stdint.h> @@ -73,6 +81,8 @@ if (nbytes_avail == 0 && nmax <= size) goto done; + flockfile (stream); + for (;;) { /* Here always ptr + size == read_pos + nbytes_avail. */ @@ -95,14 +105,14 @@ { size_t newsizemax = offset + GETNDELIM2_MAXIMUM + 1; if (size == newsizemax) - goto done; + goto unlock_done; newsize = newsizemax; } nbytes_avail = newsize - (read_pos - ptr); newptr = realloc (ptr, newsize); if (!newptr) - goto done; + goto unlock_done; ptr = newptr; size = newsize; read_pos = size - nbytes_avail + ptr; @@ -113,7 +123,7 @@ { /* Return partial line, if any. */ if (read_pos == ptr) - goto done; + goto unlock_done; else break; } @@ -135,8 +145,11 @@ bytes_stored = read_pos - (ptr + offset); + unlock_done: + funlockfile (stream); + done: *lineptr = ptr; *linesize = size; - return bytes_stored; + return bytes_stored ? bytes_stored : -1; }