forked from osmocom/wireshark
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>
This commit is contained in:
parent
282eb96e63
commit
fc5ebe217f
|
@ -1398,8 +1398,9 @@ file_getc(FILE_T file)
|
||||||
return ret < 1 ? -1 : buf[0];
|
return ret < 1 ? -1 : buf[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Like file_gets, but returns a pointer to the terminating NUL. */
|
||||||
char *
|
char *
|
||||||
file_gets(char *buf, int len, FILE_T file)
|
file_getsp(char *buf, int len, FILE_T file)
|
||||||
{
|
{
|
||||||
guint left, n;
|
guint left, n;
|
||||||
char *str;
|
char *str;
|
||||||
|
@ -1461,9 +1462,17 @@ file_gets(char *buf, int len, FILE_T file)
|
||||||
buf += n;
|
buf += n;
|
||||||
} while (left && eol == NULL);
|
} 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;
|
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
|
int
|
||||||
|
|
|
@ -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_peekc(FILE_T stream);
|
||||||
WS_DLL_PUBLIC int file_getc(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_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_eof(FILE_T stream);
|
||||||
WS_DLL_PUBLIC int file_error(FILE_T fh, gchar **err_info);
|
WS_DLL_PUBLIC int file_error(FILE_T fh, gchar **err_info);
|
||||||
extern void file_clearerr(FILE_T stream);
|
extern void file_clearerr(FILE_T stream);
|
||||||
|
|
Loading…
Reference in New Issue