improved version with better PushBack

This commit is contained in:
ceriel 1989-04-04 14:49:31 +00:00
parent 3030b5edd1
commit 6877184666

View file

@ -344,17 +344,17 @@ loadbuf()
return EOI; return EOI;
} }
if (!bh->bh_eofreturned) {
if (_ipp < &(bh->bh_text[bh->bh_size])) { if (_ipp < &(bh->bh_text[bh->bh_size])) {
/* a genuine '\0' character has been seen */ /* a genuine '\0' character has been seen */
return '\0'; return '\0';
} }
if (!bh->bh_eofreturned) {
FromFile = (bh->bh_fd != 0); FromFile = (bh->bh_fd != 0);
#ifndef INP_READ_IN_ONE #ifndef INP_READ_IN_ONE
if (FromFile && bh->bh_size > 0) { if (FromFile && bh->bh_size > 0) {
#if INP_PUSHBACK > 1 #if INP_NPUSHBACK > 1
register char *so = &(bh->bh_text[bh->bh_size]); register char *so = &(bh->bh_text[bh->bh_size]);
register char *de = bh->bh_text; register char *de = bh->bh_text;
register int i = INP_NPUSHBACK - 1; register int i = INP_NPUSHBACK - 1;
@ -376,6 +376,21 @@ loadbuf()
#endif not INP_READ_IN_ONE #endif not INP_READ_IN_ONE
if (FromFile && bh->bh_fd != STDIN) sys_close(bh->bh_fd); if (FromFile && bh->bh_fd != STDIN) sys_close(bh->bh_fd);
#if INP_NPUSHBACK > 1
{
register char *so = &(bh->bh_text[bh->bh_size]);
register char *de = &buf[INP_NPUSHBACK - 1];
register int i = INP_NPUSHBACK - 1;
for (;i > 0; i--) {
/* make sure PushBack will work */
*--de = *--so;
}
}
#endif
buf[INP_NPUSHBACK-1] = 0; /* make PushBack work on EOI */
_ipp = &buf[INP_NPUSHBACK];
if (bh->bh_fd) { /* unstack a file */ if (bh->bh_fd) { /* unstack a file */
#ifndef INP_READ_IN_ONE #ifndef INP_READ_IN_ONE
struct INP_i_buf *ib; struct INP_i_buf *ib;
@ -387,19 +402,30 @@ loadbuf()
free(bh->bh_text); free(bh->bh_text);
#endif INP_READ_IN_ONE #endif INP_READ_IN_ONE
} }
bh->bh_eofreturned = 1; bh->bh_text = buf;
_ipp = ""; bh->bh_size = INP_NPUSHBACK - 1;
if (FromFile) { if (FromFile) {
if (AtEoIF()) return EOI; if (AtEoIF()) {
bh->bh_eofreturned = 1;
return EOI;
}
} }
else { else {
if (AtEoIT()) return EOI; if (AtEoIT()) {
bh->bh_eofreturned = 1;
return EOI;
}
} }
} }
if (bh->bh_eofreturned && _ipp == &buf[INP_NPUSHBACK]) {
return EOI;
}
if (INP_pop_bh()) { if (INP_pop_bh()) {
if (*_ipp) return *_ipp++; int c;
return loadbuf(); LoadChar(c);
return c;
} }
_ipp = &buf[INP_NPUSHBACK]; _ipp = &buf[INP_NPUSHBACK];
return EOI; return EOI;