static void HereDoc(int h) // h bei <<-
{
byte buf[HEREBUF], nam[64], enam[sizeof(nam)];
register byte c;
register int bi;
int ni, eni, z, tab, en, end;
end=en=tab=z=ni=eni=bi=0;
while ( (c=GET)!=EoF ) {
switch (z) {
case 0: if (c<=' ') { // ASCII vorausgesetzt
if (c=='\n') goto ERR;
continue;
}
z=1;
case 1: if (c>' ') {
if (ni>=sizeof(nam)) goto ERR;
nam[ni++]= c; continue;
}
z=2;
case 2: if (c=='\n') z=3, en=tab=1;
continue;
case 3: if (h&&tab) { if (c=='\t') continue; tab=0; }
if (c=='\n') en=tab=1;
if (!en) break;
if (c>' ') {
if (eni>=ni||eni>=sizeof(enam)) { en=0; break; }
enam[eni++]= c;
continue;
}
if (ni==eni&&!memcmp_F(nam, enam, ni)) eni=0, end=1;
if (c!='\n') en=0;
break;
}
WR:;
if (eni) {
if (bi+eni>sizeof(buf)) writeE(FdS, buf, bi), bi=0;
memcpy_F(buf+bi, enam, eni);
bi+=eni,eni=0;
}
if (end&&bi||bi>=sizeof(buf)) writeE(FdS, buf, bi), bi=0;
if (end) break;
buf[bi++]= c;
}
if (!end) { end=1; goto WR; }
UNGET;
return;
ERR: bsh_Err(LS16|E_SYNTAX, "<< HEREdoc");
return;
} |