| uchar *ScanFill(uchar *cursor){ |
| unsigned cnt = s->tok - s->bot; |
| s->pos += cursor - s->mrk; |
| if(cnt){ |
| if(s->eot){ |
| unsigned len = s->eot - s->tok; |
| memcpy(s->bot, s->tok, len); |
| s->eot = &s->bot[len]; |
| if((len = s->lim - cursor) != 0) |
| memcpy(s->eot, cursor, len); |
| cursor = s->eot; |
| s->lim = &cursor[len]; |
| } else { |
| memcpy(s->bot, s->tok, s->lim - s->tok); |
| cursor -= cnt; |
| s->lim -= cnt; |
| } |
| s->tok = s->bot; |
| s->ptr -= cnt; |
| } |
| if((s->top - s->lim) < 512){ |
| uchar *buf = (uchar*) malloc(((s->lim - s->bot) + 512)*sizeof(uchar)); |
| memcpy(buf, s->bot, s->lim - s->bot); |
| s->tok = buf; |
| s->ptr = &buf[s->ptr - s->bot]; |
| if(s->eot) |
| s->eot = &buf[s->eot - s->bot]; |
| cursor = &buf[cursor - s->bot]; |
| s->lim = &buf[s->lim - s->bot]; |
| s->top = &s->lim[512]; |
| free(s->bot); |
| s->bot = buf; |
| } |
| s->mrk = cursor; |
| if(ScanCBIO.file){ |
| if((cnt = read(ScanCBIO.u.f.fd, (char*) s->lim, 512)) != 512) |
| memset(&s->lim[cnt], 0, 512 - cnt); |
| s->lim += 512; |
| } |
| return cursor; |
| } |