Shell Bsh / Parser Konzepte
 
StartSeite | ShellBsh/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern

Veränderung (letzte Korrektur) (Änderung, Normalansicht)

Verändert: 68c68
KategorieCee KategorieProgrammierBeispiele KategorieSchellong
KategorieC KategorieCee KategorieProgrammierBeispiele KategorieSchellong

Ein kleiner Parser für Shell-HERE-Dokumente.

kommando <<[-] ENDE
hhhhhhhh
  hhhhh
hhhhhhh
       hhh
hhhh
ENDE

Der Fortschritt beim Parsen ist an z erkennbar.
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;
}
--HelmutSchellong


KategorieC KategorieCee KategorieProgrammierBeispiele KategorieSchellong
StartSeite | ShellBsh/ | Neues | TestSeite | ForumSeite | Teilnehmer | Kategorien | Index | Hilfe | Einstellungen | Ändern
Text dieser Seite ändern (zuletzt geändert: 29. November 2007 8:45 (diff))
Suchbegriff: gesucht wird
im Titel
im Text