#include <perms.h>

//          Edinburgh IMP77 Compiler - Version 8.4
//
//     1  !!!!! 12/1/77
//     2  ! HAMISH DEWAR'S LAYOUT PROGRAM MODIFIED FOR 7/32 IMP COMPILER
//     3  ! AND TO IMPLEMENT SECTION NOS.
//     4
//     5  !%EXTERNALROUTINESPEC SET STREAMS  {move to perms}
//     6  %BEGIN;  !LAYOUT: DOCUMENT LAYOUT PROGRAM

int main(int argc, char **argv) { /*%begin*/
  _imp_initialise(argc, argv);

  //     7  !SYMBOLIC CONSTANTS
  //     8  %CONSTINTEGER SIN=1, REQUEST=0;  !SOURCE INPUT STREAMS
  //     9  %CONSTINTEGER ERR=0, DOC=1, SOUT=2;  !OUTPUT STREAMS
  //    10  %CONSTINTEGER LBOUND=200;  !LINE BUFF BOUND
  //    11  %CONSTINTEGER ABOUND=200;  !ATOM BUFF BOUND
  //    12  %CONSTINTEGER SBOUND=200;  !SOURCE LINE BUFF BOUND
  //    13  %CONSTINTEGER VBOUND=25;  !VECTOR (EG TAB) BOUND
  //    14  %CONSTINTEGER ESCBIT=256, UNDBIT=128, CASEBIT=32
  //    15  %CONSTINTEGER CHARMASK=255, BASICMASK=127, LETMASK=95
  //    16  %CONSTINTEGER SENTSP=544;  !512+' '
  //    17  !LAYOUT PARAMETERS
  //    18  %OWNINTEGER CHOOSE = -1;! NO USER REQUEST

  static int CHOOSE = -1;

  //    19  %OWNINTEGER NEW PAGE=0, NEW SECT = 0

  static int NEWPAGE = 0;
  static int NEWSECT = 0;

  //    20  %OWNINTEGER TOP=2, BOTTOM=4, LEFT=0, PAGE=60, LINE=72

  static int TOP = 2;
  static int BOTTOM = 4;
  static int LEFT = 0;
  static int PAGE = 60;
  static int LINE = 72;

  //    21  %OWNINTEGER SLINE=80, NLS=1, SGAP=2, PGAP=3

  static int SLINE = 80;
  static int NLS = 1;
  static int SGAP = 2;
  static int PGAP = 3;

  //    22  %OWNINTEGER INDENT=0, SECTNO=0, PAGENO=0, START=0, FINISH=9999

  static int INDENT = 0;
  static int SECTNO = 0;
  static int PAGENO = 0;
  static int START = 0;
  static int FINISH = 9999;

  //    23  %OWNINTEGER CAP='@', UND='_', CAPSH='.', UNDSH='%', INVERT=32

  static int CAP = 64;
  static int UND = 95;
  static int CAPSH = 46;
  static int UNDSH = 37;
  static int INVERT = 32;

  //    24  %OWNINTEGER CAPO='@', UNDO='_', CAPSHO='.', UNDSHO='%', INVERTO=32

  static int CAPO = 64;
  static int UNDO = 95;
  static int CAPSHO = 46;
  static int UNDSHO = 37;
  static int INVERTO = 32;

  //    25  %OWNINTEGER ASCII=1, JUST=0, MARK=0, ESCAPE='$'

  static int ASCII = 1;
  static int JUST = 0;
  static int MARK = 0;
  static int ESCAPE = 36;

  //    26  %OWNINTEGERARRAY TAB(0:77) = 1,9,17,25,33,41,49,57,65,73,81,

  static int TAB[78] = {1,   9,   17,  25,  33,  41,  49,  57,  65,
                        73,  81,  89,  97,  105, 113, 121, 129, 137,
                        145, 153, 161, 169, 177, 185, 193, 201, [26 ... 77] = 0};
  struct _imp_dv TAB_dv = {TAB, sizeof(int) /*, dims, <bounds> */};

  //    27+     89,97,105,113,121,129,137,145,153,161,169,177,185,193,201,0(52)
  //    28
  //    29  %OWNINTEGER XLINES=0, LINECAPIND=0, LINEUNDIND=0, LINEMIDIND=0

  static int XLINES = 0;
  static int LINECAPIND = 0;
  static int LINEUNDIND = 0;
  static int LINEMIDIND = 0;

  //    30  %OWNINTEGER INDENTIND=1, ERRIND=0, XPAGE=1

  static int INDENTIND = 1;
  static int ERRIND = 0;
  static int XPAGE = 1;

  //    31  %OWNINTEGER COLS=0;  !COLUMNS USED ON CURRENT LINE

  static int COLS = 0;

  //    32  %OWNINTEGER TEXTCOLS;  !LAST COL OCCUPIED

  static int TEXTCOLS;

  //    33  %OWNINTEGER LINES=0;  !LINES PRINTED ON CURRENT PAGE

  static int LINES = 0;

  //    34  %OWNINTEGER PAGES=0;  !TOTAL PAGES PRINTED

  static int PAGES = 0;

  //    35  %OWNINTEGER FIXED=0;  !FIXED COLUMNS

  static int FIXED = 0;

  //    36  %OWNINTEGER GAPS=0, SGAPS=0;  !TOTAL GAPS, SENTENCE GAPS

  static int GAPS = 0;
  static int SGAPS = 0;

  //    37  %OWNINTEGER SIZE=0;  !SIZE OF CURRENT ATOM

  static int SIZE = 0;

  //    38  %OWNINTEGER SMAX=0;  !UPDATED SOURCE POINTER

  static int SMAX = 0;

  //    39  %OWNINTEGER INDENTCOL=1

  static int INDENTCOL = 1;

  //    40  %OWNINTEGER NEXT=0

  static int NEXT = 0;

  //    41  %INTEGER DIRECTIVE,RELIND,FREELIST,NUM

  int DIRECTIVE;
  int RELIND;
  int FREELIST;
  int NUM;

  //    42  %INTEGERARRAY BUFF(1:LBOUND);  !LINE BUFFER

  int BUFF[200];
  struct _imp_dv BUFF_dv = {BUFF, sizeof(int) /*, dims, <bounds> */};

  //    43  %INTEGERARRAY ABUFF(1:ABOUND);  !ATOM BUFFER

  int ABUFF[200];
  struct _imp_dv ABUFF_dv = {ABUFF, sizeof(int) /*, dims, <bounds> */};

  //    44  %INTEGERARRAY SBUFF(1:SBOUND);  !SOURCE LINE (UPDATED)

  int SBUFF[200];
  struct _imp_dv SBUFF_dv = {SBUFF, sizeof(int) /*, dims, <bounds> */};

  //    45  %INTEGERARRAY LINK(1:108), HEAD,TAIL(1:500)

  int LINK[108];
  struct _imp_dv LINK_dv = {LINK, sizeof(int) /*, dims, <bounds> */};

  int HEAD[500];
  struct _imp_dv HEAD_dv = {HEAD, sizeof(int) /*, dims, <bounds> */};

  int TAIL[500];
  struct _imp_dv TAIL_dv = {TAIL, sizeof(int) /*, dims, <bounds> */};

  //    46
  //    47  %ROUTINE FAULT(%INTEGER N)

  void FAULT(int N) {
    //    48  %SWITCH S(1:9)

    int S_index;
    int S_line;
    char *S_file;
    static const void *S[9] = {&&case_S_missing, &&case_S_missing, &&case_S_missing, &&case_S_missing, &&case_S_missing,
                               &&case_S_missing, &&case_S_missing, &&case_S_missing, &&case_S_missing};

    //    49      SELECT OUTPUT(ERR)

    _imp_SELECTOUTPUT(0);

    //    50      PRINT SYMBOL('*')

    _imp_PRINTSYMBOL(42);

    //    51      ->S(N)

    S_line = __LINE__;
    S_file = __FILE__;
    S_index = N;
    goto case_S_dispatch;

    //    52  S(1): PRINT STRING("FAULTY FORMAT AT ")

  case_S_1:;
    _imp_PRINTSTRING(_imp_str_literal("FAULTY FORMAT AT "));

    //    53      PRINT SYMBOL(NEXT)

    _imp_PRINTSYMBOL(NEXT);

    //    54      ->L9

    goto U_1000;

    //    55  S(3): PRINT STRING("UNKNOWN NAME");  ->L9

  case_S_3:;
    _imp_PRINTSTRING(_imp_str_literal("UNKNOWN NAME"));
    goto U_1000;

    //    56  S(4): PRINT STRING("SCALAR/VECTOR MISMATCH");  ->L9

  case_S_4:;
    _imp_PRINTSTRING(_imp_str_literal("SCALAR/VECTOR MISMATCH"));
    goto U_1000;

    //    57  S(5): PRINT STRING("UNKNOWN DIRECTIVE ");  ->L8

  case_S_5:;
    _imp_PRINTSTRING(_imp_str_literal("UNKNOWN DIRECTIVE "));
    goto U_1001;

    //    58  S(6): PRINT STRING("SPURIOUS DIRECTIVE ");  ->L8

  case_S_6:;
    _imp_PRINTSTRING(_imp_str_literal("SPURIOUS DIRECTIVE "));
    goto U_1001;

    //    59  S(7): PRINT STRING("OUT OF BOUNDS ");  ->L8

  case_S_7:;
    _imp_PRINTSTRING(_imp_str_literal("OUT OF BOUNDS "));
    goto U_1001;

    //    60  S(8): PRINT STRING("OFF PAGE ");  ->L8

  case_S_8:;
    _imp_PRINTSTRING(_imp_str_literal("OFF PAGE "));
    goto U_1001;

    //    61  S(9): PRINT STRING("OVER TEXT ")

  case_S_9:;
    _imp_PRINTSTRING(_imp_str_literal("OVER TEXT "));

    //    62  L8:  PRINT SYMBOL(DIRECTIVE)

  U_1001:;
    _imp_PRINTSYMBOL(DIRECTIVE);

    //    63      PRINT SYMBOL(RELIND) %IF RELIND # 0

    if (RELIND == 0) goto L_0002;
    _imp_PRINTSYMBOL(RELIND);
  L_0002:;

  //    64  L9:  ERRIND = 1

  U_1000:;
    ERRIND = 1;

    //    65      NEWLINE

    _imp_NEWLINE();

    //    66  %END

    return;

  case_S_dispatch:
    if (S_index < 1 || S_index > 9)
      _imp_signalf(6, 3, S_index, "->S(%d) out of bounds at %s line %d", S_index, S_file, S_line);
    goto *S[S_index - 1];

  case_S_missing:
    _imp_signalf(8, 2, S_index, "switch jump to undefined label S(%d): at %s line %d", S_index, S_file, S_line);
  } /* end of FAULT */

  //    67
  //    68  %ROUTINE READ ATOM OR DIRECTIVE

  void READATOMORDIRECTIVE(void) {
    //    69  %INTEGER K,C,U,ATOMCAPIND,ATOMUNDIND

    int K;
    int C;
    int U;
    int ATOMCAPIND;
    int ATOMUNDIND;

    //    70      %IF NEXT = 0 %THEN READ SYMBOL(K) %ELSE K = NEXT %AND NEXT = 0

    if (NEXT != 0) goto L_0003;
    _imp_READSYMBOL(/*?*/ &K);
    goto L_0004;
  L_0003:;
    K = NEXT;
    NEXT = 0;
  L_0004:;

  //    71      DIRECTIVE = 0;  SIZE = 0

    DIRECTIVE = 0;
    SIZE = 0;

    //    72      ATOMCAPIND = 0;  ATOMUNDIND = 0

    ATOMCAPIND = 0;
    ATOMUNDIND = 0;

    //    73      ATOMCAPIND = CASEBIT %AND READ SYMBOL(K) %IF K = CAPSH

    if (K != CAPSH) goto L_0005;
    ATOMCAPIND = 32;
    _imp_READSYMBOL(/*?*/ &K);
  L_0005:;

  //    74      %CYCLE

  L_0006:;

  //    75         READ SYMBOL(K) %AND K = K+ESCBIT %IF K = ESCAPE

    if (K != ESCAPE) goto L_0007;
    _imp_READSYMBOL(/*?*/ &K);
    K = K + 256;
  L_0007:;

  //    76         ATOMUNDIND = UNDBIT %AND READ SYMBOL(K) %IF K = UNDSH

    if (K != UNDSH) goto L_0008;
    ATOMUNDIND = 128;
    _imp_READSYMBOL(/*?*/ &K);
  L_0008:;

  //    77         C = LINECAPIND!ATOMCAPIND

    C = LINECAPIND | ATOMCAPIND;

    //    78         U = LINEUNDIND

    U = LINEUNDIND;

    //    79         U = U!ATOMUNDIND %UNLESS K = ' '

    if (K == 32) goto L_0009;
    U = U | ATOMUNDIND;
  L_0009:;

  //    80         U = UNDBIT %AND READ SYMBOL(K) %IF K = UND

    if (K != UND) goto L_000A;
    U = 128;
    _imp_READSYMBOL(/*?*/ &K);
  L_000A:;

  //    81         C = CASEBIT %AND READ SYMBOL(K) %IF K = CAP

    if (K != CAP) goto L_000B;
    C = 32;
    _imp_READSYMBOL(/*?*/ &K);
  L_000B:;

  //    82  TWIT:       K = K!!INVERT %IF 'A' <= K&LETMASK <= 'Z';  !LET

  U_1002:;
    {
      // Double-sided test on K & 95 (Part I)
      int tmp;
      if (65 > (tmp = K & 95)) goto L_000C;
      // Double-sided test on K & 95 (Part II)
      if (tmp > 90) goto L_000C;
    }
    K = K ^ INVERT;
  L_000C:;

  //    83         K = K-C %IF 'A' <= K&BASICMASK-CASEBIT <= 'Z';  !LC LET

    {
      // Double-sided test on (K & 127) - 32 (Part I)
      int tmp;
      if (65 > (tmp = (K & 127) - 32)) goto L_000D;
      // Double-sided test on (K & 127) - 32 (Part II)
      if (tmp > 90) goto L_000D;
    }
    K = K - C;
  L_000D:;

  //    84         %EXIT %IF K = NL

    if (K != 10) goto L_000E;
    goto L_000F;
  L_000E:;

  //    85         K = K!U

    K = K | U;

    //    86         %EXIT %IF K = ' '

    if (K != 32) goto L_0010;
    goto L_000F;
  L_0010:;

  //    87         %IF K&ESCBIT # 0 %AND ('A' <= K&LETMASK <= 'Z'   %C

    if (K & 256 == 0) goto L_0011;
    {
      // Double-sided test on K & 95 (Part I)
      int tmp;
      if (65 > (tmp = K & 95)) goto L_0012;
      // Double-sided test on K & 95 (Part II)
      if (tmp <= 90) goto L_0013;
    }
  L_0012:;
    if (K & 95 != 10) goto L_0011;
  L_0013:;

  //    88+                                      %OR K&LETMASK = NL) %START
  //    89            %EXIT %IF SIZE # 0

    if (SIZE == 0) goto L_0014;
    goto L_000F;
  L_0014:;

  //    90            DIRECTIVE = K&LETMASK;  READ SYMBOL(NEXT)

    DIRECTIVE = K & 95;
    _imp_READSYMBOL(/*?*/ &NEXT);

    //    91            %RETURN

    return;

    //    92         %FINISH

  L_0011:;

  //    93         SIZE = SIZE+1;  ABUFF(SIZE) = K

    SIZE = SIZE + 1;
    ABUFF[SIZE - 1] = K;

    //    94         READ SYMBOL(K)

    _imp_READSYMBOL(/*?*/ &K);

    //    95      %REPEAT

    goto L_0006;
  L_000F:;

  //    96      NEXT = K

    NEXT = K;

    //    97      %RETURN %IF ATOMUNDIND = 0 %OR SIZE = 0

    if (ATOMUNDIND == 0) goto L_0015;
    if (SIZE != 0) goto L_0016;
  L_0015:;
    return;
  L_0016:;

  //    98      K = ABUFF(SIZE)!!UNDBIT

    K = ABUFF[SIZE - 1] ^ 128;

    //    99      ABUFF(SIZE) = K %IF K = '.' %OR K = ',' %OR K = ':' %OR K = ';' %OR K = ')'

    if (K == 46) goto L_0017;
    if (K == 44) goto L_0017;
    if (K == 58) goto L_0017;
    if (K == 59) goto L_0017;
    if (K != 41) goto L_0018;
  L_0017:;
    ABUFF[SIZE - 1] = K;
  L_0018:;

  //   100  %END

    return;
  } /* end of READATOMORDIRECTIVE */

  // ?TWIT unused
  //   101
  //   102  %ROUTINE PRINT SOURCE LINE

  void PRINTSOURCELINE(void) {
    //   103  %INTEGER I

    int I;

    //   104      %IF ERRIND # 0 %START

    if (ERRIND == 0) goto L_0019;

      //   105         SELECT OUTPUT(ERR)

    _imp_SELECTOUTPUT(0);

    //   106         I = 0

    I = 0;

    //   107         I = I+1 %AND PRINT SYMBOL(SBUFF(I)) %WHILE I # SMAX

  L_001A:;
    if (I == SMAX) goto L_001B;
    I = I + 1;
    _imp_PRINTSYMBOL(SBUFF[I - 1]);
    goto L_001A;
  L_001B:;

  //   108         NEWLINE

    _imp_NEWLINE();

    //   109         ERRIND = 0

    ERRIND = 0;

    //   110      %FINISH

  L_0019:;

  //   111      SELECT OUTPUT(SOUT)

    _imp_SELECTOUTPUT(2);

    //   112      I = 0

    I = 0;

    //   113      I = I+1 %AND PRINT SYMBOL(SBUFF(I)) %WHILE I # SMAX

  L_001C:;
    if (I == SMAX) goto L_001D;
    I = I + 1;
    _imp_PRINTSYMBOL(SBUFF[I - 1]);
    goto L_001C;
  L_001D:;

  //   114      NEWLINE;  SMAX = 0

    _imp_NEWLINE();
    SMAX = 0;

    //   115  %END

    return;
  } /* end of PRINTSOURCELINE */

  //   116
  //   117  %ROUTINE STORE(%INTEGER K)

  void STORE(int K) {
    //   118      SMAX = SMAX+1;  SBUFF(SMAX) = K

    SMAX = SMAX + 1;
    SBUFF[SMAX - 1] = K;

    //   119  %END

    return;
  } /* end of STORE */

  //   120
  //   121  %ROUTINE STORE SOURCE ATOM

  void STORESOURCEATOM(void) {
    //   122  %INTEGER I,J,K,ATOMCAPIND,ATOMUNDIND

    int I;
    int J;
    int K;
    int ATOMCAPIND;
    int ATOMUNDIND;

    //   123
    //   124  %ROUTINE TRANSLATE UNDERLINE

    void TRANSLATEUNDERLINE(void) {
      //   125  %INTEGER P,Q

      int P;
      int Q;

      //   126      K = K-UNDBIT %AND %RETURN %IF LINEUNDIND # 0

      if (LINEUNDIND == 0) goto L_001E;
      K = K - 128;
      return;
    L_001E:;

    //   127      ->ONE %IF K&BASICMASK = ' '

      if (K & 127 != 32) goto L_001F;
      goto U_1003;
    L_001F:;

    //   128      K = K-UNDBIT %AND %RETURN %IF ATOMUNDIND # 0

      if (ATOMUNDIND == 0) goto L_0020;
      K = K - 128;
      return;
    L_0020:;

    //   129      ->ONE %IF UNDSHO = 0

      if (UNDSHO != 0) goto L_0021;
      goto U_1003;
    L_0021:;

    //   130      P = I

      P = I;

      //   131      %WHILE P # SIZE %CYCLE

    L_0022:;
      if (P == SIZE) goto L_0023;

        //   132         P = P+1;  Q = ABUFF(P)

      P = P + 1;
      Q = ABUFF[P - 1];

      //   133         ->ONE %IF Q&UNDBIT = 0 %AND (P # SIZE %OR %C

      if (Q & 128 != 0) goto L_0024;
      if (P != SIZE) goto L_0025;
      if (Q == 46) goto L_0024;
      if (Q == 44) goto L_0024;
      if (Q == 58) goto L_0024;
      if (Q == 59) goto L_0024;
      if (Q == 41) goto L_0024;
    L_0025:;
      goto U_1003;
    L_0024:;

    //   134+         (Q # '.' %AND Q # ',' %AND Q # ':' %AND Q # ';' %AND Q # ')'))
    //   135      %REPEAT

      goto L_0022;
    L_0023:;

    //   136      STORE(UNDSHO);  K = K-UNDBIT;  ATOMUNDIND = 1

      STORE(UNDSHO);
      K = K - 128;
      ATOMUNDIND = 1;

      //   137      %RETURN

      return;

      //   138  ONE:%RETURN %IF UNDO = 0

    U_1003:;
      if (UNDO != 0) goto L_0026;
      return;
    L_0026:;

    //   139      STORE(UNDO);  K = K-UNDBIT

      STORE(UNDO);
      K = K - 128;

      //   140  %END

      return;
    } /* end of TRANSLATEUNDERLINE */

    //   141
    //   142      ATOMCAPIND = 0;  ATOMUNDIND = 0

    ATOMCAPIND = 0;
    ATOMUNDIND = 0;

    //   143      %IF LINECAPIND = 0 %AND CAPSHO # 0 %AND SIZE >= 2 %START

    if (LINECAPIND != 0) goto L_0027;
    if (CAPSHO == 0) goto L_0027;
    if (SIZE < 2) goto L_0027;

      //   144         %CYCLE I = 1,1,SIZE

    // %for I = 1, 1, SIZE %cycle
    {
      int _final = SIZE;
      if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle I = 1, 1, SIZE");
      I = 0;
    L_0028:
      if (I == _final) goto L_0029;
      I += 1;

      //   145            K = ABUFF(I)&BASICMASK

      K = ABUFF[I - 1] & 127;

      //   146            ATOMCAPIND = 0 %AND %EXIT %IF 'A' <= K-CASEBIT <= 'Z';  !LC

      {
        // Double-sided test on K - 32 (Part I)
        int tmp;
        if (65 > (tmp = K - 32)) goto L_002B;
        // Double-sided test on K - 32 (Part II)
        if (tmp > 90) goto L_002B;
      }
      ATOMCAPIND = 0;
      goto L_0029;
    L_002B:;

    //   147            ATOMCAPIND = ATOMCAPIND+1 %IF 'A' <= K <= 'Z';  !UC

      {
        // Double-sided test on K (Part I)
        int tmp;
        if (65 > (tmp = K)) goto L_002C;
        // Double-sided test on K (Part II)
        if (tmp > 90) goto L_002C;
      }
      ATOMCAPIND = ATOMCAPIND + 1;
    L_002C:;

    //   148         %REPEAT

      goto L_0028;
    }

  L_0029:;

  //   149      %FINISH

  L_0027:;

  //   150      %IF SMAX # 0 %AND XLINES = 0 %START

    if (SMAX == 0) goto L_002D;
    if (XLINES != 0) goto L_002D;

      //   151         %IF SMAX+SIZE+1 <= SLINE %THEN STORE(' ') %C

    if (SMAX + SIZE + 1 > SLINE) goto L_002E;
    STORE(32);
    goto L_002F;
  L_002E:;
    PRINTSOURCELINE();
  L_002F:;

  //   152+        %ELSE PRINT SOURCE LINE
  //   153      %FINISH

  L_002D:;

  //   154      STORE(CAPSHO) %IF ATOMCAPIND # 0

    if (ATOMCAPIND == 0) goto L_0030;
    STORE(CAPSHO);
  L_0030:;

  //   155      %CYCLE I = 1,1,SIZE

    // %for I = 1, 1, SIZE %cycle
    {
      int _final = SIZE;
      if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle I = 1, 1, SIZE");
      I = 0;
    L_0031:
      if (I == _final) goto L_0032;
      I += 1;

      //   156         K = ABUFF(I)

      K = ABUFF[I - 1];

      //   157         TRANSLATE UNDERLINE %IF K&UNDBIT # 0

      if (K & 128 == 0) goto L_0034;
      TRANSLATEUNDERLINE();
    L_0034:;

    //   158         K = K+CASEBIT %IF 'A' <= K <= 'Z' %AND (LINECAPIND # 0 %C

      {
        // Double-sided test on K (Part I)
        int tmp;
        if (65 > (tmp = K)) goto L_0035;
        // Double-sided test on K (Part II)
        if (tmp > 90) goto L_0035;
      }
      if (LINECAPIND != 0) goto L_002A;
      if (ATOMCAPIND == 0) goto L_0035;
    L_002A:;
      K = K + 32;
    L_0035:;

    //   159+                             %OR ATOMCAPIND # 0)
    //   160         STORE(CAPO) %AND K = K+CASEBIT %IF 'A' <= K <= 'Z' %AND CAPO # 0

      {
        // Double-sided test on K (Part I)
        int tmp;
        if (65 > (tmp = K)) goto L_0036;
        // Double-sided test on K (Part II)
        if (tmp > 90) goto L_0036;
      }
      if (CAPO == 0) goto L_0036;
      STORE(CAPO);
      K = K + 32;
    L_0036:;

    //   161         K = K!!INVERTO %IF 'A' <= K&LETMASK <= 'Z'

      {
        // Double-sided test on K & 95 (Part I)
        int tmp;
        if (65 > (tmp = K & 95)) goto L_0037;
        // Double-sided test on K & 95 (Part II)
        if (tmp > 90) goto L_0037;
      }
      K = K ^ INVERTO;
    L_0037:;

    //   162         STORE(ESCAPE) %IF K&ESCBIT # 0

      if (K & 256 == 0) goto L_0038;
      STORE(ESCAPE);
    L_0038:;

    //   163         STORE(K&CHARMASK)

      STORE(K & 255);

      //   164      %REPEAT

      goto L_0031;
    }

  L_0032:;

  //   165  %END

    return;
  } /* end of STORESOURCEATOM */

  // ?J unused
  //   166
  //   167  %ROUTINE SET COLUMN(%INTEGER M)

  void SETCOLUMN(int M) {
    //   168      %IF 1 <= M <= LINE %START

    {
      // Double-sided test on M (Part I)
      int tmp;
      if (1 > (tmp = M)) goto L_0039;
      // Double-sided test on M (Part II)
      if (tmp > LINE) goto L_0039;
    }

    //   169         M = M-1

    M = M - 1;

    //   170         %IF M > COLS %START

    if (M <= COLS) goto L_003A;

      //   171            COLS = COLS+1 %AND BUFF(COLS) = ' ' %UNTIL COLS = M

  L_003B:;
    COLS = COLS + 1;
    BUFF[COLS - 1] = 32;
    if (COLS == M) goto L_003C;
    goto L_003B;
  L_003C:;

  //   172         %FINISH %ELSE %START

    goto L_003D;
  L_003A:;

  //   173            %WHILE COLS # M %CYCLE

  L_003E:;
    if (COLS == M) goto L_003F;

      //   174               FAULT(9) %AND %EXIT %IF BUFF(COLS) # ' '

    if (BUFF[COLS - 1] == 32) goto L_0040;
    FAULT(9);
    goto L_003F;
  L_0040:;

  //   175               COLS = COLS-1

    COLS = COLS - 1;

    //   176            %REPEAT

    goto L_003E;
  L_003F:;

  //   177         %FINISH

  L_003D:;

  //   178      %FINISH %ELSE %START

    goto L_0041;
  L_0039:;

  //   179         FAULT(8);  INDENTCOL = 1 %IF INDENTCOL = M

    FAULT(8);
    if (INDENTCOL != M) goto L_0042;
    INDENTCOL = 1;
  L_0042:;

  //   180      %FINISH

  L_0041:;

  //   181      FIXED = COLS;  GAPS = 0;  SGAPS = 0

    FIXED = COLS;
    GAPS = 0;
    SGAPS = 0;

    //   182  %END

    return;
  } /* end of SETCOLUMN */

  //   183
  //   184  %ROUTINE MARK DOC

  void MARKDOC(void) {
    //   185      %IF MARK = 1 %START

    if (MARK != 1) goto L_0043;

      //   186         PRINT SYMBOL('=');  SPACES(LINE-2);  PRINT SYMBOL('=')

    _imp_PRINTSYMBOL(61);
    _imp_SPACES(LINE - 2);
    _imp_PRINTSYMBOL(61);

    //   187         NEWLINE

    _imp_NEWLINE();

    //   188      %FINISH %ELSE %START

    goto L_0044;
  L_0043:;

  //   189         PRINT SYMBOL(12);  !FORM FEED

    _imp_PRINTSYMBOL(12);

    //   190      %FINISH

  L_0044:;

  //   191  %END

    return;
  } /* end of MARKDOC */

  //   192
  //   193  %ROUTINE RESET DOC LINE

  void RESETDOCLINE(void) {
    //   194      %IF XLINES # 0 %START

    if (XLINES == 0) goto L_0045;

      //   195         XLINES = XLINES-1

    XLINES = XLINES - 1;

    //   196         %IF XLINES = 0 %START

    if (XLINES != 0) goto L_0046;

      //   197            LINECAPIND = 0;  LINEUNDIND = 0

    LINECAPIND = 0;
    LINEUNDIND = 0;

    //   198            LINEMIDIND = 0;  INDENTIND = 1

    LINEMIDIND = 0;
    INDENTIND = 1;

    //   199         %FINISH

  L_0046:;

  //   200      %FINISH

  L_0045:;

  //   201      TEXTCOLS = 0;  COLS = 0;  FIXED = 0;  XPAGE = 0

    TEXTCOLS = 0;
    COLS = 0;
    FIXED = 0;
    XPAGE = 0;

    //   202      SET COLUMN(INDENTCOL) %IF INDENTIND # 0

    if (INDENTIND == 0) goto L_0047;
    SETCOLUMN(INDENTCOL);
  L_0047:;

  //   203  %END

    return;
  } /* end of RESETDOCLINE */

  //   204
  //   205  %ROUTINE TURN PAGE

  void TURNPAGE(void) {
    //   206     %ROUTINE GET

    void GET(void) {
      //   207        SELECTOUTPUT(0)

      _imp_SELECTOUTPUT(0);

      //   208        PRINTSTRING("SECTION:");  PRINTSYMBOL(4)

      _imp_PRINTSTRING(_imp_str_literal("SECTION:"));
      _imp_PRINTSYMBOL(4);

      //   209        SELECTOUTPUT(DOC)

      _imp_SELECTOUTPUT(1);

      //   210        %CYCLE

    L_0048:;

    //   211           %EXIT %IF '0' <= NEXTSYMBOL <= '9'

      {
        // Double-sided test on _imp_NEXTSYMBOL() (Part I)
        int tmp;
        if (48 > (tmp = _imp_NEXTSYMBOL())) goto L_0049;
        // Double-sided test on _imp_NEXTSYMBOL() (Part II)
        if (tmp > 57) goto L_0049;
      }
      goto L_004A;
    L_0049:;

    //   212           SKIPSYMBOL

      _imp_SKIPSYMBOL();

      //   213        %REPEAT

      goto L_0048;
    L_004A:;

    //   214        READ(NEW SECT)

      _imp_READ(/*?*/ &NEWSECT);

      //   215        NEW PAGE = 0

      NEWPAGE = 0;

      //   216        %RETURN %UNLESS NEXTSYMBOL = '-'

      if (_imp_NEXTSYMBOL() == 45) goto L_004B;
      return;
    L_004B:;

    //   217        SKIPSYMBOL

      _imp_SKIPSYMBOL();

      //   218        %RETURN %UNLESS '0' <= NEXTSYMBOL <= '9'

      {
        // Double-sided test on _imp_NEXTSYMBOL() (Part I)
        int tmp;
        if (48 > (tmp = _imp_NEXTSYMBOL())) goto L_0033;
        // Double-sided test on _imp_NEXTSYMBOL() (Part II)
        if (tmp <= 57) goto L_004C;
      }
    L_0033:;
      return;
    L_004C:;

    //   219        READ(NEW PAGE)

      _imp_READ(/*?*/ &NEWPAGE);

      //   220     %END

      return;
    } /* end of GET */

    //   221     %RETURN %IF CHOOSE < 0

    if (CHOOSE >= 0) goto L_004D;
    return;
  L_004D:;

  //   222     %IF START = 0 %START

    if (START != 0) goto L_004E;

      //   223        START = 9999

    START = 9999;

    //   224     %ELSE

    goto L_004F;
  L_004E:;

  //   225        %IF START = 9999 %START

    if (START != 9999) goto L_0050;

      //   226           START = START-1

    START = START - 1;

    //   227           SELECTINPUT(REQUEST)

    _imp_SELECTINPUT(0);

    //   228           %CYCLE

  L_0051:;

  //   229              GET

    GET();

    //   230              %EXIT %IF NEWSECT > SECTNO

    if (NEWSECT <= SECTNO) goto L_0052;
    goto L_0053;
  L_0052:;

  //   231              %EXIT %IF NEWSECT=SECTNO %AND (NEW PAGE=0 %OR NEWPAGE>=PAGENO)

    if (NEWSECT != SECTNO) goto L_0054;
    if (NEWPAGE == 0) goto L_0055;
    if (NEWPAGE < PAGENO) goto L_0054;
  L_0055:;
    goto L_0053;
  L_0054:;

  //   232           %REPEAT

    goto L_0051;
  L_0053:;

  //   233           SELECTINPUT(SIN)

    _imp_SELECTINPUT(1);

    //   234        %FINISH

  L_0050:;

  //   235     %FINISH

  L_004F:;

  //   236     START=0 %IF NEWSECT=SECTNO %AND %C

    if (NEWSECT != SECTNO) goto L_0056;
    if (NEWPAGE == 0) goto L_0057;
    if (NEWPAGE != PAGENO) goto L_0056;
  L_0057:;
    START = 0;
  L_0056:;

  //   237+                (NEWPAGE=0 %OR NEWPAGE=PAGENO)
  //   238  %END

    return;
  } /* end of TURNPAGE */

  //   239  %ROUTINE PRINT DOC LINE

  void PRINTDOCLINE(void) {
    //   240  %OWNINTEGER CR = 13

    static int CR = 13;

    //   241  %INTEGER I,J,K,L,M,U

    int I;
    int J;
    int K;
    int L;
    int M;
    int U;

    //   242      LINES = LINES+NLS

    LINES = LINES + NLS;

    //   243      %IF PAGES+1 >= START %START

    if (PAGES + 1 < START) goto L_0058;

      //   244         SELECT OUTPUT(DOC)

    _imp_SELECTOUTPUT(1);

    //   245         %IF LINES = NLS %START

    if (LINES != NLS) goto L_0059;

      //   246            MARK DOC %IF MARK # 0

    if (MARK == 0) goto L_005A;
    MARKDOC();
  L_005A:;

  //   247            NEWLINES(TOP)

    _imp_NEWLINES(TOP);

    //   248         %FINISH

  L_0059:;

  //   249         %IF TEXTCOLS # 0 %START

    if (TEXTCOLS == 0) goto L_005B;

      //   250            L = LEFT

    L = LEFT;

    //   251            L = L+(LINE-COLS)//2 %IF LINEMIDIND # 0

    if (LINEMIDIND == 0) goto L_005C;
    L = L + ((long)(LINE - COLS) / (long)2);
  L_005C:;

  //   252            SPACES(L);  U = UNDBIT

    _imp_SPACES(L);
    U = 128;

    //   253            %CYCLE I = 1,1,COLS

    // %for I = 1, 1, COLS %cycle
    {
      int _final = COLS;
      if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle I = 1, 1, COLS");
      I = 0;
    L_005D:
      if (I == _final) goto L_005E;
      I += 1;

      //   254               K = BUFF(I)

      K = BUFF[I - 1];

      //   255               %IF K&U # 0 %START

      if (K & U == 0) goto L_0060;

        //   256                  M = I

      M = I;

      //   257                  %CYCLE J = I,1,COLS

      // %for J = I, 1, COLS %cycle
      {
        int _initial = I, _final = COLS;
        if (invalid_for_loop(_initial, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle J = I, 1, COLS");
        J = _initial - (1);
      L_0061:
        if (J == _final) goto L_0062;
        J += 1;

        //   258                     %IF BUFF(J)&UNDBIT # 0 %START

        if (BUFF[J - 1] & 128 == 0) goto L_0064;

          //   259                        SPACES(J-M)

        _imp_SPACES(J - M);

        //   260                        PRINT SYMBOL('_')

        _imp_PRINTSYMBOL(95);

        //   261                        M = J+1

        M = J + 1;

        //   262                     %FINISH

      L_0064:;

      //   263                  %REPEAT

        goto L_0061;
      }

    L_0062:;

    //   264                  PRINT SYMBOL(CR);  PRINT SYMBOL(CR)

      _imp_PRINTSYMBOL(CR);
      _imp_PRINTSYMBOL(CR);

      //   265                  SPACES(L+I-1);  U = 0

      _imp_SPACES(L + I - 1);
      U = 0;

      //   266               %FINISH

    L_0060:;

    //   267               PRINT SYMBOL(K&BASICMASK)

      _imp_PRINTSYMBOL(K & 127);

      //   268            %REPEAT

      goto L_005D;
    }

  L_005E:;

  //   269         %FINISH

  L_005B:;

  //   270         NEWLINES(NLS)

    _imp_NEWLINES(NLS);

    //   271         %IF LINES >= PAGE %AND BOTTOM # 0 %START

    if (LINES < PAGE) goto L_0065;
    if (BOTTOM == 0) goto L_0065;

      //   272            %IF PAGENO = 0 %START

    if (PAGENO != 0) goto L_0066;

      //   273            %FINISH %ELSE %START

    goto L_0067;
  L_0066:;

  //   274               I = BOTTOM//2

    I = ((long)BOTTOM / (long)2);

    //   275               NEWLINES(I)

    _imp_NEWLINES(I);

    //   276              SPACES(LEFT+LINE//2-7)

    _imp_SPACES(LEFT + ((long)LINE / (long)2) - 7);

    //   277              %IF SECTNO = 0 %START

    if (SECTNO != 0) goto L_0068;

      //   278                 SPACES(2);  WRITE(PAGENO,1)

    _imp_SPACES(2);
    _imp_WRITE(PAGENO, 1);

    //   279              %ELSE

    goto L_0069;
  L_0068:;

  //   280                 WRITE(SECTNO,2);  WRITE(-PAGENO,1)

    _imp_WRITE(SECTNO, 2);
    _imp_WRITE(-PAGENO, 1);

    //   281              %FINISH

  L_0069:;

  //   282            %FINISH

  L_0067:;

  //   283         %FINISH

  L_0065:;

  //   284      %FINISH

  L_0058:;

  //   285      %IF LINES >= PAGE %START

    if (LINES < PAGE) goto L_006A;

      //   286         LINES = 0;  PAGES = PAGES+1

    LINES = 0;
    PAGES = PAGES + 1;

    //   287         PAGENO = PAGENO+1 %IF PAGENO # 0

    if (PAGENO == 0) goto L_006B;
    PAGENO = PAGENO + 1;
  L_006B:;

  //   288        TURN PAGE

    TURNPAGE();

    //   289      %FINISH

  L_006A:;

  //   290      RESET DOC LINE

    RESETDOCLINE();

    //   291  %END

    return;
  } /* end of PRINTDOCLINE */

  //   292
  //   293  %ROUTINE JUSTIFY

  void JUSTIFY(void) {
    //   294  %OWNINTEGER FLIP = 0

    static int FLIP = 0;

    //   295  %INTEGER I,J,K,L,MIN,COUNT,SCOUNT,WAIT,SWAIT

    int I;
    int J;
    int K;
    int L;
    int MIN;
    int COUNT;
    int SCOUNT;
    int WAIT;
    int SWAIT;

    //   296      COUNT = LINE-COLS

    COUNT = LINE - COLS;

    //   297      %RETURN %IF COUNT <= 0 %OR GAPS = 0

    if (COUNT <= 0) goto L_006C;
    if (GAPS != 0) goto L_006D;
  L_006C:;
    return;
  L_006D:;

  //   298      MIN = COUNT//GAPS

    MIN = ((long)COUNT / (long)GAPS);

    //   299      COUNT = COUNT-MIN*GAPS

    COUNT = COUNT - MIN * GAPS;

    //   300      SCOUNT = SGAPS;  SCOUNT = COUNT %IF COUNT < SGAPS

    SCOUNT = SGAPS;
    if (COUNT >= SGAPS) goto L_006E;
    SCOUNT = COUNT;
  L_006E:;

  //   301      COUNT = COUNT-SCOUNT

    COUNT = COUNT - SCOUNT;

    //   302      FLIP = 1-FLIP

    FLIP = 1 - FLIP;

    //   303      %IF FLIP # 0 %START

    if (FLIP == 0) goto L_006F;

      //   304         WAIT = 0;  SWAIT = 0

    WAIT = 0;
    SWAIT = 0;

    //   305      %FINISH %ELSE %START

    goto L_0070;
  L_006F:;

  //   306         WAIT = GAPS-COUNT;  SWAIT = SGAPS-SCOUNT

    WAIT = GAPS - COUNT;
    SWAIT = SGAPS - SCOUNT;

    //   307      %FINISH

  L_0070:;

  //   308      J = LINE

    J = LINE;

    //   309      %CYCLE I = COLS,-1,1

    // %for I = COLS,  -1, 1 %cycle
    {
      int _initial = COLS;
      if (invalid_for_loop(_initial, -1, 1)) _imp_signal(5, 1, 0, "Illegal cycle I = COLS,  -1, 1");
      I = _initial - (-1);
    L_0071:
      if (I == 1) goto L_0072;
      I -= 1;

      //   310         K = BUFF(I)

      K = BUFF[I - 1];

      //   311         %IF (K = SENTSP %OR K = ' ') %AND BUFF(I-1) # K %START

      if (K == 544) goto L_0074;
      if (K != 32) goto L_0075;
    L_0074:;
      if (BUFF[I - 1 - 1] == K) goto L_0075;

        //   312            L = J-MIN

      L = J - MIN;

      //   313            %IF WAIT = 0 %START

      if (WAIT != 0) goto L_0076;

        //   314               L = L-1 %AND COUNT = COUNT-1 %IF COUNT # 0

      if (COUNT == 0) goto L_0077;
      L = L - 1;
      COUNT = COUNT - 1;
    L_0077:;

    //   315            %FINISH %ELSE WAIT = WAIT-1

      goto L_0078;
    L_0076:;
      WAIT = WAIT - 1;
    L_0078:;

    //   316            %IF K = SENTSP %START

      if (K != 544) goto L_0079;

        //   317               %IF SWAIT = 0 %START

      if (SWAIT != 0) goto L_007A;

        //   318                  L = L-1 %AND SCOUNT = SCOUNT-1 %IF SCOUNT # 0

      if (SCOUNT == 0) goto L_007B;
      L = L - 1;
      SCOUNT = SCOUNT - 1;
    L_007B:;

    //   319               %FINISH %ELSE SWAIT = SWAIT-1

      goto L_007C;
    L_007A:;
      SWAIT = SWAIT - 1;
    L_007C:;

    //   320            %FINISH

    L_0079:;

    //   321            BUFF(J) = ' ' %AND J = J-1 %WHILE J # L

    L_007D:;
      if (J == L) goto L_007E;
      BUFF[J - 1] = 32;
      J = J - 1;
      goto L_007D;
    L_007E:;

    //   322            COLS = LINE %AND %RETURN %IF J = I

      if (J != I) goto L_007F;
      COLS = LINE;
      return;
    L_007F:;

    //   323         %FINISH

    L_0075:;

    //   324         BUFF(J) = K;  J = J-1

      BUFF[J - 1] = K;
      J = J - 1;

      //   325      %REPEAT

      goto L_0071;
    }

  L_0072:;

  //   326      %STOP

    _imp_stop(0);

    //   327  %END

  } /* end of JUSTIFY */

  //   328
  //   329  %ROUTINE PLACE ATOM

  void PLACEATOM(void) {
    //   330  %INTEGER I,L,S

    int I;
    int L;
    int S;

    //   331      %IF COLS # FIXED %AND XLINES = 0 %START

    if (COLS == FIXED) goto L_0080;
    if (XLINES != 0) goto L_0080;

      //   332         L = COLS+1;  S = ' '

    L = COLS + 1;
    S = 32;

    //   333         %IF (BUFF(COLS) = '.' %OR BUFF(COLS) = '?') %C

    if (BUFF[COLS - 1] == 46) goto L_0081;
    if (BUFF[COLS - 1] != 63) goto L_0082;
  L_0081:;
    {
      // Double-sided test on ABUFF[0] (Part I)
      int tmp;
      if (65 > (tmp = ABUFF[0])) goto L_0082;
      // Double-sided test on ABUFF[0] (Part II)
      if (tmp > 90) goto L_0082;
    }

    //   334+        %AND 'A' <= ABUFF(1) <= 'Z' %START
    //   335            L = COLS+SGAP;  S = SENTSP

    L = COLS + SGAP;
    S = 544;

    //   336         %FINISH

  L_0082:;

  //   337         %IF L+SIZE <= LINE %START

    if (L + SIZE > LINE) goto L_0083;

      //   338            COLS = COLS+1 %AND BUFF(COLS) = S %WHILE COLS # L

  L_0084:;
    if (COLS == L) goto L_0085;
    COLS = COLS + 1;
    BUFF[COLS - 1] = S;
    goto L_0084;
  L_0085:;

  //   339            GAPS = GAPS+1;  SGAPS = SGAPS+1 %IF S = SENTSP

    GAPS = GAPS + 1;
    if (S != 544) goto L_0086;
    SGAPS = SGAPS + 1;
  L_0086:;

  //   340         %FINISH %ELSE %START

    goto L_0087;
  L_0083:;

  //   341            JUSTIFY %IF JUST # 0

    if (JUST == 0) goto L_0088;
    JUSTIFY();
  L_0088:;

  //   342            PRINT DOC LINE

    PRINTDOCLINE();

    //   343            PRINT SOURCE LINE %IF SMAX # 0

    if (SMAX == 0) goto L_0089;
    PRINTSOURCELINE();
  L_0089:;

  //   344         %FINISH

  L_0087:;

  //   345      %FINISH

  L_0080:;

  //   346      I = 0

    I = 0;

    //   347      %WHILE I # SIZE %CYCLE

  L_008A:;
    if (I == SIZE) goto L_008B;

      //   348         COLS = COLS+1;  I = I+1

    COLS = COLS + 1;
    I = I + 1;

    //   349         BUFF(COLS) = ABUFF(I)

    BUFF[COLS - 1] = ABUFF[I - 1];

    //   350      %REPEAT

    goto L_008A;
  L_008B:;

  //   351      TEXTCOLS = COLS

    TEXTCOLS = COLS;

    //   352  %END

    return;
  } /* end of PLACEATOM */

  //   353
  //   354  %ROUTINE PROCESS DIRECTIVE

  void PROCESSDIRECTIVE(void) {
    //   355  %INTEGER D,C,T

    int D;
    int C;
    int T;

    //   356  %SWITCH S('A':'Z')

    int S_index;
    int S_line;
    char *S_file;
    static const void *S[26] = {&&case_S_65, &&case_S_66, &&case_S_67, &&case_S_68, &&case_S_69, &&case_S_70,
                                &&case_S_71, &&case_S_72, &&case_S_73, &&case_S_74, &&case_S_75, &&case_S_76,
                                &&case_S_77, &&case_S_78, &&case_S_79, &&case_S_80, &&case_S_81, &&case_S_82,
                                &&case_S_83, &&case_S_84, &&case_S_85, &&case_S_86, &&case_S_87, &&case_S_88,
                                &&case_S_89, &&case_S_90};

    auto void ASSIGN(void);

    //   357  %ROUTINESPEC ASSIGN
    //   358
    //   359  %ROUTINE SKIP

    void SKIP(void) {
      //   360      SMAX = SMAX+1;  SBUFF(SMAX) = NEXT

      SMAX = SMAX + 1;
      SBUFF[SMAX - 1] = NEXT;

      //   361      READ SYMBOL(NEXT)

      _imp_READSYMBOL(/*?*/ &NEXT);

      //   362  %END

      return;
    } /* end of SKIP */

    //   363
    //   364  %ROUTINE READ NUM

    void READNUM(void) {
      //   365      RELIND = 0;  NUM = 1

      RELIND = 0;
      NUM = 1;

      //   366      RELIND = NEXT %AND SKIP %IF NEXT = '+' %OR NEXT = '-'

      if (NEXT == 43) goto L_0073;
      if (NEXT != 45) goto L_008C;
    L_0073:;
      RELIND = NEXT;
      SKIP();
    L_008C:;

    //   367      %IF '0' <= NEXT <= '9' %START

      {
        // Double-sided test on NEXT (Part I)
        int tmp;
        if (48 > (tmp = NEXT)) goto L_008D;
        // Double-sided test on NEXT (Part II)
        if (tmp > 57) goto L_008D;
      }

      //   368         NUM = NEXT-'0';  SKIP

      NUM = NEXT - 48;
      SKIP();

      //   369         NUM = 10*NUM-'0'+NEXT %AND SKIP %WHILE '0' <= NEXT <= '9'

    L_008E:;
      {
        // Double-sided test on NEXT (Part I)
        int tmp;
        if (48 > (tmp = NEXT)) goto L_008F;
        // Double-sided test on NEXT (Part II)
        if (tmp > 57) goto L_008F;
      }
      NUM = 10 * NUM - 48 + NEXT;
      SKIP();
      goto L_008E;
    L_008F:;

    //   370      %FINISH

    L_008D:;

    //   371      NUM = -NUM %IF RELIND = '-'

      if (RELIND != 45) goto L_0090;
      NUM = -NUM;
    L_0090:;

    //   372  %END

      return;
    } /* end of READNUM */

    //   373
    //   374      D = DIRECTIVE&LETMASK

    D = DIRECTIVE & 95;

    //   375      %IF XLINES # 0 %START

    if (XLINES == 0) goto L_0091;

      //   376         FAULT(6) %IF XLINES > 0 %OR TEXTCOLS # 0

    if (XLINES > 0) goto L_0092;
    if (TEXTCOLS == 0) goto L_0093;
  L_0092:;
    FAULT(6);
  L_0093:;

  //   377         XLINES = 1;  RESET DOC LINE

    XLINES = 1;
    RESETDOCLINE();

    //   378      %FINISH

  L_0091:;

  //   379      %IF TEXTCOLS # 0 %AND 'C' # D # 'T' %START

    if (TEXTCOLS == 0) goto L_0094;
    {
      // Double-sided test on D (Part I)
      int tmp;
      if (67 == (tmp = D)) goto L_0094;
      // Double-sided test on D (Part II)
      if (tmp == 84) goto L_0094;
    }

    //   380        %IF D = NL %START

    if (D != 10) goto L_0095;

      //   381           STORE(' ') %IF SMAX # 0;  STORE(ESCAPE)

    if (SMAX == 0) goto L_0096;
    STORE(32);
  L_0096:;
    STORE(ESCAPE);

    //   382        %FINISH

  L_0095:;

  //   383         JUSTIFY %IF JUST # 0 %AND D = 'J'

    if (JUST == 0) goto L_0097;
    if (D != 74) goto L_0097;
    JUSTIFY();
  L_0097:;

  //   384         PRINT DOC LINE

    PRINTDOCLINE();

    //   385         PRINT SOURCE LINE %IF SMAX # 0

    if (SMAX == 0) goto L_0098;
    PRINTSOURCELINE();
  L_0098:;

  //   386      %FINISH

  L_0094:;

  //   387      PRINT SOURCE LINE %IF SMAX+5 > SLINE

    if (SMAX + 5 <= SLINE) goto L_0099;
    PRINTSOURCELINE();
  L_0099:;

  //   388     %RETURN %IF D = NL

    if (D != 10) goto L_009A;
    return;
  L_009A:;

  //   389      STORE(' ') %IF SMAX # 0

    if (SMAX == 0) goto L_009B;
    STORE(32);
  L_009B:;

  //   390      STORE(ESCAPE);  STORE(DIRECTIVE)

    STORE(ESCAPE);
    STORE(DIRECTIVE);

    //   391      READ NUM

    READNUM();

    //   392      ->S(D)

    S_line = __LINE__;
    S_file = __FILE__;
    S_index = D;
    goto case_S_dispatch;

    //   393
    //   394  S('A'):  !ASSIGN

  case_S_65:;

  //   395      %CYCLE

  L_009D:;

  //   396         ASSIGN

    ASSIGN();

    //   397         SKIP %WHILE NEXT # ';' %AND NEXT # NL

  L_009E:;
    if (NEXT == 59) goto L_009F;
    if (NEXT == 10) goto L_009F;
    SKIP();
    goto L_009E;
  L_009F:;

  //   398         %EXIT %IF NEXT = NL

    if (NEXT != 10) goto L_00A0;
    goto L_00A1;
  L_00A0:;

  //   399         SKIP

    SKIP();

    //   400      %REPEAT

    goto L_009D;
  L_00A1:;

  //   401      PAGE = 999 %IF PAGE <= 0

    if (PAGE > 0) goto L_00A2;
    PAGE = 999;
  L_00A2:;

  //   402      INVERT = 32 %IF INVERT # 0;  INVERTO = 32 %IF INVERTO # 0

    if (INVERT == 0) goto L_00A3;
    INVERT = 32;
  L_00A3:;
    if (INVERTO == 0) goto L_00A4;
    INVERTO = 32;
  L_00A4:;

  //   403      FAULT(7) %AND INDENT = 0 %UNLESS 0 <= INDENT <= VBOUND

    {
      // Double-sided test on INDENT (Part I)
      int tmp;
      if (0 > (tmp = INDENT)) goto L_00A5;
      // Double-sided test on INDENT (Part II)
      if (tmp <= 25) goto L_00A6;
    }
  L_00A5:;
    FAULT(7);
    INDENT = 0;
  L_00A6:;

  //   404      INDENTCOL = TAB(INDENT)

    INDENTCOL = TAB[INDENT];

    //   405      SET COLUMN(INDENTCOL)

    SETCOLUMN(INDENTCOL);

    //   406      %RETURN

    return;

    //   407  S('B'):  !BLANKS

  case_S_66:;

  //   408      %IF LINES # 0 %OR XPAGE # 0 %START

    if (LINES != 0) goto L_00A7;
    if (XPAGE == 0) goto L_00A8;
  L_00A7:;

  //   409         NUM = NUM*NLS

    NUM = NUM * NLS;

    //   410         NUM = PAGE-LINES %IF PAGE-LINES < NUM

    if (PAGE - LINES >= NUM) goto L_00A9;
    NUM = PAGE - LINES;
  L_00A9:;

  //   411         PRINT DOC LINE %AND NUM = NUM-NLS %WHILE NUM > 0

  L_00AA:;
    if (NUM <= 0) goto L_00AB;
    PRINTDOCLINE();
    NUM = NUM - NLS;
    goto L_00AA;
  L_00AB:;

  //   412      %FINISH

  L_00A8:;

  //   413      %RETURN

    return;

    //   414  S('C'):  !COL

  case_S_67:;

  //   415      NUM = COLS+1+NUM %IF RELIND # 0

    if (RELIND == 0) goto L_00AC;
    NUM = COLS + 1 + NUM;
  L_00AC:;

  //   416      SET COLUMN(NUM)

    SETCOLUMN(NUM);

    //   417      %RETURN

    return;

    //   418  S('E'): !END

  case_S_69:;

  //   419      PRINT DOC LINE %WHILE LINES # 0 %AND PAGE < 999

  L_00AD:;
    if (LINES == 0) goto L_00AE;
    if (PAGE >= 999) goto L_00AE;
    PRINTDOCLINE();
    goto L_00AD;
  L_00AE:;

  //   420      FINISH = PAGES;  NEXT = NL

    FINISH = PAGES;
    NEXT = 10;

    //   421      %RETURN

    return;

    //   422  S('I'):  !INDENT

  case_S_73:;

  //   423      NUM = INDENT+NUM %IF RELIND # 0

    if (RELIND == 0) goto L_00AF;
    NUM = INDENT + NUM;
  L_00AF:;

  //   424      FAULT(7) %AND NUM = 0 %UNLESS 0 <= NUM <= VBOUND

    {
      // Double-sided test on NUM (Part I)
      int tmp;
      if (0 > (tmp = NUM)) goto L_00B0;
      // Double-sided test on NUM (Part II)
      if (tmp <= 25) goto L_00B1;
    }
  L_00B0:;
    FAULT(7);
    NUM = 0;
  L_00B1:;

  //   425      NUM = TAB(NUM)

    NUM = TAB[NUM];

    //   426      SET COLUMN(NUM)

    SETCOLUMN(NUM);

    //   427      %RETURN

    return;

    //   428  S('J'):  !JUSTIFY (DONE)

  case_S_74:;

  //   429      %RETURN

    return;

    //   430  S('L'):  !LINES

  case_S_76:;

  //   431      XLINES = NUM;  XLINES = -1 %IF XLINES = 0

    XLINES = NUM;
    if (XLINES != 0) goto L_00B2;
    XLINES = -1;
  L_00B2:;

  //   432      INDENTIND = 0

    INDENTIND = 0;

    //   433      %WHILE NEXT # NL %CYCLE

  L_00B3:;
    if (NEXT == 10) goto L_00B4;

      //   434         LINECAPIND = CASEBIT %IF NEXT&LETMASK = 'C'

    if (NEXT & 95 != 67) goto L_00B5;
    LINECAPIND = 32;
  L_00B5:;

  //   435         LINEUNDIND = UNDBIT %IF NEXT&LETMASK = 'U'

    if (NEXT & 95 != 85) goto L_00B6;
    LINEUNDIND = 128;
  L_00B6:;

  //   436         LINEMIDIND = 1 %IF NEXT&LETMASK = 'M'

    if (NEXT & 95 != 77) goto L_00B7;
    LINEMIDIND = 1;
  L_00B7:;

  //   437         INDENTIND = 1 %IF NEXT&LETMASK = 'I'

    if (NEXT & 95 != 73) goto L_00B8;
    INDENTIND = 1;
  L_00B8:;

  //   438         SKIP

    SKIP();

    //   439      %REPEAT

    goto L_00B3;
  L_00B4:;

  //   440      COLS = 0 %AND FIXED = 0 %IF INDENTIND = 0

    if (INDENTIND != 0) goto L_00B9;
    COLS = 0;
    FIXED = 0;
  L_00B9:;

  //   441      %RETURN

    return;

    //   442  S('S'):  !NEW SECTION

  case_S_83:;

  //   443  S('N'):  !NEWPAGE

  case_S_78:;

  //   444      %RETURN %IF PAGE >= 999

    if (PAGE < 999) goto L_00BA;
    return;
  L_00BA:;

  //   445      PRINT DOC LINE %WHILE LINES # 0

  L_00BB:;
    if (LINES == 0) goto L_00BC;
    PRINTDOCLINE();
    goto L_00BB;
  L_00BC:;

  //   446      XPAGE = 1

    XPAGE = 1;

    //   447      %IF D = 'S' %AND SECTNO # 0 %START

    if (D != 83) goto L_00BD;
    if (SECTNO == 0) goto L_00BD;

      //   448         SECTNO = SECTNO + 1;  PAGENO = 1

    SECTNO = SECTNO + 1;
    PAGENO = 1;

    //   449        TURN PAGE

    TURNPAGE();

    //   450      %FINISH

  L_00BD:;

  //   451      %RETURN

    return;

    //   452  S('P'):  !PARAGRAPH

  case_S_80:;

  //   453      %IF LINES # 0 %START

    if (LINES == 0) goto L_00BE;

      //   454         NUM = NUM*NLS

    NUM = NUM * NLS;

    //   455         NUM = PAGE-LINES %IF PAGE-LINES < NUM+2

    if (PAGE - LINES >= NUM + 2) goto L_00BF;
    NUM = PAGE - LINES;
  L_00BF:;

  //   456         PRINT DOC LINE %AND NUM = NUM-NLS %WHILE NUM > 0

  L_00C0:;
    if (NUM <= 0) goto L_00C1;
    PRINTDOCLINE();
    NUM = NUM - NLS;
    goto L_00C0;
  L_00C1:;

  //   457      %FINISH

  L_00BE:;

  //   458      SET COLUMN(COLS+1+PGAP)

    SETCOLUMN(COLS + 1 + PGAP);

    //   459      %RETURN

    return;

    //   460  S('T'):  !TAB

  case_S_84:;

  //   461      %IF RELIND # 0 %START

    if (RELIND == 0) goto L_00C2;

      //   462         T = 0;  C = COLS+1

    T = 0;
    C = COLS + 1;

    //   463         %IF RELIND = '+' %START

    if (RELIND != 43) goto L_00C3;

      //   464            %WHILE NUM > 0 %CYCLE

  L_00C4:;
    if (NUM <= 0) goto L_00C5;

      //   465               T = T+1 %UNTIL T > VBOUND %OR TAB(T) > C

  L_00C6:;
    T = T + 1;
    if (T > 25) goto L_00C7;
    if (TAB[T] > C) goto L_00C7;
    goto L_00C6;
  L_00C7:;

  //   466               FAULT(7) %AND %RETURN %IF T > VBOUND

    if (T <= 25) goto L_00C8;
    FAULT(7);
    return;
  L_00C8:;

  //   467               C = TAB(T)

    C = TAB[T];

    //   468               NUM = NUM-1

    NUM = NUM - 1;

    //   469            %REPEAT

    goto L_00C4;
  L_00C5:;

  //   470         %FINISH %ELSE %START

    goto L_00C9;
  L_00C3:;

  //   471            T = T+1 %UNTIL T > VBOUND %OR TAB(T) >= C

  L_00CA:;
    T = T + 1;
    if (T > 25) goto L_00CB;
    if (TAB[T] >= C) goto L_00CB;
    goto L_00CA;
  L_00CB:;

  //   472            %WHILE NUM < 0 %CYCLE

  L_00CC:;
    if (NUM >= 0) goto L_00CD;

      //   473               T = T-1 %UNTIL T < 0 %OR TAB(T) < C

  L_00CE:;
    T = T - 1;
    if (T < 0) goto L_00CF;
    if (TAB[T] < C) goto L_00CF;
    goto L_00CE;
  L_00CF:;

  //   474               FAULT(7) %AND %RETURN %IF T < 0

    if (T >= 0) goto L_00D0;
    FAULT(7);
    return;
  L_00D0:;

  //   475               C = TAB(T)

    C = TAB[T];

    //   476               NUM = NUM+1

    NUM = NUM + 1;

    //   477            %REPEAT

    goto L_00CC;
  L_00CD:;

  //   478         %FINISH

  L_00C9:;

  //   479      %FINISH %ELSE %START

    goto L_00D1;
  L_00C2:;

  //   480         FAULT(7) %AND %RETURN %UNLESS 0 <= NUM <= VBOUND

    {
      // Double-sided test on NUM (Part I)
      int tmp;
      if (0 > (tmp = NUM)) goto L_00D2;
      // Double-sided test on NUM (Part II)
      if (tmp <= 25) goto L_00D3;
    }
  L_00D2:;
    FAULT(7);
    return;
  L_00D3:;

  //   481         C = TAB(NUM)

    C = TAB[NUM];

    //   482      %FINISH

  L_00D1:;

  //   483      SET COLUMN(C)

    SETCOLUMN(C);

    //   484      %RETURN

    return;

    //   485  S('V'):  !VERIFY

  case_S_86:;

  //   486      %IF PAGE-LINES < NUM*NLS %START

    if (PAGE - LINES >= NUM * NLS) goto L_00D4;

      //   487         PRINT DOC LINE %WHILE LINES # 0

  L_00D5:;
    if (LINES == 0) goto L_00D6;
    PRINTDOCLINE();
    goto L_00D5;
  L_00D6:;

  //   488      %FINISH

  L_00D4:;

  //   489      %RETURN

    return;

    //   490  S('D'): S('F'): S('G'): S('H'):

  case_S_68:;
  case_S_70:;
  case_S_71:;
  case_S_72:;

  //   491  S('K'): S('M'): S('O'): S('Q'): S('R'):

  case_S_75:;
  case_S_77:;
  case_S_79:;
  case_S_81:;
  case_S_82:;

  //   492  S('U'): S('W'): S('X'): S('Y'): S('Z'):

  case_S_85:;
  case_S_87:;
  case_S_88:;
  case_S_89:;
  case_S_90:;

  //   493      FAULT(5)

    FAULT(5);

    //   494      %RETURN

    return;

    //   495
    //   496
    //   497  %INTEGERFN NEWCELL(%INTEGER H,T)

    int NEWCELL(int H, int T) {
      //   498  %INTEGER P

      int P;

      //   499      %STOP %IF FREELIST = 0

      if (FREELIST != 0) goto L_00D7;
      _imp_stop(0);
    L_00D7:;

    //   500      P = FREELIST;  FREELIST = HEAD(FREELIST)

      P = FREELIST;
      FREELIST = HEAD[FREELIST - 1];

      //   501      HEAD(P) = H;  TAIL(P) = T

      HEAD[P - 1] = H;
      TAIL[P - 1] = T;

      //   502      %RESULT = P

      return P;

      //   503  %END

    } /* end of NEWCELL */

    //   504
    //   505  %ROUTINE POP(%INTEGERNAME L)

    void POP(int *L) {
      //   506      HEAD(L) = FREELIST;  FREELIST = L

      HEAD[*L - 1] = FREELIST;
      FREELIST = *L;

      //   507      L = TAIL(L)

      *L = TAIL[*L - 1];

      //   508  %END

      return;
    } /* end of POP */

    //   509
    //   510  %ROUTINE ASSIGN

    void ASSIGN(void) {
      //   511  %OWNINTEGER NAMEMAX = 32

      static int NAMEMAX = 32;

      //   512  %INTEGER I,J,K

      int I;
      int J;
      int K;
      auto void READNAME(int *ORDINAL);

      auto int *MAP(int I);

      //   513  %ROUTINESPEC READ NAME(%INTEGERNAME ORDINAL)
      //   514  %INTEGERMAPSPEC MAP(%INTEGER I)
      //   515
      //   516      READ NAME(I);  %RETURN %IF I = 0

      READNAME(/*?*/ &I);
      if (I != 0) goto L_00D8;
      return;
    L_00D8:;

    //   517      SKIP %WHILE NEXT = ' '

    L_00D9:;
      if (NEXT != 32) goto L_00DA;
      SKIP();
      goto L_00D9;
    L_00DA:;

    //   518      %IF NEXT = '<' %OR NEXT = '>' %START

      if (NEXT == 60) goto L_00DB;
      if (NEXT != 62) goto L_00DC;
    L_00DB:;

    //   519         J = I

      J = I;

      //   520         %CYCLE

    L_00DD:;

    //   521            %IF NEXT = '<' %THEN LINK(J) = NEWCELL(MAP(J),LINK(J)) %C

      if (NEXT != 60) goto L_00DE;
      LINK[J - 1] = NEWCELL(*MAP(J), LINK[J - 1]);
      goto L_00DF;
    L_00DE:;

    //   522+           %ELSE %START
    //   523               MAP(J) = HEAD(LINK(J));  POP(LINK(J))

      *MAP(J) = HEAD[LINK[J - 1] - 1];
      POP(/*?*/ &LINK[J - 1]);

      //   524            %FINISH

    L_00DF:;

    //   525            J = J+1

      J = J + 1;

      //   526            %EXIT %IF J < NAMEMAX %OR J = 57

      if (J < NAMEMAX) goto L_005F;
      if (J != 57) goto L_00E0;
    L_005F:;
      goto L_00E1;
    L_00E0:;

    //   527         %REPEAT

      goto L_00DD;
    L_00E1:;

    //   528         SKIP %UNTIL NEXT # ' '

    L_00E2:;
      SKIP();
      if (NEXT != 32) goto L_00E3;
      goto L_00E2;
    L_00E3:;

    //   529         %RETURN %IF NEXT = ';' %OR NEXT = NL

      if (NEXT == 59) goto L_00E4;
      if (NEXT != 10) goto L_00E5;
    L_00E4:;
      return;
    L_00E5:;

    //   530      %FINISH

    L_00DC:;

    //   531      FAULT(1) %AND %RETURN %IF NEXT # '='

      if (NEXT == 61) goto L_00E6;
      FAULT(1);
      return;
    L_00E6:;

    //   532      %CYCLE

    L_00E7:;

    //   533         SKIP %UNTIL NEXT # ' '

    L_00E8:;
      SKIP();
      if (NEXT != 32) goto L_00E9;
      goto L_00E8;
    L_00E9:;

    //   534         %IF 'A' <= NEXT&LETMASK <= 'Z' %START

      {
        // Double-sided test on NEXT & 95 (Part I)
        int tmp;
        if (65 > (tmp = NEXT & 95)) goto L_00EA;
        // Double-sided test on NEXT & 95 (Part II)
        if (tmp > 90) goto L_00EA;
      }

      //   535            READ NAME(J);  %RETURN %IF J = 0

      READNAME(/*?*/ &J);
      if (J != 0) goto L_00EB;
      return;
    L_00EB:;

    //   536         %FINISH %ELSE %START

      goto L_00EC;
    L_00EA:;

    //   537            J = 0

      J = 0;

      //   538            %IF NEXT = '''' %START

      if (NEXT != 39) goto L_00ED;

        //   539               SKIP;  !QUOTEMARK

      SKIP();

      //   540               NUM = NEXT;  SKIP;  !QUOTED SYMBOL

      NUM = NEXT;
      SKIP();

      //   541               SKIP;  !QUOTEMARK (PRESUMABLY)

      SKIP();

      //   542            %FINISH %ELSE %START

      goto L_00EE;
    L_00ED:;

    //   543               READ NUM

      READNUM();

      //   544               NUM = MAP(I)+NUM %IF RELIND # 0

      if (RELIND == 0) goto L_00EF;
      NUM = *MAP(I) + NUM;
    L_00EF:;

    //   545            %FINISH

    L_00EE:;

    //   546         %FINISH

    L_00EC:;

    //   547         %CYCLE

    L_00F0:;

    //   548            MAP(I) = MAP(J)

      *MAP(I) = *MAP(J);

      //   549            I = I+1;  J = J+1

      I = I + 1;
      J = J + 1;

      //   550        %EXIT %IF J < NAMEMAX %OR I < NAMEMAX %OR I = 57 %OR I = 83 %OR I = 109

      if (J < NAMEMAX) goto L_00F1;
      if (I < NAMEMAX) goto L_00F1;
      if (I == 57) goto L_00F1;
      if (I == 83) goto L_00F1;
      if (I != 109) goto L_00F2;
    L_00F1:;
      goto L_00F3;
    L_00F2:;

    //   551         %REPEAT

      goto L_00F0;
    L_00F3:;

    //   552         %EXIT %UNLESS NEXT = ',' %AND I > NAMEMAX

      if (NEXT != 44) goto L_00F4;
      if (I > NAMEMAX) goto L_00F5;
    L_00F4:;
      goto L_00F6;
    L_00F5:;

    //   553      %REPEAT

      goto L_00E7;
    L_00F6:;

    //   554      FAULT(1) %UNLESS NEXT = ';' %OR NEXT = NL

      if (NEXT == 59) goto L_00F7;
      if (NEXT == 10) goto L_00F7;
      FAULT(1);
    L_00F7:;

    //   555
    //   556  %ROUTINE READ NAME(%INTEGERNAME ORDINAL)

      void READNAME(int *ORDINAL) {
        //   557  %INTEGER N1,N2

        int N1;
        int N2;

        //   558  %CONSTSHORTINTEGERARRAY NAME1(1:32) = 20976, 2548, 12454, 16423, 12590,

        const short int NAME1[32] = {20976, 2548,  12454, 16423, 12590, 19849, 14739, 19681, 16609, 9668,  19619,
                                     16423, 3120,  21956, 3120,  21956, 9686,  3120,  21956, 3120,  21956, 9686,
                                     1635,  10931, 13362, 20097, 6446,  5731,  0,     0,     -1,    20514};
        struct _imp_dv NAME1_dv = {NAME1, sizeof(short int) /*, dims, <bounds> */};

        //   559+     19849, 14739, 19681, 16609, 9668, 19619, 16423, 3120,
        //   560+     21956, 3120, 21956, 9686, 3120, 21956, 3120, 21956, 9686,
        //   561+     1635, 10931, 13362, 20097, 6446, 5731, 0, 0,
        //   562+     -1, 20514
        //   563  %CONSTSHORTINTEGERARRAY NAME2(1:32) = 0, 20973, 20480, 5120, 5120,

        const short int NAME2[32] = {0,    20973, 20480, 5120,  5120,  14496, 0,     16384, 16384, 5588,  20943,
                                     5583, 0,     0,     19712, 19712, 5716,  15360, 15360, 19727, 19727, 15360,
                                     9504, 20480, 11264, 19072, 9832,  1541,  0,     0,     -1,    0};
        struct _imp_dv NAME2_dv = {NAME2, sizeof(short int) /*, dims, <bounds> */};

        //   564+     14496, 0, 16384, 16384, 5588, 20943, 5583, 0,
        //   565+     0, 19712, 19712, 5716, 15360, 15360, 19727, 19727, 15360,
        //   566+     9504, 20480, 11264, 19072, 9832, 1541, 0, 0,
        //   567+     -1, 0
        //   568
        //   569  %ROUTINE GET(%INTEGERNAME  K);  ! ...USED BY 'GET TRIO'

        void GET(int *K) {
          //   570     K = 0 %AND %RETURN %UNLESS 'A' <= NEXT&LETMASK <= 'Z'

          {
            // Double-sided test on NEXT & 95 (Part I)
            int tmp;
            if (65 > (tmp = NEXT & 95)) goto L_00F8;
            // Double-sided test on NEXT & 95 (Part II)
            if (tmp <= 90) goto L_00F9;
          }
        L_00F8:;
          *K = 0;
          return;
        L_00F9:;

        //   571     K = NEXT&31;  SKIP

          *K = NEXT & 31;
          SKIP();

          //   572  %END;   ! ...GET

          return;
        } /* end of GET */

        //   573
        //   574  %ROUTINE GET TRIO(%INTEGERNAME T)

        void GETTRIO(int *T) {
          //   575  %INTEGER A,B,C

          int A;
          int B;
          int C;

          //   576      GET(A);  GET(B);  GET(C)

          GET(/*?*/ &A);
          GET(/*?*/ &B);
          GET(/*?*/ &C);

          //   577      T = (A<<5+B)<<5+C

          *T = ((A << 5) + B << 5) + C;

          //   578  %END;  !GET TRIO

          return;
        } /* end of GETTRIO */

        //   579      SKIP %WHILE NEXT = ' '

      L_00FA:;
        if (NEXT != 32) goto L_00FB;
        SKIP();
        goto L_00FA;
      L_00FB:;

      //   580      GET TRIO(N1);  GET TRIO(N2)

        GETTRIO(/*?*/ &N1);
        GETTRIO(/*?*/ &N2);

        //   581      FAULT(1) %AND ORDINAL = 0 %AND %RETURN %IF N1 = 0

        if (N1 != 0) goto L_00FC;
        FAULT(1);
        *ORDINAL = 0;
        return;
      L_00FC:;

      //   582      %IF N1 = 20653 %START;  !'TEM' (TEMP)

        if (N1 != 20653) goto L_00FD;

          //   583         ORDINAL = 58

        *ORDINAL = 58;

        //   584         ORDINAL = 84 %IF N2 = 16448;  !'PB'

        if (N2 != 16448) goto L_00FE;
        *ORDINAL = 84;
      L_00FE:;

      //   585         %RETURN

        return;

        //   586      %FINISH

      L_00FD:;

      //   587      %CYCLE ORDINAL = 1,1,NAMEMAX

        // %for *ORDINAL = 1, 1, NAMEMAX %cycle
        {
          int _final = NAMEMAX;
          if (invalid_for_loop(1, 1, _final)) _imp_signal(5, 1, 0, "Illegal cycle *ORDINAL = 1, 1, NAMEMAX");
          *ORDINAL = 0;
        L_00FF:
          if (*ORDINAL == _final) goto L_0100;
          *ORDINAL += 1;

          //   588         %RETURN %IF NAME1(ORDINAL) = N1 %AND NAME2(ORDINAL) = N2

          if (NAME1[*ORDINAL - 1] != N1) goto L_0102;
          if (NAME2[*ORDINAL - 1] != N2) goto L_0102;
          return;
        L_0102:;

        //   589      %REPEAT

          goto L_00FF;
        }

      L_0100:;

      //   590      FAULT(3);  ORDINAL = 0

        FAULT(3);
        *ORDINAL = 0;

        //   591  %END;  !READ NAME

        return;
      } /* end of READNAME */

      //   592
      //   593  %INTEGERMAP MAP(%INTEGER I)

      int *MAP(int I) {
        //   594  %SWITCH S(0:30)

        int S_index;
        int S_line;
        char *S_file;
        static const void *S[31] = {
            &&case_S_0,  &&case_S_1,       &&case_S_2,      &&case_S_3,  &&case_S_4,  &&case_S_5,  &&case_S_6,
            &&case_S_7,  &&case_S_8,       &&case_S_9,      &&case_S_10, &&case_S_11, &&case_S_12, &&case_S_13,
            &&case_S_14, &&case_S_15,      &&case_S_16,     &&case_S_17, &&case_S_18, &&case_S_19, &&case_S_20,
            &&case_S_21, &&case_S_22,      &&case_S_23,     &&case_S_24, &&case_S_25, &&case_S_26, &&case_S_27,
            &&case_S_28, &&case_S_missing, &&case_S_missing};

        //   595      %RESULT  = = TAB(I-31) %IF I >= 32

        if (I < 32) goto L_0103;
        return /*?*/ &TAB[I - 31];
      L_0103:;

      //   596      ->S(I)

        S_line = __LINE__;
        S_file = __FILE__;
        S_index = I;
        goto case_S_dispatch;

        //   597  S(0):  %RESULT  = = NUM

      case_S_0:;
        return /*?*/ &NUM;

        //   598  S(1):  %RESULT  = = TOP

      case_S_1:;
        return /*?*/ &TOP;

        //   599  S(2):  %RESULT  = = BOTTOM

      case_S_2:;
        return /*?*/ &BOTTOM;

        //   600  S(3):  %RESULT  = = LEFT

      case_S_3:;
        return /*?*/ &LEFT;

        //   601  S(4):  %RESULT  = = PAGE

      case_S_4:;
        return /*?*/ &PAGE;

        //   602  S(5):  %RESULT  = = LINE

      case_S_5:;
        return /*?*/ &LINE;

        //   603  S(6):  %RESULT  = = SLINE

      case_S_6:;
        return /*?*/ &SLINE;

        //   604  S(7):  %RESULT  = = NLS

      case_S_7:;
        return /*?*/ &NLS;

        //   605  S(8):  %RESULT  = = SGAP

      case_S_8:;
        return /*?*/ &SGAP;

        //   606  S(9):  %RESULT  = = PGAP

      case_S_9:;
        return /*?*/ &PGAP;

        //   607  S(10): %RESULT  = = INDENT

      case_S_10:;
        return /*?*/ &INDENT;

        //   608  S(11): %RESULT  = = SECTNO

      case_S_11:;
        return /*?*/ &SECTNO;

        //   609  S(12): %RESULT  = = PAGENO

      case_S_12:;
        return /*?*/ &PAGENO;

        //   610  S(13): %RESULT  = = CAP

      case_S_13:;
        return /*?*/ &CAP;

        //   611  S(14): %RESULT  = = UND

      case_S_14:;
        return /*?*/ &UND;

        //   612  S(15): %RESULT  = = CAPSH

      case_S_15:;
        return /*?*/ &CAPSH;

        //   613  S(16): %RESULT  = = UNDSH

      case_S_16:;
        return /*?*/ &UNDSH;

        //   614  S(17): %RESULT  = = INVERT

      case_S_17:;
        return /*?*/ &INVERT;

        //   615  S(18): %RESULT  = = CAPO

      case_S_18:;
        return /*?*/ &CAPO;

        //   616  S(19): %RESULT  = = UNDO

      case_S_19:;
        return /*?*/ &UNDO;

        //   617  S(20): %RESULT  = = CAPSHO

      case_S_20:;
        return /*?*/ &CAPSHO;

        //   618  S(21): %RESULT  = = UNDSHO

      case_S_21:;
        return /*?*/ &UNDSHO;

        //   619  S(22): %RESULT  = = INVERTO

      case_S_22:;
        return /*?*/ &INVERTO;

        //   620  S(23): %RESULT  = = ASCII

      case_S_23:;
        return /*?*/ &ASCII;

        //   621  S(24): %RESULT  = = JUST

      case_S_24:;
        return /*?*/ &JUST;

        //   622  S(25): %RESULT  = = MARK

      case_S_25:;
        return /*?*/ &MARK;

        //   623  S(26): %RESULT  = = START

      case_S_26:;
        return /*?*/ &START;

        //   624  S(27): %RESULT  = = FINISH

      case_S_27:;
        return /*?*/ &FINISH;

        //   625  S(28): %RESULT  = = ESCAPE

      case_S_28:;
        return /*?*/ &ESCAPE;

        //   626  %END;  !MAP


      case_S_dispatch:
        if (S_index < 0 || S_index > 30)
          _imp_signalf(6, 3, S_index, "->S(%d) out of bounds at %s line %d", S_index, S_file, S_line);
        goto *S[S_index - 0];

      case_S_missing:
        _imp_signalf(8, 2, S_index, "switch jump to undefined label S(%d): at %s line %d", S_index, S_file, S_line);
      } /* end of MAP */

      //   627
      //   628  %END;

      return;
    } /* end of ASSIGN */

    // ?K unused
    //   629       ;  !ASSIGN
    //   629
    //   630  %END;  !PROCESS DIRECTIVE

    return;

  case_S_dispatch:
    if (S_index < 65 || S_index > 90)
      _imp_signalf(6, 3, S_index, "->S(%d) out of bounds at %s line %d", S_index, S_file, S_line);
    goto *S[S_index - 65];
  } /* end of PROCESSDIRECTIVE */

  //   631
  //   632        SET STREAMS;   !OPEN FILES

  _imp_SETSTREAMS();

  //   633        SELECTINPUT(REQUEST)

  _imp_SELECTINPUT(0);

  //   634        PRINTSTRING("Sections? (Y or CR) ")

  _imp_PRINTSTRING(_imp_str_literal("Sections? (Y or CR) "));

  //   635        %IF NEXTSYMBOL='Y' %OR NEXTSYMBOL='y' %THEN CHOOSE=0 %ELSE CHOOSE=-1

  if (_imp_NEXTSYMBOL() == 89) goto L_0101;
  if (_imp_NEXTSYMBOL() != 121) goto L_0105;
L_0101:;
  CHOOSE = 0;
  goto L_0106;
L_0105:;
  CHOOSE = -1;
L_0106:;

//   636        SKIPSYMBOL

  _imp_SKIPSYMBOL();

  //   637        TURN PAGE

  TURNPAGE();

  //   638      SELECT INPUT(SIN)

  _imp_SELECTINPUT(1);

  //   639      SELECT OUTPUT(SOUT)

  _imp_SELECTOUTPUT(2);

  //   640      %CYCLE FREELIST = 1,1,108

  // %for FREELIST = 1, 1, 108 %cycle
  {
    FREELIST = 0;
  L_0107:
    if (FREELIST == 108) goto L_0108;
    FREELIST += 1;

    //   641         LINK(FREELIST) = 0

    LINK[FREELIST - 1] = 0;

    //   642      %REPEAT

    goto L_0107;
  }

L_0108:;

//   643      %CYCLE FREELIST = 1,1,500

  // %for FREELIST = 1, 1, 500 %cycle
  {
    FREELIST = 0;
  L_010A:
    if (FREELIST == 500) goto L_010B;
    FREELIST += 1;

    //   644         HEAD(FREELIST) = FREELIST-1

    HEAD[FREELIST - 1] = FREELIST - 1;

    //   645      %REPEAT

    goto L_010A;
  }

L_010B:;

//   646      %WHILE PAGES < FINISH %CYCLE

L_010C:;
  if (PAGES >= FINISH) goto L_010D;

    //   647         READ ATOM OR DIRECTIVE

  READATOMORDIRECTIVE();

  //   648         %IF DIRECTIVE # 0 %START

  if (DIRECTIVE == 0) goto L_010E;

    //   649            PROCESS DIRECTIVE

  PROCESSDIRECTIVE();

  //   650         %FINISH %ELSE %START

  goto L_010F;
L_010E:;

//   651            %IF SIZE # 0 %START

  if (SIZE == 0) goto L_0110;

    //   652               PLACE ATOM

  PLACEATOM();

  //   653               STORE SOURCE ATOM

  STORESOURCEATOM();

  //   654            %FINISH

L_0110:;

//   655            %IF XLINES # 0 %START

  if (XLINES == 0) goto L_0111;

    //   656               %IF NEXT = ' ' %START

  if (NEXT != 32) goto L_0112;

    //   657                  STORE(NEXT)

  STORE(NEXT);

  //   658                  COLS = COLS+1;  BUFF(COLS) = ' '

  COLS = COLS + 1;
  BUFF[COLS - 1] = 32;

  //   659               %FINISH

L_0112:;

//   660               PRINT DOC LINE %IF NEXT = NL

  if (NEXT != 10) goto L_0113;
  PRINTDOCLINE();
L_0113:;

//   661            %FINISH

L_0111:;

//   662         %FINISH

L_010F:;

//   663         PRINT SOURCE LINE %IF NEXT = NL

  if (NEXT != 10) goto L_0114;
  PRINTSOURCELINE();
L_0114:;

//   664         NEXT = 0 %IF NEXT = ' ' %OR NEXT = NL

  if (NEXT == 32) goto L_0115;
  if (NEXT != 10) goto L_0116;
L_0115:;
  NEXT = 0;
L_0116:;

//   665      %REPEAT

  goto L_010C;
L_010D:;

//   666      MARK DOC %IF MARK # 0

  if (MARK == 0) goto L_0117;
  MARKDOC();
L_0117:;

//   667  %ENDOFPROGRAM

  _imp_stop(0);
  return 0;
end_0:;
}