1
0
mirror of https://gitlab.com/80486DX2-66/gists synced 2024-12-27 05:40:17 +05:30

freadln.*: handle EOF in a special way to indicate EOF

This commit is contained in:
Intel A80486DX2-66 2024-03-10 15:38:14 +03:00
parent 3638c9eb7c
commit 53d0b8908d
Signed by: 80486DX2-66
GPG Key ID: 83631EF27054609B
2 changed files with 9 additions and 4 deletions

View File

@ -10,7 +10,6 @@
* TODO: Figure out potential problems * TODO: Figure out potential problems
* TODO: Add 'flushing' of STDIN (while there are characters, read them) before * TODO: Add 'flushing' of STDIN (while there are characters, read them) before
* the input reading loop to avoid input queues * the input reading loop to avoid input queues
* [optional] TODO: Handle EOF in a special way to indicate EOF
*/ */
#include "freadln.h" #include "freadln.h"
@ -22,6 +21,7 @@ int freadln(FILE* f, char** output, size_t* length_out) {
* return value: * return value:
* freadln_OK: no errors, the length of STDIN line has been stored in * freadln_OK: no errors, the length of STDIN line has been stored in
* `length_out` * `length_out`
* freadln_EOF: end of file
* freadln_ERROR: an error occurred (see errno) * freadln_ERROR: an error occurred (see errno)
* >= 0: length of read line * >= 0: length of read line
*/ */
@ -71,6 +71,8 @@ int freadln(FILE* f, char** output, size_t* length_out) {
errno = 0; errno = 0;
freadln_epilogue; freadln_epilogue;
if (character == EOF)
return freadln_EOF;
return freadln_OK; return freadln_OK;
} }
@ -101,11 +103,13 @@ int main(void) {
f = new_f; f = new_f;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
size_t line_length; size_t line_length;
if (freadln(f, &line, &line_length) != freadln_OK) { int result = freadln(f, &line, &line_length);
if (result == freadln_ERROR) {
perror("freadln"); perror("freadln");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} else if (feof(f)) { } else if (result == freadln_EOF || feof(f)) {
printf("File: EOF, breaking the loop\n"); printf("File: EOF, breaking the loop (returned by function? %d, "
"feof? %d)\n", result == freadln_EOF, !!feof(f));
break; break;
} }
printf("File, line #%d: '%s' (%zu characters)\n", i + 1, line, printf("File, line #%d: '%s' (%zu characters)\n", i + 1, line,

View File

@ -16,6 +16,7 @@ typedef size_t freadln_length_type;
enum freadln_status { enum freadln_status {
freadln_OK, freadln_OK,
freadln_EOF,
freadln_ERROR freadln_ERROR
}; };