diff options
author | Роман Донченко <dpb@corrigendum.ru> | 2018-04-08 01:00:46 +0300 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2018-05-07 06:44:24 +0000 |
commit | fc5ebe217fc2712b60dfaa5d96b66386a041dd42 (patch) | |
tree | 68def96e81714a495f5870222ff7866dc1743491 | |
parent | 282eb96e6396970d4e4ff85912b87f2f84341bc9 (diff) |
wiretap: Add a file_gets variant that returns a pointer to the NUL terminator
When using file_gets it's very difficult to determine how many characters
were read, because you can't distinguish between an embedded NUL and
a short line (note that the last line in a file may not have an LF at the
end). While it's still possible to do it via prefilling the buffer with
non-zero values, doing that is cumbersome, inefficient and error-prone.
This new function makes the task much easier.
The "p" in the name is meant to be reminiscent of the "p" in stpcpy.
Change-Id: I468d5ee71e3b6289925860651ba61b369301b3c9
Reviewed-on: https://code.wireshark.org/review/27333
Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org>
Tested-by: Petri Dish Buildbot
Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org>
-rw-r--r-- | wiretap/file_wrappers.c | 15 | ||||
-rw-r--r-- | wiretap/file_wrappers.h | 1 |
2 files changed, 13 insertions, 3 deletions
diff --git a/wiretap/file_wrappers.c b/wiretap/file_wrappers.c index cae0cfc491..daf0798ce7 100644 --- a/wiretap/file_wrappers.c +++ b/wiretap/file_wrappers.c @@ -1398,8 +1398,9 @@ file_getc(FILE_T file) return ret < 1 ? -1 : buf[0]; } +/* Like file_gets, but returns a pointer to the terminating NUL. */ char * -file_gets(char *buf, int len, FILE_T file) +file_getsp(char *buf, int len, FILE_T file) { guint left, n; char *str; @@ -1461,9 +1462,17 @@ file_gets(char *buf, int len, FILE_T file) buf += n; } while (left && eol == NULL); - /* found end-of-line or out of space -- terminate string and return it */ + /* found end-of-line or out of space -- add a terminator and return + a pointer to it */ buf[0] = 0; - return str; + return buf; +} + +char * +file_gets(char *buf, int len, FILE_T file) +{ + if (!file_getsp(buf, len, file)) return NULL; + return buf; } int diff --git a/wiretap/file_wrappers.h b/wiretap/file_wrappers.h index 64e0b6b166..40fe9c9788 100644 --- a/wiretap/file_wrappers.h +++ b/wiretap/file_wrappers.h @@ -26,6 +26,7 @@ WS_DLL_PUBLIC int file_read(void *buf, unsigned int count, FILE_T file); WS_DLL_PUBLIC int file_peekc(FILE_T stream); WS_DLL_PUBLIC int file_getc(FILE_T stream); WS_DLL_PUBLIC char *file_gets(char *buf, int len, FILE_T stream); +WS_DLL_PUBLIC char *file_getsp(char *buf, int len, FILE_T stream); WS_DLL_PUBLIC int file_eof(FILE_T stream); WS_DLL_PUBLIC int file_error(FILE_T fh, gchar **err_info); extern void file_clearerr(FILE_T stream); |