summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpgen <p.gen.progs@gmail.com>2021-07-10 15:00:11 +0200
committerpgen <p.gen.progs@gmail.com>2021-07-10 15:02:16 +0200
commit2ac8cc9f516ec5c5991ba22d48662a40c3bd6dd0 (patch)
tree932b7bebafd7a91d91e6b7a35b002cba91a26bfb
parent0b9536c75192b45977549a15345925e0d119f9c9 (diff)
Fix my_ungetc
- reset EOF flag if necessary. - make it POSIX compliant.
-rw-r--r--fgetc.c7
-rw-r--r--fgetc.h2
-rw-r--r--smenu.c4
3 files changed, 9 insertions, 4 deletions
diff --git a/fgetc.c b/fgetc.c
index fd1e611..7da6b24 100644
--- a/fgetc.c
+++ b/fgetc.c
@@ -32,11 +32,16 @@ my_fgetc(FILE * input)
/* Pushes character back on input. */
/* =============================== */
void
-my_ungetc(int c)
+my_ungetc(int c, FILE * input)
{
if (next_buffer_pos >= GETC_BUFF_SIZE)
fprintf(stderr, "Error: cannot push back more than %d characters\n",
GETC_BUFF_SIZE);
else
+ {
getc_buffer[next_buffer_pos++] = c;
+
+ if (feof(input))
+ clearerr(input); /* No more EOF. */
+ }
}
diff --git a/fgetc.h b/fgetc.h
index f458928..3948588 100644
--- a/fgetc.h
+++ b/fgetc.h
@@ -10,6 +10,6 @@ int
my_fgetc(FILE * input);
void
-my_ungetc(int c);
+my_ungetc(int c, FILE * input);
#endif
diff --git a/smenu.c b/smenu.c
index 7d4dabb..f6ae146 100644
--- a/smenu.c
+++ b/smenu.c
@@ -2755,10 +2755,10 @@ get_word(FILE * input, ll_t * word_delims_list, ll_t * record_delims_list,
pos = strlen(utf8_buffer);
while (pos > 0)
- my_ungetc(utf8_buffer[--pos]);
+ my_ungetc(utf8_buffer[--pos], input);
}
else
- my_ungetc(byte);
+ my_ungetc(byte, input);
}
/* Mark it as the last word of a record if its sequence matches a */