private void dtdsub() throws Exception {
  char ch;
  for (short st=0; st >= 0; ) {
    ch=getch();
switch (st) {
case 0:
switch (chtyp(ch)) {
case '<':
        ch=getch();
switch (ch) {
case '?':
        pi();
      break;
case '!':
    ch=getch();
  bkch();
if (ch == '-') {
  comm();
  break;
}
bntok();
switch (bkeyword()) {
case 'n':
dtdent();
break;
case 'a':
dtdattl();
break;
case 'e':
dtdelm();
break;
case 'o':
dtdnot();
break;
default :
panic(FAULT);
break;
}
st=1;
break;
default :
panic(FAULT);
break;
}
break;
case '%':
pent(' ');
break;
case ']':
st=-1;
break;
case ' ':
break;
case 'Z':
if (getch() != ']') {
panic(FAULT);
}
st=-1;
break;
default :
panic(FAULT);
}
break;
case 1:
switch (ch) {
case '>':
st=0;
break;
case ' ':
case '\n':
case '\r':
case '\t':
break;
default :
panic(FAULT);
break;
}
break;
default :
panic(FAULT);
}
}
}

private void dtdsub ( ) throws Exception { char ch ; for ( short st = 0 ; st >= 0 ; ) { ch = getch ( ) ; switch ( st ) { case 0 : switch ( chtyp ( ch ) ) { case '<' : ch = getch ( ) ; switch ( ch ) { case '?' : pi ( ) ; break ; case '!' : ch = getch ( ) ; bkch ( ) ; if ( ch == '-' ) { comm ( ) ; break ; } bntok ( ) ; switch ( bkeyword ( ) ) { case 'n' : dtdent ( ) ; break ; case 'a' : dtdattl ( ) ; break ; case 'e' : dtdelm ( ) ; break ; case 'o' : dtdnot ( ) ; break ; default : panic ( FAULT ) ; break ; } st = 1 ; break ; default : panic ( FAULT ) ; break ; } break ; case '%' : pent ( ' ' ) ; break ; case ']' : st = - 1 ; break ; case ' ' : break ; case 'Z' : if ( getch ( ) != ']' ) { panic ( FAULT ) ; } st = - 1 ; break ; default : panic ( FAULT ) ; } break ; case 1 : switch ( ch ) { case '>' : st = 0 ; break ; case ' ' : case '\n' : case '\r' : case '\t' : break ; default : panic ( FAULT ) ; break ; } break ; default : panic ( FAULT ) ; } } }
parses the document type declaration subset .
