X-Git-Url: https://jxself.org/git/?p=mes.git;a=blobdiff_plain;f=lib%2Flibmes.c;h=870c2293bc5e999d51166a12d63dd54fc4052744;hp=f6a04d7868dae67669e035fb86388bab15a211bb;hb=69813a6da3485ebe52503424949dbad60b42f008;hpb=de964f3e1f29a64f3b6c7cc9bad611465983b6f3 diff --git a/lib/libmes.c b/lib/libmes.c index f6a04d78..870c2293 100644 --- a/lib/libmes.c +++ b/lib/libmes.c @@ -19,6 +19,7 @@ */ #include +#include #include #include @@ -130,6 +131,7 @@ utoa (unsigned x) } int _ungetc_pos = -1; +int _ungetc_fd = -1; char _ungetc_buf[10]; int @@ -147,7 +149,29 @@ fdgetc (int fd) else { i = _ungetc_buf[_ungetc_pos]; + if (_ungetc_fd != fd && i == 10) + { + // FIXME: Nyacc's ungetc exposes harmless libmec.c bug + // we need one unget position per FD + _ungetc_pos = -1; + _ungetc_fd = -1; + return fdgetc (fd); + } + else if (_ungetc_fd != fd) + { + eputs (" ***MES LIB C*** fdgetc ungetc conflict unget-fd="); + eputs (itoa (_ungetc_fd)); + eputs (", fdgetc-fd="); + eputs (itoa (fd)); + eputs (", c="); + eputs (itoa ( _ungetc_buf[_ungetc_pos])); + eputs ("\n"); + exit (1); + } + i = _ungetc_buf[_ungetc_pos]; _ungetc_pos -= 1; + if (_ungetc_pos == -1) + _ungetc_fd = -1; } if (i < 0) i += 256; @@ -173,11 +197,30 @@ fdputs (char const* s, int fd) int fdungetc (int c, int fd) { + if (c == -1) + return c; + if (_ungetc_pos == -1) + _ungetc_fd = fd; + else if (_ungetc_fd != fd) + { + eputs (" ***MES LIB C*** fdungetc ungetc conflict unget-fd="); + eputs (itoa (_ungetc_fd)); + eputs (", fdungetc-fd="); + eputs (itoa (fd)); + eputs ("\n"); + exit (1); + } _ungetc_pos++; _ungetc_buf[_ungetc_pos] = c; return c; } +int +_fdungetc_p (int fd) +{ + return _ungetc_pos > -1; +} + #if POSIX || __x86_64__ #define STDERR 2 int