// Compile command: cc -m32 -Wno-multichar -c -I. pass2.c


// Imp to C translation was done while there were problems with array indices,
// and any accesses with an expression (e.g. fred(A+1) are likely to have been
// translated as Fred[A] :-(  Either rebuild or fix very carefully.  In all files.

#ifdef NEVER

// All the arrays with non-0 lower bounds are switches which are handled OK.  So we don't
// need to use my non-standard $define to adjust the array bounds on data.

//pass2.c:      static void *Sw[24 /*1:24*/] = {
//pass2.c:        static void *S[5 /*1:5*/] = {
//pass2.c:        static void *Fp[3 /*1:3*/] = {
//pass2.c:        static void *Sw[9 /*1:9*/] = {
//pass2.c:        static void *Esw[Nullelse /*1:Nullelse*/] = {
//pass2.c:        static const _imp_string Rsassop[128+8 /*128:135*/] = { // [8 /*128:135*/]
//pass2.c:        static void *Operand[3 /*1:3*/] = {
//pass2.c:          static void *Scalt[4 /*1:4*/] = {
//pass2.c:        static void *S[3 /*11:13*/] = {
//pass2.c:        static void *Funny[3 /*11:13*/] = {
//pass2.c:        static void *Sw[3 /*1:3*/] = {
//pass2.c:        static void *Sw[4 /*1:4*/] = {

check these:
%ownbytearray save (1:64*1024)
%conststring(3)%array rsassop(ADD:ANDL)="+=","-=","^=",

#endif


#include <perms.h>
#undef Iexp
#undef Rexp

void Icl9cezrs6imp(void) {

  #define ReleaseX (4)

  #include "hostcodes.h"

  //#define Host (Mips)
  //#define Target (Mips)
  #define Host (Linux)
  #define Target (Linux)
  
  #define Standardpt (0x51)
  #define Minapt (0x51)
  #define Minaprec ((unsigned)Minapt >> 4)
  static const unsigned short Typeflag[13 /*0:12*/] = {
      0,      0x51, 0x52, 0x8009, 0x4031, 0x35, 0x6051,
      0x4041, 0x33, 0,    0x61,   0x62,   0x72};
  static const unsigned char Ptrsize[128 /*0:127*/] = {8,
                                                       [1 ... 15] = 0,
                                                       [16 ... 31] = 0,
                                                       [32 ... 47] = 0,
                                                       8,
                                                       4,
                                                       0,
                                                       4,
                                                       0,
                                                       8,
                                                       0,
                                                       4,
                                                       [56 ... 63] = 0,
                                                       8,
                                                       4,
                                                       [66 ... 79] = 0,
                                                       8,
                                                       4,
                                                       4,
                                                       [83 ... 95] = 0,
                                                       8,
                                                       0,
                                                       4,
                                                       [99 ... 111] = 0,
                                                       8,
                                                       [113 ... 127] = 0};
  static const unsigned char Ptrrounding[384 /*0:383*/] = {
      [0 ... 127] = 3, [128 ... 255] = 3, [256 ... 383] = 3};
  #define Sframemisalign (0)
  #define Aheadpt (0x61)
  #define Aheadsize (8)
  #define Minparamsize (4)
  #define Rtparampt (0x51)
  #define Rtparamsize (4)
  #define Arrayrounding (7)
  #define Arrayinrecrounding (0)
  #define Strvalinwa (Yes)
  #define Strresinwa (Yes)
  #define Recvalinwa (No)
  static const unsigned char Rnding[384 /*0:383*/] = {[0 ... 15] = 0,
                                                      [16 ... 31] = 0,
                                                      [32 ... 47] = 0,
                                                      [48 ... 50] = 0,
                                                      3,
                                                      0,
                                                      0,
                                                      [54 ... 63] = 0,
                                                      0,
                                                      1,
                                                      [66 ... 79] = 0,
                                                      0,
                                                      3,
                                                      3,
                                                      [83 ... 95] = 0,
                                                      0,
                                                      7,
                                                      7,
                                                      [99 ... 111] = 0,
                                                      0,
                                                      7,
                                                      7,
                                                      [115 ... 127] = 0,
                                                      [128 ... 143] = 0,
                                                      [144 ... 159] = 0,
                                                      [160 ... 175] = 0,
                                                      [176 ... 178] = 0,
                                                      3,
                                                      0,
                                                      1,
                                                      [182 ... 191] = 0,
                                                      0,
                                                      1,
                                                      [194 ... 207] = 0,
                                                      0,
                                                      3,
                                                      3,
                                                      [211 ... 223] = 0,
                                                      0,
                                                      7,
                                                      7,
                                                      [227 ... 239] = 0,
                                                      0,
                                                      7,
                                                      7,
                                                      [243 ... 255] = 0,
                                                      [256 ... 271] = 0,
                                                      [272 ... 287] = 0,
                                                      [288 ... 303] = 0,
                                                      0,
                                                      3,
                                                      0,
                                                      3,
                                                      0,
                                                      3,
                                                      [310 ... 319] = 0,
                                                      0,
                                                      3,
                                                      [322 ... 335] = 0,
                                                      0,
                                                      3,
                                                      3,
                                                      [339 ... 351] = 0,
                                                      0,
                                                      7,
                                                      7,
                                                      [355 ... 367] = 0,
                                                      0,
                                                      7,
                                                      7,
                                                      [371 ... 383] = 0};
  static const unsigned char Bytes[8 /*0:7*/] = {[0 ... 2] = 0, 1, 2, 4, 8, 16};
  static const unsigned char Words[8 /*0:7*/] = {[0 ... 2] = 0, 1, 1, 2, 4, 8};
  #define Darea (6)
  #define Dvarea (4)
  #define Lhsaddrfirst (No)
  #define Jrndbodies (No)
  #define Stackdown (Yes)
  #define Paramsbwards (No)
  #define Displayneeded (Yes)
  #define Displayrounding (7)
  #define Displayc1 (4)
  #define Displayc0 (4)
  #define Rtparam1offset (0)
  #define Alpha (0)

  // #include "impcompdate.h"
  static const _imp_string Ladate = _imp_str_literal("Apr 95");

  #define Maxrecsize (0xffff)
  #define Noofsns (67)
  #define Lrlpt (0x62)
  #define Maxlevels (31)
  #define Concop (13)

// ========================================================================
//
// FIRST THE OPERAND FLAG CONSTANTS
//
#define Sconst (0)                      // CONST UPTO 64 BITS value is carried
                                        // in opnd_d and opnd_xtra
#define Lconst (1)                      // CONST LONGER THAN SCONST const can be
                                        // found elsewhere(at top of ar) by
                                        // meanse of base&offset inf in_d and _xtra
#define Dname (2)                       // NAME BY DICTIONARY NO the base and disp in
                                        // the dictionary after adjusting by
                                        // possible offset for item in
                                        // in records lead to the variable
#define Arname (3)                      // NAME BY AR POINTER opnd_d the ar pointer
                                        // this form local to pass2
                                        // and used to identify functions
                                        // with params before the call
                                        // is planted
#define Viaptr (4)                      // VIA TRIPLE WITHOFFSET TO POINTER
                                        // At an offset(_xtra) from address in
                                        // referenced triple can be found a
                                        // pointer to the required operand
#define Indname (5)                     // INDIRECT VIA DICTIONARY base&disp
                                        // in dictionary identify a pointer
                                        // variable at possible offset from
                                        // this pointer
#define Indirect (6)                    // INDIRECT VIA TRIPLE WITH OFFSET
                                        // the refenced triple has computed
                                        // the (32bit) address of an item
                                        // an offset may have to be applied
                                        // before the fetch or store
#define Localir (7)                     // BASE DISP REF IN CURRENT STACK FRAME
                                        // opnd_b=base<<16!offset used only for
                                        // compiler generated temporaries
#define Reftrip (8)                     // REFERENCE TO A TRIPLE the operand is the result of
                                        // triple opnd_d
#define Inareg (9)                      // REGISTER OPERAND this form is local to the
                                        // code generating pass(es)
#define Developped (10)                 // also local to generator
#define Devaddr (11)                    // ALSO LOCAL TO GENERATOR
#define Btrefmask (1 << Reftrip | 1 << Indirect | 1 << Viaptr)
#define Referneeded (1 << Indirect | 1 << Viaptr)
//
// NOW THE DEFINITIONS OF ONE OPERAND TRIPLES <128
//
#define Rthd (1)                        // ROUTINE-BLOCK HEADING
#define Rdspy (2)                       // ROUTINE ENTRY SET DISPLAY
#define Rdarea (3)                      // ROUTINE LEAVE DIAGNOSTIC SPACE
#define Rdptr (4)                       // SET DIAGNOSTIC POINTER
#define Rtbad (5)                       // ROUTINE-FN BAD EXIT
#define Rtxit (6)                       // "%RETURN"
#define Xstop (7)                       // EXECUTE "%STO"
#define Notl (10)                       // LOGICAL NOT
#define Lneg (11)                       // LOGICAL NEGATE
#define Ifloat (12)                     // CONVERT INTEGER TO REAL
#define Modulus (13)                    // AS USED BY IMOD&RMOD
#define Shrtn (14)                      // SHORTEN TO LOWER PRECISION
#define Lngthn (15)                     // LENGTHEN TO HIGHER PRECISION
#define Jamshrtn (16)                   // SHORTEN FOR JAM TRANSFER
#define Nullt (18)                      // FOR REDUNDANT TRIPLES
#define Preload (19)                    // PREFETCH FOR OPTIMISATION REASONS
#define Ssptr (21)                      // STORE STACK POINTER
#define Rsptr (22)                      // RESTORE STACK POINTER
#define Asptr (23)                      // ADVANCE STACK PTR
#define Darray (24)                     // DECLARE ARRAY(IE STORE HD)
#define Sline (25)                      // UPDATE LINE NO
#define Stpck (26)                      // CHECK FOR ZERO STEPS
#define Forpre (27)                     // PREAMBLE FOR "FOR"
#define Forpost (28)                    // POSTAMBLE FOR "FOR"
#define Forpr2 (29)                     // FOR SECOND PREAMBLE
#define Precl (30)                      // PREPARATION FOR CALL
#define Rcall (31)                      // THE CALL
#define Rcrfr (32)                      // RECOVER FN RESULT
#define Rcrmr (33)                      // RECOVER MAP RESULT
#define Getad (35)                      // GET ADDRESS OF NAME
#define Rtoi1 (36)                      // REAL TO INTEGER AS INT
#define Rtoi2 (37)                      // REAL TO INTEGER INTPT
#define Itos1 (38)                      // INTEGER TO STRING AS TOSTRING
#define Mnitr (39)                      // %MONITOR
#define Pprof (40)                      // PRINT PROFILE
#define Rtfp (41)                       // TURN RT INTO FORMAL PARAMETER
#define Onev1 (42)                      // ON EVENT 1 PRIOR TO TRAP
#define Onev2 (43)                      // ON EVENT 2 AFTER TRAP
#define Dvstt (44)                      // START OF DOPE VECTOR
#define Dvend (45)                      // END OF DV EVALUATE TOTSIZE ETC
#define Forend (46)                     // END OF FOR LOOP
#define Dmass (47)                      // assign via bim warning to opt only
#define Rtoi3 (48)                      // real to integer as TRUNC
//
// CODES FOR USER WRITTEN ASSEMBLER. NATURALLY THESE ARE NOT
// MACHINE INDEPENDENT
//
#define Ucnop (50)                      // FOR CNOPS
#define Ucb1 (51)                       // ONE BYTE OPERATIONS
#define Ucb2 (52)                       // FOR 2 BYTE OPERATIONE
#define Ucb3 (53)                       // FOR 3 BYTE OPERATIONS
#define Ucw (54)                        // FOR WORD OPERATIONS
#define Ucbw (55)                       // FOR OPC,BYTEWORD OPERATIONE
#define Ucww (56)                       // FOR OPC,WORD,WORD OPERAIONS
#define Uclw (57)                       // FOR LONGWORD OPERATIONS
#define Ucb2w (58)                      // FOR OPC,B1,B2,WORD OPERATIONS
#define Ucnam (59)                      // FOR ACESS TO NAMES FROM ASSEMBLER
//
// NOW THE BINARY OPERATIONS
//
#define Add (128)                       // ADDITION
#define Sub (129)                       // SUBTRACTION
#define Noneq (130)                     // INTEGER NONEQUIVALENCE
#define Orl (131)                       // LOGICAL OR
#define Mult (132)                      // MULTIPLICATION
#define Intdiv (133)                    // INTEGER DIVISION
#define Realdiv (134)                   // REAL DIVISION
#define Andl (135)                      // LOGICAL AND
#define Rshift (136)                    // LOGICAL RIGHT SHIFT
#define Lshift (137)                    // LOGICAL LEFT SHIFT
#define Rexp (138)                      // REAL EXPONENTIATION
#define Comp (139)                      // COMPARISONS
#define Dcomp (140)                     // FIRST PART OF DSIDED(NEEDED?)
#define Vmy (141)                       // VECTOR MULTIPLY
#define Comb (142)                      // COMBINE (IE ADD OF LA) ON VMY RESULTS
#define Vass (143)                      // VARAIABLE ASSIGN WITH CHECKING
#define Vjass (144)                     // VARIABLE JAMMED ASSIGN
#define Iexp (145)                      // INTEGER EXPONENTIAITION
#define Badj (146)                      // BASE ADJUST ARRAY INDEX
#define Aindx (147)                     // INDEX ARRAY(COMBINE BS&IX)
#define Ifetch (148)                    // NO LONGER USED
#define Lass (149)                      // ASSIGN LOCAL TEMPORARY
#define Forck (150)                     // VALIDATE FOR
#define Precc (151)                     // PRELIMINARY CONNCATENATION
#define Concat (152)                    // CONCATENATION
#define Iocpc (153)                     // CALL IOCP
#define Pass1 (154)                     // PRIMARY PARAMETER ASSIGNMENT
#define Pass2 (155)                     // PARAMETER PASSING POINTER PARAMS
#define Pass3 (156)                     // PARAMETERPASSING ARRAY PARAMETERS
#define Pass4 (157)                     // PASS A FORMAL PROCEDURE
#define Pass5 (158)                     // PASS AN UNTYPE(%NAME) PARAMETER
#define Pass6 (159)                     // PASS STRFN OR RECFN RESULT AREA
#define Bjump (160)                     // BACKWARDS JUMPS
#define Fjump (161)                     // FORWARD JUMPS
#define Remlb (162)                     // REMOVE LAB FROM LABELIST
                                        // NEEDS TO BE TRIPLE IF COMBINED
                                        // LABEL LIST IS USED
#define Tlab (163)                      // TO ENTER A LABEL
#define Dclsw (164)                     // DECLARE A SWITCH ARRAY
#define Setsw (165)                     // SET A SWITCH TO "CA"
#define Gotosw (166)                    // GO TO A SWITCH LABEL
#define Strass1 (167)                   // STRING GENERAL ASSIGNMET
#define Strass2 (168)                   // STRING FIXED LENGTH ASSNMENT
#define Strjt (169)                     // STRING JAM TRANSFER
#define Ahass (170)                     // ASSIGNMENT OF ARRAYHEADS
#define Ptras (171)                     // ASSIGNMENT OF POINTERS
#define Mapres (172)                    // ASSIGN MAPPING FN RESULT
#define Fnres (173)                     // ASSIGN FN RESULT
#define Scomp (174)                     // STRING COMPARISON
#define Sdcmp (175)                     // FIRST PART OF STRING D-SIDED
#define Pres1 (176)                     // PRE RESOLUTION 1
#define Pres2 (177)                     // PRE RESOLUTION 2
#define Resln (178)                     // STRING RESOLUTION
#define Resfn (179)                     // RESOLUTION FINALE
#define Sigev (180)                     // SIGNAL EVENT
#define Recass (181)                    // WHOLE RECORD ASSIGNMENT
#define Aainc (182)                     // ARRAY ADDRESS ADJUST FOR
                                        // RECORD RELATIVE TO ABSOLUTE
#define Ahadj (183)                     // MODIFY HEAD FOR MAPPING
#define Ctgen (184)                     // CREATE TYPE GENERAL PARAMETER
#define Getptr (185)                    // POINTER FOR PASSING BY NAME
#define Sindx (186)                     // INDEX STRING IE CHARNO
                                        // SAME AS AINDX FOR ALL TARGETS
                                        // BUT PNX !
#define Zcomp (187)                     // COMPARISONS WITH ZERO
                                        // GENERATED BY OPTIMISER
#define Clshift (188)                   // CONSTANT LOGICAL SHIFT
                                        // GENERATED BY OPTIMISER
#define Cashift (189)                   // CONSTANT ARITHMETIC SHIFT
                                        // GENERATED BY OPTIMISER
#define Dvbpr (190)                     // GENERATE DV ENTRY FOR BOUND PAIR
#define Rstore (191)                    // REGISTER TO STORE OPERATION
#define Multx (192)                     // MULTIPLY AND EXTEND PRECISION
// ========================================================================


#include "tforms.h"

#ifdef NEVER
//
// TRIPF_FLAGS SIGNIFY AS FOLLOWS
#define Leavestacked (IEXP(2, 0))       // SET LEAVE RESULT IN ESTACK
#define Loadop1 (IEXP(2, 1))            // OPERAND 1 NEEDS LOADING
#define Loadop2 (IEXP(2, 2))            // OPERAND 2 NEEDS LOADING
#define Notinreg (IEXP(2, 3))           // PREVENT REG OPTIMISNG
                                        // OF TEMPS OVER LOOPS&JUMPS
#define Useestack (IEXP(2, 4))          // KEEP DUPLICATE IN ESTACK
#define Usemstack (IEXP(2, 5))          // PUT DUPLICAT ON MSTACK
#define Constantop (IEXP(2, 6))         // ONE OPERAND IS CONSTANT(FOR FOLDING)
#define Commutable (IEXP(2, 7))         // OPERATION IS COMMUTABLE
#define Bstruct (IEXP(2, 12))           // Proc contains inner blks or RTs
#define Usedlate (IEXP(2, 13))          // I-RESULT USED AFTER LAB OR A LONG WAY AHEAD
#define Asslevel (IEXP(2, 14))          // ASSEMBLER LEVEL OPERATION
#define Dontopt (IEXP(2, 15))           // DONT DUPLICATE THIS RESULT
// USED FOR BYTE PTR & OTHER SODS!
//
typedef struct Emasfhdrf {
  int Endra;
  int Startra;
  int Fbytesize;
  int W3;
  int W4;
  int W5;
  int W6;
  int W7;
} Emasfhdrf;
// FORMAT FOR ARRAY HEADS
// %END %OF %FILE "ERCC07.TRIMP_TFORM1S"
#endif

  #define Snpt (0x1006)
  #define Unasspat (0x80808080)
  #define Labusedbit (0x01000000)
  #define Labsetbit (0x02000000)
  #define Maxdict (0x100)
  int I;
  int K;
  int Dummyformat;
  int P1size;
  int Starsize;
  int Asl;
  int Arsize;
  int Oldline;
  int Nextp;
  int Snum;
  int Rlevel;
  int Nmax;
  int Plabel;
  int Level;
  int Profaad;
  int Lastinst;
  int Line;
  int N;
  int Bfflag;
  int Rbase;
  int Q;
  int R;
  int Fname;
  int Stmts;
  int Filesize;
  int Bimstr;
  int Maxulab;
  int Sflabel;
  int Nexttrip;
  int *Sstl;
  int *Ustptr;
  int Curlinead;
  int Nextlinead;
  int Currentssalt;
  _imp_string Mainep;
  int Cas[13 /*0:12*/];
  extern Parmf Parm;
  extern Workaf Worka;
#if (Host == Ibm || Host == Amdahl || Host == Ibmxa || Host == Vax) 
    int *Comreg(int N);
#elseif (Host == Gould || Host == M88k || Host == Rs6 || Host == Mips)
    int *Comreg(int N);
#else
    int *Comreg(int N);
#endif
  #define Bytesperkforsource (256)
  {
    Emasfhdrf *Shdr;
    Emasfhdrf *Whdr;
    Worka = (Workaf){0};
    Worka.Fileaddr = *Comreg(46);
    Parm = (Parmf){0};
    Parm.Bits1 = *Comreg(27);
    Parm.Bits2 = *Comreg(28) | Maxdict;
    Parm.Ttoput = *Comreg(40);
    Parm.Lpoput = *Comreg(23);
    Worka.Wkfilead = *Comreg(14);
    *Comreg(24) = 16;
    Whdr = Record(Worka.Wkfilead);
    Worka.Wkfilek = (unsigned)Whdr->Fbytesize >> 10;
    if (Worka.Fileaddr <= 0) {
      if (Worka.Fileaddr < -1)
        Filesize = Imod(Worka.Fileaddr);
      else
        Filesize = 64000;
      Worka.Fileaddr = 0;
    } else {
      Shdr = Record(Worka.Fileaddr);
      Filesize = Shdr->Endra;
    }
    Worka.Nnames = 1023;
    if (Worka.Wkfilek > 513) Worka.Nnames = 2047;
    if (Worka.Wkfilek > 1000 || (Parm.Bits2 & Maxdict) != 0)
      Worka.Nnames = 4095;
    Asl = 3 * Worka.Nnames;
    Worka.Aslmax = Asl;
    Arsize = Worka.Wkfilek * (1024 - Bytesperkforsource) - 300;
  }
//%byte %integer %array %format AF(0:ARSIZE)
//%byte %integer %array %name A
  #define Af  [Arsize + 1]
  unsigned char *A;
  Listf Aslist[Asl + 1];
  int Tags[(Worka.Nnames) + 1];
  int Word[(Worka.Nnames) + 1];
  int Dvheads[13 /*0:12*/];
  Levelf Levelinf[32 /*0:31*/];
  typedef struct Swdataform {
    int Lseen;
    int Default;
    int Slabs[1024 /*0:1023*/];
  } Swdataform;
  void Free(int Ad);
  int Malloc(int Space);
  void Initasl(Listf *A, int *B);
  void Printtrips(Tripf *Trops);
  void Phex(int Val);
  int Morespace(void);
  void Insertatend(int *S, int A, int B, int C);
  void Insertafter(int *S, int A, int B, int C);
  void Pop(int *C, int *P, int *Q, int *R);
  void Push(int *C, int S1, int S2, int S3);
  int Find(int Lab, int List);
  void Binsert(int *T, int *B, int S1, int S2, int S3);
  void Clearlist(int *Head);
  void Filldtabrefs(int *Head);
  void Cxref(_imp_string Name, int Mode, int Xtra, int *At);
  void Impabort(void);
  void Prologue(Listf *Alist);
  void Epilogue(int Stmts);
  void Pdata(int Area, int Bndry, int L, int Ad);
  void Prdata(int Area, int Bndry, int L, int Rep, int Ad);
  int Pinitown(int Ptype, int Acc, Rd *Init, _imp_string *Xname);
  int Pownarrayhead(int Ptype, int J, int Lb, int Size, int Aoffset, int Aarea,
                    int Dvoffset, _imp_string Xname);
  void Fault(int A, int B, int C);
  void Warn(int N, int V);
  void Tripopt(Tripf *T, int Firsttrip);
  void Movebytes(int Length, int Fbase, int Foff, int Tobase, int Tooff);
  void Ctop(int *Op, int *Mask, int Xtra, Rd *Opnd1, Rd *Opnd2);
#if (Host != Target)
    void Reformatc(Rd *Opnd);
    void Changesex(int Basead, int Offset, int L);
#endif
  void Generate(Tripf *T, int Currlevel, void Getwsp(int *Pl, int Size));
  _imp_string Printname(int Jj);
  void Printlist(int Head);
  K = Host / 10;
  if (!K) K = 1;
  K = Bytesperkforsource / K;
  A = (unsigned char *)(Worka.Wkfilead+K*Worka.Wkfilek);
  {
    int Passone(void);
    Worka.Ccsize = Bytesperkforsource * (Worka.Wkfilek - 1);
    #define Ccf  [(Worka.Ccsize) + 1]
    unsigned char *Cc;
    Cc = (unsigned char *)Worka.Wkfilead+32;
    Worka.Cc = Cc;
    Worka.A = A;
    Worka.Word = Word;
    Worka.Tags = Tags;
    Worka.Line = &Line;
    Worka.N = &N;
    Worka.Release = ReleaseX;
    Worka.Ladate = Ladate;
    Worka.Aasl0 = Addr(Aslist[0]);
    Worka.Amainep = Addr(Mainep);
    Worka.Lasttrip = Worka.Ccsize / 40 - 2;
    if (Worka.Lasttrip > 699) Worka.Lasttrip = 699;
    Worka.Optcnt = 0;
    Worka.Constptr = 1;
    Worka.Aslist = Aslist;
    Plabel = 24999;
    N = 12;
    Maxulab = Worka.Nnames + 16384;
    Lastinst = 0;
    Sflabel = 20999;
    Rlevel = 0;
    Nmax = 0;
    Bfflag = 0;
    Rbase = 1;
    Sstl = &Cas[4];
    Ustptr = &Cas[5];
    Stmts = 1;
    Snum = 0;
    Bimstr = 0;
    Worka.Rtcount = 1;
    Mainep = _imp_str_literal("s#go");
    Initasl(Aslist, &Asl);
    for (I = 0; I <= 12; I++) {
      Cas[I] = 0;
      Dvheads[I] = 0;
    }
    Dummyformat = 0;
    Push(&Dummyformat, 0, 0, 0);
    P1size = Passone();
    R = P1size;
    Worka.Artop = P1size;
  }
  if (Parm.Faulty) {
    *Comreg(24) = 8;
    *Comreg(47) = Parm.Faulty;
    return;
  }
  {
    Levelf *Currinf;
    int Twsphead;
    int Forcnt;
    int Fordpth;
    int Forcecnt;
    int Internalblockid;
#if (Host == Emas || Host == Ibm || Host == Amdahl || Host == Ibmxa)
      Tripf Triples[(Worka.Lasttrip) + 1];
#else
      #define Triplesform  [(Worka.Lasttrip) + 1];
      Tripf *Triples;
      Triples = (Tripf *)(Worka.Wkfilead+32);
#endif
  //%integer %array %format CF(0:12*WORKA_NNAMES)
  //%integer %array %name CTABLE
    #define Cf  [(12 * Worka.Nnames) + 1]
    int *Ctable;
    auto void Reusetemps(void);
    auto void Getwsp(int *Place, int Size);
    auto void Returnwsp(int Place, int Size);
    auto void Compileastmnt(void);
    auto void Outsym(int Sym);
    auto void Forceline(void);
    auto void Outstring(_imp_string Str);
    auto void Outint(int Id);
    auto int Newtrip(void);
    auto int Fromar4(int Ptr);
    auto int Fromar2(int Ptr);
    auto int Uconsttrip(int Opern, int Optype, int Flags, int Const);
    auto int Ulconsttrip(int Opern, int Optype, int Flags, int Const1,
                         int Const2);
    auto int Unametrip(int Opern, int Optype, int Flags, int Name);
    auto int Utemptrip(int Opern, int Optype, int Flags, int Temp);
    auto int Brectrip(int Opern, int Optype, int Flags, Rd *Opnd1, Rd *Opnd2);
    auto int Urectrip(int Opern, int Optype, int Flag, Rd *Opnd1);
    auto void Keepusecount(Rd * Opnd);
    auto void Css(int P);
    typedef struct Outform {
      int Line;
      int LengthX;
      int Lastnl;
      int Prevlast;
      unsigned char *L;
    } Outform;
    static unsigned char Lspace[131073 /*0:131072*/];
    static Outform Opline;
    #define Breakoplines (99)
    Opline = (Outform){0};
    Opline.L = Lspace;
    for (I = 0; I <= Maxlevels; I++) {
      Levelinf[I] = (Levelf){0};
      Levelinf[I].Names = -1;
    }
  //CTABLE == ARRAY(ADDR(ASLIST(1)),CF)       
    Ctable = (int *)Addr(Aslist[1]);
    Worka.Ctable = Ctable;
    Worka.Levelinf = Levelinf;
    Ctable[0] = 'CTAB';
    Twsphead = 0;
    Forcnt = 0;
    Fordpth = 0;
    Forcecnt = 0;
    Internalblockid = 0;
    Prologue(Aslist);
    Line = 0;
    Nexttrip = 1;
    Triples[0] = (Tripf){0};
    Nextp = 1;
    Level = 1;
    Stmts = 0;
    Currinf = &Levelinf[Level];
    Rlevel = 0;
    Rbase = 0;
    *Currinf = (Levelf){0};
    Currinf->Clevel = Level;
    Currinf->Names = -1;
    while (A[Nextp + 3] | A[Nextp + 4]) Compileastmnt();
    Outsym(Nl);
    Outstring(_imp_str_literal("/* end of automatic translation */"));
    Outsym(Nl);
    Forceline();
    Line = 99999;
    Epilogue(Stmts);
    if (Parm.Faulty) {
      *Comreg(24) = 8;
      Stmts = Parm.Faulty;
    } else
      *Comreg(24) = 0;
    *Comreg(47) = Stmts;
    if (Host == Perq) {
      asm("RETURN");
    } else
      goto P2end;
    int Insertcurly(int Cad, int At) {
      int I;
      int J;
      int K;
      int Scount;
      int Res;
      static unsigned char Save[65537 /*0:65536*/]; // [65536 /*1:65536*/];
      Scount = 0;
      if (At > Opline.LengthX) At = Opline.LengthX;
      for (I = At; I <= Opline.LengthX - 1; I++) {
        Scount++;
        Save[Scount] = Opline.L[I];
      }
      Opline.LengthX = At;
      if (*Byteinteger(Curlinead) != '#') {
        Outsym(9);
        Outstring(_imp_str_literal("/*"));
      } else
        Outsym('{');
      J = Cad;
      I = 0;
      for (;;) {
        J++;
        I++;
        if (*Byteinteger(J) == Nl || *Byteinteger(J) == '}') {
          if (*Byteinteger(Curlinead) != '#')
            Outstring(_imp_str_literal("*/"));
          else if (*Byteinteger(J) == '}')
            Outsym('}');
          Res = I + 1;
          break;
        } else {
          Opline.L[Opline.LengthX] = *Byteinteger(J);
          Opline.LengthX = Opline.LengthX + 1;
        }
      }
      for (I = 1; I <= Scount; I++) {
        Opline.L[Opline.LengthX] = Save[I];
        Opline.LengthX = Opline.LengthX + 1;
      }
      return (Res);
    }
    int Locatecurly(int Cad) {
      int Ccount;
      int Firstc;
      int I;
      int Bcount;
      int Commaafter;
      Ccount = 0;
      Bcount = 0;
      Commaafter = 0;
      I = Cad;
      do
        I++;
      while (*Byteinteger(I) != '}' && *Byteinteger(I) != Nl);
      if (*Byteinteger(I) == '}') {
        I++;
        while (*Byteinteger(I) == ' ') I++;
        if (*Byteinteger(I) == ',') {
          Commaafter = 1;
          Ccount = 1;
        }
      }
      for (I = Cad; I >= Curlinead; I--)
        if (*Byteinteger(I) == ',') {
          if (!Ccount) Firstc = I;
          Ccount++;
        }
      if (!Ccount) return (Opline.LengthX);
      if (!Commaafter)
        for (I = Firstc; I <= Cad - 1; I++) {
          if (33 <= *Byteinteger(I) && *Byteinteger(I) <= 127) Bcount++;
          if (*Byteinteger(I) == '{' || *Byteinteger(I) == '}') Bcount++;
        }
      for (I = 0; I <= Opline.LengthX; I++)
        if (Opline.L[I] == ',' || Opline.L[I] == ';') {
          Ccount--;
          if (!Ccount) goto Next;
        }
      return (Opline.LengthX);
    Next:;
      if (Commaafter) return (I);
      if (!Bcount) return (I + 1);
      for (I = I; I <= Opline.LengthX; I++) {
        if (33 <= Opline.L[I] && Opline.L[I] <= 127) Bcount--;
        if (!Bcount) {
          while (I < Opline.LengthX - 1 &&
                 ('a' <= Opline.L[I+1] && Opline.L[I+1] <= 'z' ||
                  'A' <= Opline.L[I+1] && Opline.L[I+1] <= 'Z' ||
                  '0' <= Opline.L[I+1] && Opline.L[I+1] <= '9' || Opline.L[I+1] == '_') &&
                 ('a' <= Opline.L[I] && Opline.L[I] <= 'z' ||
                  'A' <= Opline.L[I] && Opline.L[I] <= 'Z' ||
                  '0' <= Opline.L[I] && Opline.L[I] <= '9' || Opline.L[I] == '_'))
            I++;
          if (Opline.L[I+1] == '*' && Opline.L[I] == '/') I--;
          if (Opline.L[I+1] == '/' && Opline.L[I] == '*') I++;
          if (Opline.L[I+1] == '*' && Opline.L[I+2] == '/') I += 2;
          return (I + 1);
        }
      }
      return (Opline.LengthX);
    }
    void Curlycheck(int Mode) {
      static int Lastlinead;
      int I;
      int At;
      if (Nextlinead > Curlinead && Curlinead != Lastlinead &&
          Nextlinead - Curlinead <= 2047) {
        for (I = Curlinead; I <= Nextlinead - 1; I++)
          if (*Byteinteger(I) == '{') {
            At = Locatecurly(I);
            I += Insertcurly(I, At);
          }
        Lastlinead = Curlinead;
      }
    }
    void Forceline(void) {
      int I;
      int At;
      extern int Filesseen;
      if (Filesseen == 0 || Line < 20000) {
        Curlycheck(0);
        if (!Opline.LengthX) return;
        for (I = 0; I <= Opline.LengthX - 1; I++) Printsymbol(Opline.L[I]);
        Newline();
      }
      I = Opline.LengthX - 1;
      while (I > 0 && (Opline.L[I] == '}' || Opline.L[I] == Nl)) I--;
      if (I >= 0) Opline.Prevlast = Opline.L[I];
      Opline.LengthX = 0;
      Opline.Lastnl = -1;
    }
    void Outsym(int Sym) {
      if (Sym == Nl) Opline.Lastnl = Opline.LengthX;
      Opline.L[Opline.LengthX] = Sym;
      Opline.LengthX = Opline.LengthX + 1;
      if (Currentssalt == 12 && Sym == ',' &&
          Opline.LengthX - Opline.Lastnl > (unsigned)Breakoplines >> 1) {
        Outsym(Nl);
        return;
      }
      if (Opline.LengthX - Opline.Lastnl > Breakoplines)
        if (Opline.L[Opline.Lastnl+1] != '#')
          if (Sym == ' ' || Sym == ',' || Sym == ')') Outsym(Nl);
    }
    void Outsep(void) {
      int I;
      I = Opline.LengthX - 1;
      while (I >= 0 && (Opline.L[I] == Nl || Opline.L[I] == '}')) I--;
      if (I >= 0 && Opline.L[I] == ';') return;
      if (I < 0 && Opline.Prevlast == ';') return;
      Outsym(';');
    }
    void Outstring(_imp_string S) {
      int I;
      int J;
      int Sym;
      J = Opline.LengthX;
      for (I = 1; I <= *Length(S); I++) {
        Sym = *Charno(S, I);
        if (Sym == Nl) {
          Opline.L[J] = '\\';
          Opline.L[J+1] = 'n';
          J += 2;
        } else if (Sym == '"') {
          Opline.L[J] = '\\';
          Opline.L[J+1] = '"';
          J += 2;
        } else {
          Opline.L[J] = Sym;
          J++;
        }
      }
      Opline.LengthX = J;
    }
    void Outcommentend(void) {
      if (Opline.L[Opline.LengthX-1] != '*') {
        //{GT:} ! Let 'indent' take care of this ...
        //      ! outsym(' ') %while opline_length-opline_lastnl <78
      }
      Outstring(_imp_str_literal("*/"));
    }
    _imp_string Validname(_imp_string Name) {
      #define Nr (34 + 1)
      static const _imp_string Rnames[36 /*0:35*/] = {
          _imp_str_literal("sizeof"),   _imp_str_literal("auto"),
          _imp_str_literal("static"),   _imp_str_literal("extern"),
          _imp_str_literal("register"), _imp_str_literal("typedef"),
          _imp_str_literal("char"),     _imp_str_literal("short"),
          _imp_str_literal("long"),     _imp_str_literal("int"),
          _imp_str_literal("unsigned"), _imp_str_literal("float"),
          _imp_str_literal("double"),   _imp_str_literal("void"),
          _imp_str_literal("enum"),     _imp_str_literal("struct"),
          _imp_str_literal("union"),    _imp_str_literal("if"),
          _imp_str_literal("else"),     _imp_str_literal("while"),
          _imp_str_literal("do"),       _imp_str_literal("for"),
          _imp_str_literal("switch"),   _imp_str_literal("case"),
          _imp_str_literal("default"),  _imp_str_literal("break"),
          _imp_str_literal("continue"), _imp_str_literal("return"),
          _imp_str_literal("goto"),     _imp_str_literal("abs"),
          _imp_str_literal("fabs"),     _imp_str_literal("volatile"),
          _imp_str_literal("asm"),      _imp_str_literal("const"),
          _imp_str_literal("signed"),   _imp_str_literal("exit")};
      int I;
      for (I = 0; I <= Nr; I++)
        if (_imp_strcmp(Name, Rnames[I])==0) {
          *Charno(Name, 1) = *Charno(Name, 1) - 32;
          return (Name);
        }
      return (Name);
    }
    void Revisename(_imp_string *Name) {
      int I;
      return;
      for (I = 1; I <= *Length(*Name); I++)
        if ('a' <= *Charno(*Name, I) && *Charno(*Name, I) <= 'z')
          *Charno(*Name, I) = *Charno(*Name, I) - 32;
    }
    void Outname(int Id) {
      int I;
      int Ad;
      Listf *Lcell;
      _imp_string Name;
      I = Worka.Word[Id];
      Ad = Addr(Worka.Lett);
      Name = *String(Ad);
      Lcell = &Aslist[Worka.Tags[Id]];
      if ((Lcell->Ptype & 0xff00) == 0x4000 && (Lcell->Uioj & 0xf0) == 0)
        Revisename(&Name);
      if (Lcell->Ptype != 0x156) Name = Validname(Name);
      Outstring(Name);
      if (Opline.LengthX - Opline.Lastnl > Breakoplines)
        if (Opline.L[Opline.Lastnl] != '#') Outsym(Nl);
    }
    void Outswadname(int Id) {
      int I;
      int Ad;
      Listf *Lcell;
      _imp_string Name;
      I = Worka.Word[Id];
      Ad = Addr(Worka.Lett);
      Name = *String(Ad);
      Lcell = &Aslist[Worka.Tags[Id]];
      if ((Lcell->Ptype & 0xff00) == 0x4000 && (Lcell->Uioj & 0xf0) == 0)
        Revisename(&Name);
      Outstring(Name);
      if (Currinf->Iblkid > 0) {
        Outsym('_');
        Outint(Currinf->Iblkid);
      }
    }
    int Possibletypename(int Id, _imp_string *Typename) {
      int I;
      int Ad;
      int J;
      _imp_string Name;
      _imp_string Firstpart;
      _imp_string S;
      _imp_string T;
      I = Worka.Word[Id];
      Ad = Addr(Worka.Lett);
      Name = *String(Ad);
      J = 0;
      while (_imp_resolve(Name, &S, _imp_str_literal("type"), &Name)) {
        if (!J)
          Firstpart = S;
        else
          Firstpart =
              _imp_join(Firstpart, _imp_join(_imp_str_literal("type"), S));
        J++;
      }
      if (_imp_strcmp(Name, _imp_str_literal(""))==0 && *Length(Firstpart) > 3) {
        *Typename = _imp_join(Firstpart, _imp_str_literal("_type"));
        return (1);
      } else {
        *Typename = _imp_str_literal("not_a_valid_type_name");
        return (0);
      }
    }
    void Outrevisablename(int Id) {
      int I;
      int Ad;
      _imp_string Name;
      I = Worka.Word[Id];
      Ad = Addr(Worka.Lett[I]);
      Name = *String(Ad);
      Revisename(&Name);
      Outstring(Validname(Name));
      if (Opline.LengthX - Opline.Lastnl > Breakoplines)
        if (Opline.L[Opline.Lastnl+1] != '#') Outsym(Nl);
    }
    void Outformatname(int Kf) {
      int I;
      int Kk;
      Listf *Lcell;
      _imp_string S;
      for (I = 0; I <= Worka.Nnames; I++) {
        Kk = Tags[I];
        if (Kk) {
          Lcell = &Aslist[Kk];
          if ((Lcell->Ptype & 15) == 4 && Lcell->Kform == Kf) {
            if (Possibletypename(I, &S) > 0)
              Outstring(S);
            else {
              if (Lcell->Ptype == 4)
                Outstring(_imp_str_literal("struct "));
              else
                Outstring(_imp_str_literal("union "));
              Outname(I);
            }
            return;
          }
        }
      }
      Outstring(_imp_str_literal(" ? unknown format name ?"));
    }
    void Outextern(int Extern) {
      if (!(Extern & 3))
        Outstring(_imp_str_literal("static const "));
      else if (Extern == 1)
        Outstring(_imp_str_literal("static "));
      else if (Extern == 3)
        Outstring(_imp_str_literal("extern "));
    }
    void Outhex(int Value) {
      static const _imp_string Hex[16 /*0:15*/] = {
          _imp_str_literal("0"), _imp_str_literal("1"), _imp_str_literal("2"),
          _imp_str_literal("3"), _imp_str_literal("4"), _imp_str_literal("5"),
          _imp_str_literal("6"), _imp_str_literal("7"), _imp_str_literal("8"),
          _imp_str_literal("9"), _imp_str_literal("A"), _imp_str_literal("B"),
          _imp_str_literal("C"), _imp_str_literal("D"), _imp_str_literal("E"),
          _imp_str_literal("F")};
      int I;
      int Digit;
      _imp_string Res;
      Res = _imp_str_literal("");
      for (I = (8 << 2) - 4; I >= 0; I -= 4) {
        Digit = (unsigned)Value >> I & 15;
        if (_imp_strcmp(Res, _imp_str_literal(""))!=0 || Digit != 0)
          Res = _imp_join(Res, Hex[Digit]);
      }
      if (_imp_strcmp(Res, _imp_str_literal(""))==0) Res = _imp_str_literal("0");
      Outstring(_imp_join(_imp_str_literal("0x"), Res));
    }
    void Outtype(int Type, int Kf) {
      if (Type == 0x31)
        Outstring(_imp_str_literal("unsigned char "));
      else if (Type == 0x41)
        Outstring(_imp_str_literal("short int "));
      else if (Type == 0x51)
        Outstring(_imp_str_literal("int "));
      else if (Type == 0x61)
        Outstring(_imp_str_literal("INT64 "));
      else if (Type == 0x52)
        Outstring(_imp_str_literal("float "));
      else if (Type == 0x62)
        Outstring(_imp_str_literal("double "));
      else if (Type == 0x72)
        Outstring(_imp_str_literal("long double "));
      else if (Type == 0x35)
        Outstring(_imp_str_literal("char * "));
      else if (Type == 0x33) {
        Outformatname(Kf);
        Outsym(' ');
      } else {
        Outstring(_imp_str_literal("void "));
      }
    }
    void Outxtype(int Xtype, int Kf) {
      int Rout;
      int Nam;
      int Arr;
      int Type;
      Rout = (unsigned)Xtype >> 12 & 1;
      Nam = (unsigned)Xtype >> 10 & 3;
      Arr = (unsigned)Xtype >> 8 & 3;
      Type = Xtype & 7;
      Outtype(Xtype & 255, Kf);
      if ((Rout != 0 || Arr != 0 || (Nam & 1) != 0) && Type != 5) Outsym('*');
    }
    void Outlhex(int Msh, int Lsh) {
      static const _imp_string Hex[16 /*0:15*/] = {
          _imp_str_literal("0"), _imp_str_literal("1"), _imp_str_literal("2"),
          _imp_str_literal("3"), _imp_str_literal("4"), _imp_str_literal("5"),
          _imp_str_literal("6"), _imp_str_literal("7"), _imp_str_literal("8"),
          _imp_str_literal("9"), _imp_str_literal("A"), _imp_str_literal("B"),
          _imp_str_literal("C"), _imp_str_literal("D"), _imp_str_literal("E"),
          _imp_str_literal("F")};
      int I;
      int Digit;
      _imp_string Res;
      Res = _imp_str_literal("");
      for (I = (8 << 2) - 4; I >= 0; I -= 4) {
        Digit = (unsigned)Msh >> I & 15;
        if (_imp_strcmp(Res, _imp_str_literal(""))!=0 || Digit != 0)
          Res = _imp_join(Res, Hex[Digit]);
      }
      for (I = (8 << 2) - 4; I >= 0; I -= 4) {
        Digit = (unsigned)Lsh >> I & 15;
        if (_imp_strcmp(Res, _imp_str_literal(""))!=0 || Digit != 0)
          Res = _imp_join(Res, Hex[Digit]);
      }
      if (_imp_strcmp(Res, _imp_str_literal(""))==0) Res = _imp_str_literal("0");
      Outstring(_imp_join(_imp_str_literal("0x"), Res));
    }
    void Outint(int Value) {
      int Sign;
      int Work;
      int Ptr;
      unsigned char Ch[16 /*0:15*/];
      if (Value == 0x80000000) {
        Outhex(Value);
        return;
      }
      Sign = ' ';
      if (Value < 0) {
        Sign = '-';
        Value = -Value;
      }
      Ptr = 0;
      do {
        Work = Value / 10;
        Ch[Ptr] = Value - 10 * Work;
        Value = Work;
        Ptr++;
      } while (Value);
      Work = Ptr - 1;
      if (Sign == '-') Outsym(Sign);
      for (Ptr = Work; Ptr >= 0; Ptr--) Outsym(Ch[Ptr] + '0');
    }
    void Outinternames(int Info) {
      int K;
      int Id;
      for (K = 12; K >= 0; K -= 4) {
        Id = (unsigned)Info >> K & 15;
        if (Id) {
          if (Id & 8) {
            Outstring(_imp_str_literal("s"));
            Outint(Id & 7);
          } else {
            Outstring(_imp_str_literal("u"));
            Outint((Id & 7) - 1);
          }
          Outsym('.');
        }
      }
    }
    auto void Outfl(double X, int N);
    void Print(double X, int N, int M) {
      static const double Dz = 0;
      double Y;
      double Z;
      double Round;
      double Factor;
      int I;
      int J;
      int L;
      int Morig;
      unsigned char Sign;
      M = M & 63;
      Morig = M;
      if (N < 0) N = 1;
      N = N & 31;
      X += Dz;
      Sign = ' ';
      if (X < 0) Sign = '-';
      Y = Mod(X);
      Round = 0.5 / REXP(10, M);
      if (Y > 1.0 * REXP(10, 16) || N == 0) {
        if (N > M) M = N;
        Outfl(X, M);
        return;
      }
      I = 0;
      Z = 1;
      Y += Round;
      do {
        I++;
        Z = 10 * Z;
      } while (Z <= Y);
      Outsym(Sign);
      J = I - 1;
      Z = REXP(10, J);
      Factor = 1 / 10;
      for (;;) {
        do {
          L = Intpt(Y / Z);
          Y -= L * Z;
          Z = Z * Factor;
          Outsym(L + '0');
          J--;
        } while (J >= 0);
        if (!M) break;
        Outstring(_imp_str_literal("."));
        J = M - 1;
        Z = REXP(10, (J - 1));
        M = 0;
        Y = 10 * Y * Z;
      }
      if (Morig > 0)
        while (Opline.L[Opline.LengthX - 1] == '0' &&
               Opline.L[Opline.LengthX - 2] != '.')
          Opline.LengthX = Opline.LengthX - 1;
    }
    void Outfl(double X, int N) {
      double Sign;
      double Round;
      double Factor;
      double Lb;
      double Ub;
      static const double Dz = 0;
      int Count;
      int Inc;
      Inc = *Integer(Addr(X));
      if (((unsigned)Inc >> 20 & 0x7ff) == 0x7ff) {
        Outstring(_imp_str_literal("NAN {"));
        Outhex(Inc);
        Outhex(*Integer(Addr(X) + 4));
        Outsym('}');
        return;
      }
      Round = 0.5 / REXP(10, N);
      Lb = 1 - Round;
      Ub = 10 - Round;
      Sign = 1;
      X += Dz;
      if (!X)
        Count = 0;
      else {
        if (X < 0) {
          X = -X;
          Sign = -Sign;
        }
        Inc = 1;
        Count = 0;
        Factor = 1 / 10;
        if (X <= 1) {
          Factor = 10;
          Inc = -1;
        }
        while (X < Lb || X >= Ub) {
          X = X * Factor;
          Count += Inc;
        }
      }
      Print(Sign * X, 1, N);
      if (Count) {
        Outstring(_imp_str_literal("E"));
        Outint(Count);
      }
    }
    void Forcetrips(void) {
      Triples[0] = (Tripf){0};
      Nexttrip = 1;
      Triples[0].Flink = 1;
    }
    void Compileastmnt(void) {
      int I;
      Forcetrips();
      I = Nextp;
      Starsize = (A[Nextp] << 16) + (A[Nextp + 1] << 8) + A[Nextp + 2];
      Nextp += Starsize;
      Line = (A[I + 3] << 8) + A[I + 4];
      Curlinead = Fromar4(I + 5);
      Nextlinead = Fromar4(Nextp + 5);
      Stmts++;
      Opline.Line = Line;
      Css(I + 9);
      if ((A[Nextp + 3] << 8 | A[Nextp + 4]) == Line) {
        Curlycheck(1);
        Outsym(9);
      } else
        Forceline();
    }
    int Nextstmntalt(void) { return (A[Nextp + 9]); }
    void Css(int Pinit) {
      auto void Enterjump(int Mask, int Stad, int Flag);
      auto int Enterlab(int M, int Flag);
      auto void Removelab(int Lab);
      auto void Savestackptr(void);
      auto void Cend(int Kkk);
      auto int Ccond(int Cto, int A, int B, int Jflags);
      auto int Reverse(int Mask);
      auto void Setline(void);
      auto void Cui(int Code);
      auto void Assign(int A, int B);
      auto void Cstart(int Ccres, int Mode);
      auto void Ccycbody(int Ua, int Elab, int Clab);
      auto void Cloop(int Alt, int Markc, int Markui);
      auto void Cifthen(int Markiu, int Markc, int Markui, int Marke, int Markr,
                        int Afterelse);
      auto int Createah(int Mode, Rd *Eopnd, Rd *Nopnd);
      auto void Torp(int *Head, int *Bot, int *Nops, int Mode);
      auto int Intexp(int *Value, int Prectype);
      auto int Constexp(int Prectype);
      auto void Csexp(int Mode);
      auto void Labexp(void);
      auto void Outopnd(Rd * Opnd, int Mode);
      auto void Outtriple(int Tripno, int Mode);
      auto void Cstrexp(int B);
      auto void Cres(int Lab);
      auto void Expop(int *A, int *B, int C, int D);
      auto void Testapp(int *Num);
      auto void Skipexp(void);
      auto void Skipapp(void);
      auto void Noapp(void);
      auto int Dopevector(int A, int B, int C, int Mode, int Id);
      auto void Declarearrays(int A, int B);
      auto void Declarescalars(int B);
      auto void Crspec(int M);
      auto void Cfplist(int *A, int *B);
      auto void Cfpdel(void);
      auto void Clt(void);
      auto int Roundinglength(int Ptype, int Rules);
      auto void Cqn(int P);
      auto int Tsexp(int *Value);
      auto int Tcond(void);
      auto void Crcall(int Rtname);
      auto void Nameop(int Z, int Size, int Namep);
      auto void Cname(int Z);
      auto void Caname(int Z, int Arrp, Rd *Hdopnd);
      auto void Csname(int Z);
      auto void Copytag(int Kk, int Declare);
      auto void Reducetag(int Declare);
      auto void Storetag(int Kk, int Level, int Rbase, int J, int Sndisp,
                         int Acc, int Slink, int Kform);
      auto void Unpack(void);
      auto void Pack(int *Ptype);
      auto void Rdisplay(int Kk);
      auto void Rhead(int Rtname, int Axname, int Xtra);
      auto int Cformatref(void);
      auto void Crformat(int Myrflevel);
      auto void Processformat(int Level, int Alt, int Structorunion, int Intid,
                              int *Strid, int *Ophed, int *Opbot);
      auto int Displacement(int Link);
      auto int Copyrecordtag(int *Subs);
      auto int Chkrecalign(int P1);
      static int Sw_sw;
      static void *Sw[24 /*1:24*/] = {
          &&Sw_1,  &&Sw_2,  &&Sw_3,  &&Sw_4,  &&Sw_5,  &&Sw_6,
          &&Sw_7,  &&Sw_8,  &&Sw_9,  &&Sw_10, &&Sw_11, &&Sw_12,
          &&Sw_13, &&Sw_14, &&Sw_15, &&Sw_16, &&Sw_17, &&Sw_18,
          &&Sw_19, &&Sw_20, &&Sw_21, &&Sw_22, &&Sw_23, &&Sw_24,
      };
      static const unsigned char Fcomp[15 /*0:14*/] = {
          0, 8, 10, 2, 7, 12, 4, 7, 8, 12, 4, 7, 10, 2, 7};
      int Rfhead[13 /*0:12*/][13 /*0:12*/];
      int Rfbot[13 /*0:12*/][13 /*0:12*/];
      int Rfalt[13 /*0:12*/];
      int Rflevel;
      int P;
      int Sndisp;
      int Acc;
      int K;
      int Kform;
      int Stname;
      int Midcell;
      int Tcell;
      int Jj;
      int Jjj;
      int Kk;
      int Qq;
      int Marker;
      int Reportui;
      int Xdisp;
      int Mask;
      int Base;
      int Area;
      int Access;
      int Disp;
      int Extrn;
      int Currinst;
      int Value;
      int Stringl;
      int Ptype;
      int I;
      int J;
      int Oldi;
      int Usebits;
      int Strfnres;
      int Markiu;
      int Markui;
      int Markc;
      int Marke;
      int Markr;
      int Inaformat;
      int Litl;
      int Rout;
      int Nam;
      int Arr;
      int Prec;
      int Type;
      int Lhformatname;
      int Doinglabel;
      Rd Expopnd;
      Rd Nameopnd;
      Rd Mlopnd;
      P = Pinit;
      Doinglabel = 0;
      Currinst = 0;
      Inaformat = 0;
      Currentssalt = A[P];
      goto *Sw[Sw_sw = (Currentssalt)-1];
    Sw_13:;
      {
        _imp_string S;
        _imp_string Head;
        _imp_string Tail;
        S = *String(Addr(A[P + 2]));
        if (_imp_resolve(S, &Head, _imp_str_literal(".inc"), &Tail))
          S = _imp_join(Head, _imp_str_literal(".h"));
        Outstring(_imp_str_literal("#include "));
        Outsym('"');
        Outstring(S);
        Outsym('"');
      }
      goto Cssexit2;
    Sw_24:;
      if (A[P + 1] == 10) Outsym(' ');
      goto Cssexit2;
    Sw_2:;
      P++;
      Kk = A[P];
      P++;
      Jj = A[P];
      Jjj = 0;
      if (Kk == 1)
        Outsym('#');
      else
        Outstring(_imp_str_literal("/*"));
      while (Jj != Nl) {
        if (Jj > 128 && Jjj < 128) Outsym('%');
        Outsym(Jj & 127);
        Jjj = Jj;
        P++;
        Jj = A[P];
        if (Jjj == '\\' && Jj == 13 && Kk == 1) {
          Outsym(Nl);
          P++;
          continue;
        }
        if (Jjj == ',' && ((Kk == 2 && Jj == '!') || (Kk == 1 && Jj == '#'))) {
          if (Kk == 1) {
            Outsym(Nl);
            Outsym('#');
          } else {
            Outcommentend();
            Outsym(Nl);
            Outstring(_imp_str_literal("/*"));
          }
          Jjj = Jj;
          P++;
          Jj = A[P];
        }
      }
      if (Kk > 1) Outcommentend();
      goto Cssexit2;
    Cssexit:
      if (Opline.LengthX <= 0 || Opline.L[Opline.LengthX-1] != '}') Outsep();
    Cssexit2:
      Lastinst = Currinst;
      return;
    Sw_1:;
      Marker = P + 1 + (A[P + 1] << 8) + A[P + 2];
      P += 3;
      if (A[Marker] == 1) goto Labfnd;
      if (A[Marker] == 2) {
        Setline();
        Cui(0);
        goto Cssexit;
      }
      Marke = 0;
      Markr = 0;
      Markui = P;
      Markiu = Marker + 1;
      Markc = Markiu + 1;
      if (A[Marker] == 3) {
        Cifthen(Markiu, Markc, Markui, 0, 0, No);
        goto Cssexit;
      }
      Cloop(A[Markiu], Markc + 2, Markui);
      goto Cssexit;
    Labfnd:
      Oldline = 0;
      if (A[P] != 1 || A[P + 5] != 2) goto Switch;
      if (A[P + 6] != 2 || A[P + 7] != 2) goto Switch;
      Jj = Enterlab(Fromar2(P + 3), 0);
      Outname(Fromar2(P + 3));
      Outsym(':');
      Curlycheck(0);
      Outsym(Nl);
      if (1 << Nextstmntalt() & (1 << 6 | 1 << 4 | 1 << 18 | 1 << 9)) Outsep();
      goto Cssexit2;
    Sw_5:;
      if (A[P + 5] == 2)
        Cloop(0, P + 1, P + 1);
      else {
        Setline();
        Cloop(6, P + 6, P + 1);
      }
      goto Cssexit;
    Sw_6:;
      goto Cssexit2;
    Sw_22:;
      goto Cssexit2;
    Sw_3:;
      Markiu = P + 1;
      Markc = Markiu + 3;
      Markr = P + 2 + (A[P + 2] << 8) + A[P + 3];
      Marke = 0;
      if (A[Markr] == 3) {
        Marke = Markr + 1 + Fromar2(Markr + 1);
        Markui = Markr + 3;
      }
      Cifthen(Markiu, Markc, Markui, Marke, Markr, No);
      goto Cssexit;
    Sw_4:;
    Sw_18:;
      goto Cssexit2;
    Switch : {
      Listf *Lcell;
      Swdataform *Swdata;
      int Naps;
      int Fname;
      Fname = Fromar2(P + 3);
      if (A[P] != 1 || A[P + 5] != 1) {
        Fault(5, 0, Fname);
        goto Bend;
      }
      P += 6;
      Copytag(Fname, No);
      if (Oldi != Level || Type != 6) {
        Fault(4, 0, Fname);
        goto Bend;
      }
      Lcell = &Aslist[K];
      Swdata = Record(Lcell->S1);
      Swdata->Slabs[Swdata->Lseen] = P;
      Swdata->Lseen = Swdata->Lseen + 1;
      Outswadname(Fname);
      Outstring(_imp_str_literal("_"));
      Labexp();
      Outsym(':');
      Curlycheck(0);
      Outsym(Nl);
      if (1 << Nextstmntalt() & (1 << 6 | 1 << 4 | 1 << 18 | 1 << 9)) Outsep();
    Bend:;
    }
      if (!Parm.Opt) Forcetrips();
      goto Cssexit2;
    Sw_23:;
      {
        Listf *Lcell;
        Swdataform *Swdata;
        int Fname;
        int Jj;
        int Res;
        Fname = Fromar2(P + 1);
        Copytag(Fname, No);
        if (Oldi == Level && Type == 6) {
          Lcell = &Aslist[K];
          Swdata = Record(Lcell->S1);
          Swdata->Default = P;
          Outswadname(Fname);
          Outstring(_imp_str_literal("_default:"));
        } else
          Fault(4, 0, Fname);
      }
      if (!Parm.Opt) Forcetrips();
      goto Cssexit2;
    Sw_7:;
      Markiu = P + 1;
      Markc = Markiu + 3;
      Cloop(A[Markiu] + 3, Markc, Markiu + 1 + Fromar2(Markiu + 1));
      goto Cssexit;
    Sw_8:;
      P++;
      Marker = P + Fromar2(P);
      P += 2;
      Rout = 0;
      Litl = 0;
      if (A[Marker] != 1) {
        Clt();
        if (Type == 5 && (Acc <= 0 || Acc > 256)) {
          Fault(70, Acc - 1, 0);
          Acc = 255;
        }
        Nam = 0;
        Setline();
        Qq = 2 - A[P + 1];
        P += 2;
        Declarearrays(Qq, Kform);
        if (Qq == 1) goto Cssexit2;
        if (!Parm.Opt) Forcetrips();
      } else {
        Clt();
        Cqn(P + 1);
        P += 2;
        Declarescalars(Kform);
      }
      goto Cssexit;
    Sw_9:;
      {
        static int S_sw;
        static void *S[5 /*1:5*/] = {
            &&S_1, &&S_2, &&S_3, &&S_4, &&S_default,
        };
        int Etype;
        Etype = A[P + 1];
        goto *S[S_sw = (Etype)-1];
      S_1:;
        Outstring(_imp_str_literal("exit(0);"));
        Outsym(Nl);
      S_2:;
        if (!Parm.Cprmode) Parm.Cprmode = 2;
        if (Level + Parm.Cprmode != 3) Fault(15, Level + Parm.Cprmode - 3, 0);
        Cend(Parm.Cprmode);
        if (Etype == 1) Outsym('}');
        goto L_Bend;
      S_3:;
        goto L_Bend;
      S_4:;
        if (Parm.Cprmode == 1 && Level == 2)
          Fault(14, 0, 0);
        else
          Cend(Currinf->Flag);
        Outstring(_imp_str_literal("}"));
      L_Bend:;
        goto S_skip;
      S_default:
        fprintf(stderr, "\nSwitch label 'S(%d):' not set in %s\n", S_sw + 1,
                __PRETTY_FUNCTION__);
        fflush(stderr);
        abort();
      S_skip:;
      }
      goto Cssexit2;
    Sw_11:;
      {
        int Marker1;
        int Rtname;
        int Kkk;
        int Ptr;
        int Ptypep;
        int Cnt;
        int Pp;
        int Pchain;
        int Axname;
        int Pname;
        int Nparams;
        int Schain;
        int Parmspace;
        int D;
        int Paramptype;
        int Paramacc;
        int Pcount;
        Listf *Lcell;
        Listf *Lcell2;
        Listf *Tcell;
        P++;
        Marker1 = Fromar2(P) + P;
        Markc = A[Marker1];
      Agn:
        Q = P;
        Rtname = Fromar2(Marker1 + 3);
        Extrn = A[P + 2];
        Litl = Extrn & 3;
        if (A[Marker1] == 1) {
          P += 3;
          Crspec(1 - ((unsigned)Extrn >> 2));
          goto LL_Bend;
        }
        Forcetrips();
        Copytag(Rtname, No);
        Axname = Addr(Worka.Lett);
        if (Extrn == 3) Extrn = 2;
        if (Target == Emas && Extrn == 1) Warn(11, 0);
        if (A[Marker1 + 5] == 1) {
          Movebytes(A[Marker1 + 6] + 1, Addr(A[0]), Marker1 + 6, Addr(A[0]),
                    Worka.Artop);
          Axname = Addr(A[Worka.Artop]);
          Worka.Artop = (Worka.Artop + 4 + A[Marker1 + 6]) & (-4);
        }
        if (Extrn == 4) Axname = 0;
        if (Oldi != Level) {
          P = Q + 3;
          Crspec(2);
          P = Q;
          goto Agn;
        } else {
          if (!Parm.Cprmode) Parm.Cprmode = 2;
          if (Extrn != 4 && (Parm.Cprmode != 2 || Level != 1))
            Fault(56, 0, Rtname);
          if (A[P + 3] == 1)
            Kkk = Litl << 14 | 0x1000;
          else {
            Rout = 1;
            P += 4;
            Clt();
            Arr = 0;
            Nam = 0;
            if (A[P] == 2) Nam = 2;
            Pack(&Kkk);
          }
        }
        if ((J != 15 && J != 7 * Extrn) || (Ptype & 0xFFFF) != Kkk) {
          P = Q + 3;
          Crspec(2);
          P = Q;
          goto Agn;
        }
        Ptype = Ptype | (Extrn & 3) << 14;
        Tcell = &Aslist[Tags[Rtname]];
        Tcell->Ptype = Ptype;
        if ((Ptype & 0xc000) == 0x8000) Usebits = 2;
        Tcell->Uioj = Tcell->Uioj & 0x3FF0 | Usebits << 14;
        if ((Target == Perq || Target == Accent) && J == 14) {
          Tcell->S2 = Worka.Rtcount;
          Worka.Rtcount = Worka.Rtcount + 1;
        }
        Ptypep = Ptype;
        if (!(Ptypep & 0xc000)) Outstring(_imp_str_literal("static "));
        Outtype(Ptypep & 255, Tcell->Kform);
        if ((Ptypep & 0x800) != 0 && (Ptypep & 7) != 5) Outsym('*');
        if (!Axname)
          Outname(Rtname);
        else
          Outstring(*String(Axname));
        Outsym('(');
        Pchain = Tcell->Slink;
        Rhead(Rtname, Axname, Fromar2(Marker1 + 1));
        P = Marker1 + 6;
        if (A[P - 1] == 1) P = P + A[P] + 1;
        Cnt = 0;
        Ptype = Ptypep;
        Unpack();
        N = Rtparam1offset;
        if (Target == Perq || Target == Accent) {
          if (Type) N = (Bytes[Prec] + 1) & (-2);
          if (Type == 5 || Type == 3) N = 4;
          if (Nam) {
            if (Type == 5)
              N = 4;
            else
              N = Ptrsize[Ptype & 127];
          }
          Currinf->Ressize = N;
        }
        Nparams = 0;
        Parmspace = 0;
        if (Pchain) Nparams = Aslist[Pchain].S3;
        if (Nparams) {
          Parmspace = (unsigned)Nparams >> 16;
          Nparams = Nparams & 0xFF;
        }
        while (A[P] == 1) {
          Pp = P + 1 + Fromar2(P + 1);
          P += 3;
          Cfpdel();
          Paramptype = Ptype;
          Paramacc = Acc;
          Ptr = P;
          do {
#if (Paramsbwards == Yes)
              Pchain = Tcell->Slink;
              for (Kkk = 2; Kkk <= Nparams - Cnt; Kkk++)
                Pchain = Aslist[Pchain].Link;
#endif
            Lcell = &Aslist[Pchain];
            if (Pchain)
              if (Lcell->Ptype != Paramptype ||
                  (Lcell->Acc & 0xFFFF) != Paramacc)
                Fault(9, Cnt + 1, Rtname);
            Pname = Fromar2(Ptr);
            Lcell->Uioj = Lcell->Uioj | Pname << 4;
            D = Lcell->Sndisp + N;
            if (Paramptype & 0x1000) {
              P = Ptr;
              do
                P += 3;
              while (A[P - 1] != 2);
              Cfplist(&Schain, &Kkk);
              Ptype = Paramptype;
              Outtype(Paramptype & 255, Kform);
              Outname(Pname);
              Outstring(_imp_str_literal("("));
              Lcell2 = &Aslist[Schain];
              if (!Kkk)
                Outstring(_imp_str_literal("void "));
              else
                for (Pcount = 1; Pcount <= Kkk; Pcount++) {
                  if (Lcell2->S1 & 0x10000000) {
                    Outtype((unsigned)Lcell2->S1 >> 16 & 255, Lcell2->Sndisp);
                    Outstring(_imp_str_literal("()"));
                  } else
                    Outxtype((unsigned)Lcell2->S1 >> 16, Lcell2->Sndisp);
                  if (Lcell2->Link) Outsym(',');
                  Lcell2 = &Aslist[Lcell2->Link];
                }
              Outstring(_imp_str_literal(")"));
              Storetag(Pname, Level, Rbase, 13, D, Lcell->Acc, Schain, 0);
            } else {
              if (Target == Emas && Ptype == 0x33) D += 8;
              if (Strvalinwa == Yes && Ptype == 0x35) Ptype = 0x435;
              Outxtype(Paramptype, Kform);
              Outname(Pname);
              Storetag(Pname, Level, Rbase, Lcell->Uioj & 15, 0, Acc, D, Kform);
              Ptype = Paramptype;
            }
            Ptr += 3;
            Cnt++;
#if (Paramsbwards == No)
              Pchain = Lcell->Link;
#endif
            if (Pchain) Outsym(',');
          } while (A[Ptr - 1] != 2);
          P = Pp;
        }
        Outstring(_imp_str_literal(") {"));
        N += Parmspace;
        N = (N + Minparamsize - 1) & (-Minparamsize);
        if (Cnt > Nparams) Fault(8, 0, Rtname);
        if (Cnt < Nparams) Fault(10, 0, Rtname);
        Ptype = Ptypep;
        if (Strresinwa == Yes) {
          if (3 == (Ptype & 0xF0F) || (Ptype & 0xF0F) == 5) N += Ptrsize[0x35];
          Currinf->Ressize = N;
        }
        N += Alpha;
        if (Target == Pnx)
          if (N & 7) Impabort();
        Rdisplay(Rtname);
      LL_Bend:;
      }
      if (!Parm.Opt) Forcetrips();
      goto Cssexit2;
    Sw_14:;
      {
        Forcetrips();
        Ptype = 0;
        if (Level == 1 && Rlevel == 0)
          if (!Parm.Cprmode) {
            Rlevel = 1;
            Rbase = 1;
            Parm.Cprmode = 1;
            Rhead(-1, Addr(Mainep), 1);
            N = Rtparam1offset + Alpha;
            Outstring(_imp_str_literal("main() {"));
          } else
            Fault(58, 0, 0);
        else {
          Setline();
          Outstring(_imp_str_literal("{"));
          Rhead(-1, 0, 1);
        }
        Rdisplay(-1);
      }
      goto Cssexit2;
    Sw_15:;
      P += 2;
      Skipexp();
      while (A[P] == 1) {
        P++;
        Skipexp();
      }
      P++;
      Outstring(_imp_str_literal("if (0) {"));
      Outsym(Nl);
      Cstart(0, 3);
      Outstring(_imp_str_literal(" }"));
      goto Cssexit;
    Sw_16:;
      {
        int Q;
        int Range;
        int Kkk;
        int Lb;
        int Ub;
        int Pp;
        int D0;
        int Ophead;
        int V;
        int R;
        int Datad;
        Rd Opnd1;
        Rd Opnd2;
        Swdataform *Swdata;
        Q = P;
        do {
          P += 3;
          while (A[P] == 1) P += 3;
          P += 4;
          Kkk = Intexp(&Lb, Minapt);
          P += 3;
          Kkk = Kkk | Intexp(&Ub, Minapt);
          Range = (Ub - Lb + 1);
          if (Range <= 0 || Kkk != 0) {
            Lb = 0;
            Ub = 10;
            Range = 1024;
          }
          Datad = Malloc(4 * Range + 8);
          Swdata = Record(Datad);
          Swdata->Lseen = 0;
          Swdata->Default = 0;
          Ptype = 0x56 + (1 << 8);
          Pp = P;
          P = Q + 1;
          do {
            K = Fromar2(P);
            P += 3;
            Ophead = 0;
            Opnd1.Ptype = Ptype;
            Opnd1.Xb = 0;
            Opnd1.Flag = Dname;
            Opnd1.D = K;
            Opnd1.Xtra = 0;
            Opnd2.Ptype = 0x61;
            Opnd2.Xb = 0;
            Opnd2.Flag = Dname;
            Opnd2.D = Lb;
            Opnd2.Xtra = Ub;
            V = Brectrip(Dclsw, Ptype, 0, &Opnd1, &Opnd2);
            Push(&Ophead, Datad, Lb, Ub);
            Storetag(K, Level, Rbase, 1, 0, 4, Ophead, 0);
            Outstring(_imp_str_literal("int "));
            Outswadname(K);
            Outstring(_imp_str_literal("_value;"));
            Outstring(_imp_str_literal("int "));
            Outswadname(K);
            Outstring(_imp_str_literal("_line;"));
            Outstring(_imp_str_literal("char *"));
            Outswadname(K);
            Outstring(_imp_str_literal("_file;"));
          } while (A[P - 1] != 2);
          Q = Pp;
          P = Q;
        } while (A[Q] != 2);
      }
      goto Cssexit2;
    Sw_17:
      goto Cssexit;
    Sw_12:;
      {
        //***********************************************************************
        //*       INITIALISED DECLARATION GO INTO THE GLA OR GLA SYMBOL TABLES  *
        //*       EXCEPT FOR CONST ARRAYS WHICH GO INTO THE CODE SYMBOL TABLES  *
        //*       STRINGS AND ARRAYS HAVE A HEADER IN THE GLA. QPUT ARRANGES    *
        //*       FOR THE LOADER TO RELOCATE THE HEADERS.                       *
        //*       EXTERNALS ARE IDENTICAL WITH OWN BUT ALSO HAVE A DATA EP DEFN *
        //*       IN THE LOAD DATA SO THEY CAN BE FOUND AT LOAD TIME            *
        //*       EXTRINSICS HAVE A DATA REFERENCE AND A DUMMY HEADER IN THE GLA*
        //*       THE LOADER USES THE FORMER TO RELOCATE THE LATTER.            *
        //***********************************************************************
        // auto void Clear(int L);
        auto void Xtractconst(int Contype, int Conprec);
        auto int Initspace(int A, int B);
        int Slength;
        int Pp;
        int Sign;
        int Tagdisp;
        int Dvo;
        int K;
        int Stalloc;
        int Spoint;
        int Tp;
        int Savep;
        int Constsfound;
        int Cprec;
        int Extrn;
        int Nnames;
        int Mark;
        int Qputp;
        int Lb;
        int Ctype;
        int Constp;
        int Format;
        int Dptype;
        int Dimen;
        int Sacc;
        int Typep;
        int Kk;
        int Orlevel;
        int Savesndisp;
        int Savekform;
        int Ii;
        Rd Copnd;
        Rd Fcopnd;
        static double Zero = 0;
        _imp_string SconstX;
        _imp_string Namtxt;
        Listf *Lcell;


        // P(OWNDEC) =(%QNAME')(VSPEC')(HOLE)(NAME)(ALIAS')(CONST')(MARK)(RESTOFOWNDEC)(S),
        //            '%ARRAY'(%FORMAT')(VSPEC')(NAME)(ALIAS')(BPAIR)(CONSTLIST);

        // P(RESTOFOWNDEC) = ','(HOLE)(NAME)(ALIAS')(CONST')(MARK)(RESTOFOWNDEC),
        //                   0;

        // *******************************************************************
        // Note that VSPEC' in the current grammar is believed to be corrupted
        // due to a missing %null terminating option.
        //
        // P(VSPEC') = '%SPEC',
        //             ;
        //
        // rather than the expected
        //
        // P(VSPEC') = '%SPEC',
        //             0;
        //
        // This may be the cause of some of the run-time errors we get when
        // attempting to compile some specific source files with imptoc.
        // *******************************************************************
                                                        
        
        Qputp = 5;
        Extrn = A[P + 1];
        P += 2;
        if (Extrn >= 4) Extrn = 0;
        Sndisp = 0;
        Constsfound = 0;
        if (!Extrn) Qputp = 4;
        Clt();
        if (A[P + 2] == 1)
          if (Extrn == 2)
            Extrn = 3;
          else
            Fault(46, 0, 0);
        if (2 <= Extrn && Extrn <= 3 &&
            ((A[P] == 1 && A[P + 1] != 3) || (A[P] == 2 && A[P + 1] != 2)))
          Fault(46, 0, 0);
        if (Type == 5 && A[P] != 1 && Extrn == 0) Extrn = 1;
        Litl = Extrn;
        if (Litl <= 1) Litl = Litl ^ 1;
        if (A[P] == 1)
          Cqn(P + 1);
        else {
          Arr = 1;
          Nam = 0;
        }
        if (Type == 5 && Nam == 0 && (Acc <= 0 || Acc > 256)) {
          Fault(70, Acc - 1, 0);
          Acc = 2;
        }
        Stalloc = Acc;
        if ((Target == Perq || Target == Accent || Target == Pnx) && Type == 5)
          Stalloc = (Stalloc + 1) & 0xFFE;
        Rout = 0;
        Pack(&Ptype);
        Dptype = Ptype;
        if (Nam)
          if (Arr)
            Stalloc = 8;
          else
            Stalloc = 4;
        else if (Arr)
          goto Nonscalar;
        P += 2;
        do {
          Mark = P + 1 + Fromar2(P + 1);
          Pp = P + 3;
          P = Pp + 2;
          K = Fromar2(Pp);
          Namtxt = *String(Addr(Worka.Lett));
          if (A[P] == 1) {
            if (!Litl) Warn(10, 0);
            *Length(Namtxt) = A[P + 1];
            for (Kk = 1; Kk <= A[P + 1]; Kk++)
              *Charno(Namtxt, Kk) = A[P + Kk + 1];
            P = P + A[P + 1] + 1;
            Outstring(_imp_str_literal("#define "));
            Outname(K);
            Outsym(' ');
            Outstring(Namtxt);
            Outsym(Nl);
          }
          P++;
          SconstX = _imp_str_literal("");
          Ptype = Dptype;
          Unpack();
          Sign = 3;
          Ctype = Type;
          Constsfound = 0;
          Cprec = Prec;
          if (Type == 3) Ctype = 1;
          if (Nam) {
            Ctype = 1;
            Cprec = 5;
          }
          P++;
          if (Rlevel == 0 && Extrn == 0) {
            Outstring(_imp_str_literal("#define "));
            Outrevisablename(K);
          } else {
            Outextern(Extrn);
            if (Ptype == 0x35)
              Outstring(_imp_str_literal("char "));
            else
              Outtype(Ptype & 255, Kform);
            if (Nam) Outsym('*');
            Outname(K);
          }
          if (Ptype == 0x35) {
            Outstring(_imp_str_literal(" ["));
            Outint(Stalloc);
            Outsym(']');
          }
          Tp = 1;
          if (A[P - 1] == 1) {
            Savep = P;
            P -= 3;
            Tp = Tsexp(&Kk);
            P = Savep;
            if (Rlevel == 0 && Extrn == 0) {
              Outstring(_imp_str_literal(" "));
              if (Tp <= 0) Outstring(_imp_str_literal("("));
            } else
              Outsym('=');
            Xtractconst(Ctype, Cprec);
          } else {
            if (!Extrn) Warn(7, K);
            Fcopnd = (Rd){0};
            Copnd = (Rd){0};
          }
          if (Rlevel == 0 && Extrn == 0) {
            if (Tp <= 0) Outsym(')');
          } else
            Outsep();
          if (A[Mark] != 2) Outsym(Nl);
          Ptype = Dptype;
          Unpack();
          J = 0;
          Orlevel = 0;
          if (Nam) {
            if (!Arr)
              if ((Target == Ibm || Target == Amdahl || Target == Ibmxa) &&
                  Extrn == 0) {
                Tagdisp = Worka.Constptr;
                if (Type == 5) {
                  Ctable[Tagdisp] = Acc;
                  Worka.Constptr = Worka.Constptr + 1;
                }
                Ctable[Worka.Constptr] = Fcopnd.D;
                Worka.Constptr = Worka.Constptr + 1;
                if (Worka.Constptr > Worka.Constlimit)
                  Fault(102, Worka.Wkfilek, 0);
                Tagdisp = 4 * Tagdisp;
                Orlevel = 14;
              } else
                Tagdisp = Pinitown(Ptype, Acc, &Fcopnd, &Namtxt);
            else {
              if (Parm.Compiler != 0 && Lb != 0) Fault(99, 0, 0);
              if (Extrn) {
                Sndisp = 0;
                J = 0;
              } else {
                J = 1;
                Sndisp = (unsigned)(Sndisp & 0x3FFFF) >> 2;
              }
              Tagdisp = Pownarrayhead(Ptype, J, Lb, 0xFFFFFF, Copnd.D, 0, Dvo,
                                      Namtxt);
            }
            Storetag(K, Level, Orlevel, J, Sndisp, Acc, Tagdisp, Kform);
            P = Mark;
            continue;
          }
          if (Extrn == 3) {
            Fcopnd.D = 0;
            Tagdisp = Pinitown(Ptype, Acc, &Fcopnd, &Namtxt);
            Storetag(K, Level, 0, J, Sndisp, Acc, Tagdisp, Kform);
            P = Mark;
            continue;
          }
          if (Type == 3) Tagdisp = Pinitown(Ptype, Acc, &Fcopnd, &Namtxt);
          if (1 << Type & 0b100110)
            if (Extrn)
              Tagdisp = Pinitown(Ptype, Acc, &Fcopnd, &Namtxt);
            else
              Tagdisp = 0;
          Storetag(K, Level, 0, J, Sndisp, Acc, Tagdisp, Kform);
          if (Extrn == 0 && 0 == Nam && (1 << Type & 0b100110) != 0) {
            Lcell = &Aslist[Tags[K]];
            Lcell->S1 = Lcell->S1 | (Copnd.Ptype & 8) << 16;
            Lcell->S2 = Copnd.D;
            Lcell->S3 = Copnd.Xtra;
            if (Type == 5) {
              Lcell->S2 = Worka.Artop;
              Worka.Artop = (Worka.Artop + Copnd.Xtra + 4) & (-4);
            }
          }
          P = Mark;
        } while (A[Mark] != 2);
        goto LLL_Bend;
      Nonscalar:;
        P++;
        Format = 2 - A[P];
        if (Format) {
          Arr = 3;
          Pack(&Ptype);
        }
        Pp = P + 2;
        P += 4;
        Nnames = 1;
        K = Fromar2(Pp);
        Namtxt = *String(Addr(Worka.Lett));
        if (A[P] == 1) {
          if (!Litl) Warn(10, 0);
          *Length(Namtxt) = A[P + 1];
          for (Kk = 1; Kk <= A[P + 1]; Kk++)
            *Charno(Namtxt, Kk) = A[P + Kk + 1];
          P = P + A[P + 1] + 1;
        }
        P++;
        Sacc = Acc;
        Typep = Ptype;
        Savekform = Kform;
        Dvo = Dopevector(No, Type, Stalloc, 0, K);
        if (Sndisp == -1) Sndisp = 0;
        Sndisp = (unsigned)(Sndisp & 0x3FFFF) >> 2;
        Savesndisp = Sndisp;
        Dimen = J;
        Acc = Sacc;
        Ptype = Typep;
        Unpack();
        Pp = P;
        {
          short Savedp;
          short Savedp2;
          short Savedptype;
          int I;
          int Count;
          Count = 0;
          if (!Format) {
            Savedptype = Ptype & 255;
            Outextern(Extrn);
            Outtype(Savedptype, Savekform);
            for (Ii = Dimen; Ii >= 1; Ii--) {
              for (I = 1; I <= Ii; I++) Outsym('*');
              Outname(K);
              if (Ii != Dimen) {
                Outsym('_');
                Outint(Ii);
              }
              if (Ii != 1) Outsym(',');
            }
            Outsym(';');
            Outsym(Nl);
            Outextern(Extrn);
            Outstring(_imp_str_literal("int "));
            for (Ii = Dimen; Ii >= 1; Ii--) {
              Outname(K);
              Outstring(_imp_str_literal("_dim_"));
              Outint(Ii);
              if (Ii != 1) Outsym(',');
            }
            Outsym(';');
            Outsym(Nl);
            for (Ii = Dimen; Ii >= 1; Ii--) {
              Outname(K);
              if (Ii != Dimen) {
                Outsym('_');
                Outint(Ii);
              }
              P = Ctable[Savesndisp + 3 * Ii + 2];
              Savedp = P;
              Outstring(_imp_str_literal(" = ("));
              Outtype(Savedptype, Savekform);
              for (I = 1; I <= Ii; I++) Outsym('*');
              Outstring(_imp_str_literal(")malloc((("));
              Csexp(0x51);
              Outsym(')');
              if (Ctable[Savesndisp + 3 * Ii] == 0x80000000) {
                Outsym('-');
                P = Ctable[Savesndisp + 3 * Ii + 1];
                Outsym('(');
                Csexp(0x51);
                Outstring(_imp_str_literal(")+1"));
              } else if (Ctable[Savesndisp + 3 * Ii] < 1) {
                Outsym('+');
                Outint(1 - Ctable[Savesndisp + 3 * Ii]);
              } else if (Ctable[Savesndisp + 3 * Ii] > 1) {
                Outsym('-');
                Outint(Ctable[Savesndisp + 3 * Ii] - 1);
              }
              Outstring(_imp_str_literal(") * sizeof("));
              Outtype(Savedptype, Savekform);
              for (I = 1; I <= Ii - 1; I++) Outsym('*');
              Outstring(_imp_str_literal(") );"));
              Outsym(Nl);
              if (Ctable[Savesndisp + 3 * Ii] == 0x80000000) {
                Outname(K);
                if (Ii != Dimen) {
                  Outsym('_');
                  Outint(Ii);
                }
                Outstring(_imp_str_literal(" -= "));
                P = Ctable[Savesndisp + 3 * Ii + 1];
                Csexp(0x51);
              } else if (Ctable[Savesndisp + 3 * Ii]) {
                Outname(K);
                if (Ii != Dimen) {
                  Outsym('_');
                  Outint(Ii);
                }
                Outstring(_imp_str_literal(" -= "));
                Outint(Ctable[Savesndisp + 3 * Ii]);
              }
              Outsym(';');
              Outsym(Nl);
              Outstring(_imp_str_literal("for ("));
              Outname(K);
              Outstring(_imp_str_literal("_dim_"));
              Outint(Ii);
              Outstring(_imp_str_literal(" = "));
              if (Ctable[Savesndisp + 3 * Ii] == 0x80000000) {
                P = Ctable[Savesndisp + 3 * Ii + 1];
                Csexp(0x51);
              } else if (Ctable[Savesndisp + 3 * Ii])
                Outint(Ctable[Savesndisp + 3 * Ii]);
              else
                Outint(0);
              Outstring(_imp_str_literal("; "));
              Outname(K);
              Outstring(_imp_str_literal("_dim_"));
              Outint(Ii);
              Outstring(_imp_str_literal(" <= "));
              Csexp(0x51);
              Outstring(_imp_str_literal("; "));
              Outname(K);
              Outstring(_imp_str_literal("_dim_"));
              Outint(Ii);
              Outstring(_imp_str_literal("++) {"));
              Outsym(Nl);
            }
            for (Ii = 1; Ii <= Dimen; Ii++) {
              if (Ii != 1) {
                Outname(K);
                if (Ii != Dimen) {
                  Outsym('_');
                  Outint(Ii);
                }
                Outstring(_imp_str_literal("["));
                Outname(K);
                Outstring(_imp_str_literal("_dim_"));
                Outint(Ii);
                Outstring(_imp_str_literal("] = "));
                Outname(K);
                Outsym('_');
                Outint(Ii - 1);
                Outstring(_imp_str_literal(";"));
                Outsym(Nl);
              } else {
                Outstring(_imp_str_literal(
                    "/* Assign initialised elements if any */"));
                Outsym(Nl);
              }
              Outsym('}');
              Outsym(Nl);
            }
            Outsym('{');
            Outsym(Nl);
            Outextern(Extrn);
            Outtype(Savedptype, Savekform);
            Outname(K);
            Outstring(_imp_str_literal("_data[] "));
          }
          Ptype = Typep;
          Unpack();
          if (Lb == 0 && Format == 0) {
            Arr = 2;
            Pack(&Ptype);
          }
          if (Type == 3)
            Slength = Qq;
          else
            Slength = Qq / Stalloc;
          Cas[Qputp] = (Cas[Qputp] + Arrayrounding) & (~Arrayrounding);
          Spoint = Cas[Qputp];
          if (!Format)
            if (A[Pp] == 1) {
              P = Pp + 1;
              Count = Initspace(Qq, Slength);
            }
          if (!Format) Outsep();
          if (Extrn == 3) Spoint = 0;
          Ptype = Typep;
          Unpack();
          if (Format) Qputp = 0;
          Tagdisp =
              Pownarrayhead(Ptype, Dimen, Lb, Qq, Spoint, Qputp, Dvo, Namtxt);
          Sndisp = Savesndisp;
          Storetag(K, Level, 0, Dimen, Sndisp, Acc, Tagdisp, Savekform);
          Outsym(Nl);
          Outstring(_imp_str_literal("int "));
          Outname(K);
          Outstring(_imp_str_literal("_inels = 0;"));
          Outsym(Nl);
          Acc = Sacc;
          Ptype = Typep;
          Unpack();
          Pp = P;
          for (Ii = Dimen; Ii >= 1; Ii--) {
            P = Ctable[Savesndisp + 3 * Ii + 2];
            Outstring(_imp_str_literal("for ("));
            Outname(K);
            Outstring(_imp_str_literal("_dim_"));
            Outint(Ii);
            Outstring(_imp_str_literal(" = "));
            Savedp = P;
            if (Ctable[Savesndisp + 3 * Ii] == 0x80000000) {
              P = Ctable[Savesndisp + 3 * Ii + 1];
              Csexp(0x51);
            } else if (Ctable[Savesndisp + 3 * Ii])
              Outint(Ctable[Savesndisp + 3 * Ii]);
            else
              Outint(0);
            Outstring(_imp_str_literal("; "));
            Outname(K);
            Outstring(_imp_str_literal("_dim_"));
            Outint(Ii);
            Outstring(_imp_str_literal(" <= "));
            P = Savedp;
            Csexp(0x51);
            Outstring(_imp_str_literal("; "));
            Outname(K);
            Outstring(_imp_str_literal("_dim_"));
            Outint(Ii);
            Outstring(_imp_str_literal("++) {"));
            Outsym(Nl);
            Outstring(_imp_str_literal("if ("));
            Outname(K);
            Outstring(_imp_str_literal("_inels == "));
            Outint(Count);
            Outstring(_imp_str_literal(") break;"));
            Outsym(Nl);
            if (Ctable[Savesndisp + 3 * Ii] == 0x80000000) {
              P = Ctable[Savesndisp + 3 * Ii + 1];
            }
          }
          Outname(K);
          for (Ii = Dimen; Ii >= 1; Ii--) {
            Outstring(_imp_str_literal("["));
            Outname(K);
            Outstring(_imp_str_literal("_dim_"));
            Outint(Ii);
            Outstring(_imp_str_literal("]"));
          }
          Outstring(_imp_str_literal(" = "));
          Outname(K);
          Outstring(_imp_str_literal("_data["));
          Outname(K);
          Outstring(_imp_str_literal("_inels++];"));
          Outsym(Nl);
          for (Ii = Dimen; Ii >= 1; Ii--) {
            Outstring(_imp_str_literal("}"));
            Outsym(Nl);
          }
          Outsym('}');
          Outsym(Nl);
        }
        goto LLL_Bend;
        int Initspace(int Size, int Nels) {
          #define Bufsize (512)
          int Rf;
          int I;
          int Ii;
          int Elsize;
          int Ad;
          int Spp;
          int Slength;
          int Writ;
          int Pin;
          int Pp;
          int Contype;
          int Conprec;
          int Ppp;
          int Value;
          int Nelsout;
          Nelsout = 0;
          Pin = P;
          Contype = Type;
          Conprec = Prec;
          Outstring(_imp_str_literal(" = {"));
          Spp = 0;
          Writ = 0;
          do {
            P -= 3;
            Pp = P;
            Skipexp();
            if (A[P] == 1) {
              P += 2;
              if (A[P - 1] == 2) {
                Rf = 1;
                if (A[Pp + 3] != 4 || A[Pp + 4] != 2 || A[Pp + 5] != 0x41 ||
                    A[Pp + 6] != A[Pp + 7] || A[Pp + 7] != 0 || A[Pp + 8] != 2)
                  Warn(10, 0);
              } else {
                P += 2;
                if (Intexp(&Rf, Minapt)) {
                  Warn(10, 0);
                  Rf = 1;
                }
              }
              P++;
            } else {
              Rf = 1;
              P += 2;
            }
            Nelsout += Rf;
            if (Rf <= 0) Warn(10, 0);
            Spp = P;
            for (I = Rf; I >= 1; I--) {
              P = Pp;
              if (Contype == 5)
                Cstrexp(1);
              else
                Csexp(Conprec << 4 | Contype);
              Constsfound++;
              if (I != 1 || A[Spp - 1] != 2) Outsym(',');
              if ((Contype == 5 && (Constsfound & 3) == 0) ||
                  (Constsfound & 7) == 0)
                Outsym(Nl);
            }
            P = Spp;
          } while (A[P - 1] != 2);
          Outstring(_imp_str_literal("}"));
          return (Nelsout);
        }
        void Xtractconst(int Contype, int Conprec) {
          int Slength;
          int Stype;
          int Sacc;
          int Mode;
          int Ch;
          int Wr;
          int I;
          int Pp;
          Stype = Ptype;
          Sacc = Acc;
          if (Contype == 5) {
            P -= 3;
            Cstrexp(1);
            Wr = Worka.Artop;
            if (Expopnd.Flag == Lconst && Expopnd.Ptype == 0x35) {
              Slength = Expopnd.Xtra;
              *Length(SconstX) = Slength;
              A[Wr] = Slength;
              for (I = 1; I <= Slength; I++) {
                Ch = A[Expopnd.D + I];
                *Charno(SconstX, I) = Ch;
                A[Wr + I] = Ch;
              }
              Copnd.Ptype = 0x35;
              Copnd.Flag = Lconst;
              Copnd.D = Expopnd.D;
              Copnd.Xtra = Slength;
            } else {
              Fault(44, Constsfound, K);
              SconstX = _imp_str_literal("");
              Slength = 0;
            }
          } else {
            Mode = Conprec << 4 | Contype;
            if (Conprec < 5) Mode = Contype | 0x50;
            Pp = P;
            P -= 3;
            Csexp(Mode);
            P = Pp;
            I = Constexp(Mode);
            Copnd = Expopnd;
            Copnd.Ptype = Mode;
          }
          Ptype = Stype;
          Unpack();
          Acc = Sacc;
          Fcopnd = Copnd;
        }
      LLL_Bend:;
      }
      goto Cssexit2;
    Sw_10:;
      {
        int Name;
        int Ophead;
        int Opbot;
        int Nlist;
        int Headcell;
        int Fhead;
        int Spec;
        int L1;
        int L2;
        int Strid;
        int Fpt;
        Listf *Lcell;
        Listf *Frcell;
        _imp_string Typename;
        Sndisp = 0;
        Spec = A[P + 1];
        Name = Fromar2(P + 2);
        P += 4;
        Copytag(Name, No);
        if (Spec == 1 || (Ptype != 4 || J != 15 || Oldi != Level)) {
          Kform = 0;
          Push(&Kform, 0, 0, 0);
          Ptype = 4;
          Storetag(Name, Level, Rbase, 15, 0, Maxrecsize, Kform, Kform);
        }
        if (Spec == 2) {
          Ophead = 0;
          Opbot = 0;
          Nlist = 0;
          for (L1 = 0; L1 <= 12; L1++) {
            for (L2 = 0; L2 <= 12; L2++) {
              Rfhead[L1][L2] = 0;
              Rfbot[L1][L2] = 0;
            }
            Rfalt[L1] = 0;
          }
          Inaformat = 1;
          Rflevel = 0;
          Crformat(Rflevel);
          Inaformat = 0;
          if (Parm.Z)
            for (L1 = 0; L1 <= 12; L1++)
              for (L2 = 0; L2 <= 12; L2++)
                if (Rfhead[L1][L2]) {
                  Printstring(_imp_str_literal("level&rfalt="));
                  Write(L1, 5);
                  Write(L2, 5);
                  Newline();
                  Printlist(Rfhead[L1][L2]);
                }
          Strid = 0;
          Headcell = Rfhead[0][1];
          if (!Headcell) {
            Outstring(_imp_str_literal("struct "));
            Outname(Name);
            Outsym('{');
            Outsym(Nl);
            Processformat(0, 0, 's', 0, &Strid, &Ophead, &Opbot);
            Fpt = 4;
          } else {
            Outstring(_imp_str_literal("union "));
            Outname(Name);
            Outsym('{');
            Outsym(Nl);
            Processformat(0, 0, 'u', 0, &Strid, &Ophead, &Opbot);
            Fpt = 0x14;
          }
          Outsym('}');
          Outsym(';');
          Outsym(Nl);
          if (Parm.Z) {
            Printstring(_imp_str_literal("after processing"));
            Printlist(Ophead);
          }
          if (Possibletypename(Name, &Typename)) {
            Outsym(Nl);
            Outstring(_imp_str_literal("typedef "));
            if (!Headcell)
              Outstring(_imp_str_literal("struct "));
            else
              Outstring(_imp_str_literal("union "));
            Outname(Name);
            Outstring(_imp_join(_imp_str_literal(" "),
                                _imp_join(Typename, _imp_str_literal(";"))));
            Outsym(Nl);
          }
          Clearlist(&Nlist);
          Lcell = &Aslist[Tags[Name]];
          Kform = Lcell->Kform;
          if (Parm.Z) {
            Printstring(_imp_str_literal("before throwing dummy cell"));
            Printlist(Kform);
          }
          Pop(&Kform, &I, &I, &Fhead);
          Fhead = Ophead;
          while (Fhead > 0) {
            Frcell = &Aslist[Fhead];
            if (Frcell->Ptype == 0x433 && Frcell->Kform == Lcell->Kform) {
              Frcell->Uioj = Frcell->Uioj & 0xFFFFFFF0;
              Frcell->Acc = Acc;
              Frcell->Kform = Ophead;
            }
            Fhead = Frcell->Link;
          }
          Lcell->Uioj = Lcell->Uioj & 0xFFFFFFF0;
          Lcell->Acc = Acc;
          Lcell->Slink = Name;
          Lcell->Ptype = Fpt;
          Lcell->Kform = Ophead;
          if (Parm.Z) {
            Printstring(_imp_str_literal("after processing self refs"));
            Printlist(Ophead);
          }
        }
      }
      goto Cssexit2;
    Sw_19:;
      Outstring(_imp_str_literal("***Untranslateable stmnt***"));
      I = Curlinead;
      while (I < Nextlinead) {
        Outsym(*Byteinteger(I));
        I++;
      }
      goto Cssexit;
    Sw_20:;
      if (Parm.Arr == 0 && Parm.Chk == 0) Parm.Compiler = 1;
      goto Cssexit;
    Sw_21:;
      Kk = Fromar2(P + 1);
      if (Parm.Cprmode) Fault(97, 0, 0);
      Mainep = *String(Addr(Worka.Lett));
      goto Cssexit;
      int Cformatref(void) {
        int Fnam;
        int Ophead;
        int Opbot;
        int Nhead;
        int Mrl;
        Listf *Lcell;
        if (A[P] == 1) {
          Fnam = Fromar2(P + 1);
          P += 3;
          Copytag(Fnam, No);
          if (3 <= Type && Type <= 4) return (Kform);
          if (Inaformat != 0 && Oldi != Level) {
            Ptype = 4;
            Acc = Maxrecsize;
            Push(&Kform, 0, 0, 0);
            Storetag(Fnam, Level, Rbase, 15, 0, Maxrecsize, Kform, Kform);
            return (Kform);
          }
          Fault(62, 0, Fnam);
          Acc = 8;
          return (Dummyformat);
        }
        P++;
        Ophead = 0;
        Opbot = 0;
        Outstring(_imp_str_literal("*** imp construction too difficult***"));
        return (Ophead);
      }
      void Crformat(int Myrflevel) {
        int D1;
        int D2;
        int Form;
        int Rl;
        int Stalloc;
        int Inc;
        int Q;
        int R;
        int Rfd;
        int Lb;
        int Typep;
        int Sacc;
        int Dvo;
        auto void Sn(int Q);
        auto void Round(void);
        Form = 0;
        Acc = 0;
        Inc = 0;
        do {
          Rout = 0;
          Litl = 0;
          Nam = 0;
          Rfd = A[P];
          P++;
          if (Rfd == 1) {
            Clt();
            Form = Kform;
            Stalloc = Acc;
            P++;
            if (A[P - 1] == 1) {
              Form = Kform;
              Cqn(P);
              P++;
              Pack(&Ptype);
              D2 = 0;
              Rl = Roundinglength(Ptype, 0);
              if (Nam == 1) {
                Stalloc = Ptrsize[Prec << 4 | Type];
                Rl = Ptrrounding[Ptype & 127];
                if (Arr) {
                  Stalloc = Aheadsize;
                  Rl = Roundinglength(Aheadpt, 0);
                }
              }
              if (Type == 5 && Stalloc == 0) Fault(70, 0, 0);
              Round();
              J = 0;
              do {
                D1 = 0;
                Sn(P);
                P += 3;
                Inc += Stalloc;
              } while (A[P - 1] != 2);
            } else {
              Q = P + 1;
              Arr = 1;
              Pack(&Ptype);
              do {
                P = Q;
                do
                  P += 3;
                while (A[P - 1] != 2);
                Typep = Ptype;
                Sacc = Acc;
                D2 = (unsigned)Dopevector(No, Typep & 7, Acc, 0, Fromar2(Q)) >>
                     2;
                Acc = Sacc;
                Ptype = Typep;
                Unpack();
                Rl = Roundinglength(Ptype & 255, 0);
                if (Rl < Arrayinrecrounding) Rl = Arrayinrecrounding;
                do {
                  Round();
                  D1 = 0;
                  Sn(Q);
                  Q += 3;
                } while (A[Q - 1] != 2);
                P++;
                Q = P + 1;
              } while (A[P - 1] != 2);
            }
          } else {
            Rflevel++;
            Binsert(&Rfhead[Myrflevel][Rfalt[Myrflevel]], &Rfbot[Myrflevel][Rfalt[Myrflevel]], 0,
                    Rflevel, 0);
            Crformat(Rflevel);
            Inc = Acc;
          }
          P++;
        } while (A[P - 1] != 2);
        if (A[P] == 1) {
          P++;
          Rfalt[Myrflevel]++;
          Crformat(Myrflevel);
          if (Acc > Inc) Inc = Acc;
        } else
          P++;
        Acc = Inc;
        return;
        void Sn(int Q) {
          Tagf Cell;
          Fname = Fromar2(Q);
          if (Aslist[Tags[Fname]].Ptype == 0x4051) Warn(11, 0);
          Cell.Ptype = Ptype;
          Cell.Uioj = Fname << 4 | J;
          Cell.Acc = Acc;
          Cell.Sndisp = D2 & 0xFFFF;
          Cell.Slink = D1 & 0xFFFF;
          Cell.Kform = Form;
          Binsert(&Rfhead[Myrflevel][Rfalt[Myrflevel]], &Rfbot[Myrflevel][Rfalt[Myrflevel]], Cell.S1,
                  Cell.S2, Cell.S3);
        }
        void Round(void) {}
      }
      void Outfmtcell(Listf * Lcell) {
        int Pt;
        int Name;
        int Dvdisp;
        int Nd;
        int Ii;
        Listf *Fcell;
        Pt = (unsigned)Lcell->S1 >> 16;
        Name = (unsigned)Lcell->S1 >> 4 & 0xFFF;
        if ((Pt & 0xcff) == 0x35) {
          Outstring(_imp_str_literal("char "));
          Outname(Name);
        } else {
          Outxtype(Pt & 0xcff, Lcell->Kform);
          Outname(Name);
        }
        if (Pt & 0x300) {
          Nd = Lcell->S1 & 15;
          Dvdisp = Lcell->Sndisp;
          for (Ii = Nd; Ii >= 1; Ii--) {
            P = Ctable[Dvdisp + 3 * Ii + 2];
            Outstring(_imp_str_literal(" ["));
            Csexp(0x51);
            if (Ctable[Dvdisp + 3 * Ii] == 0x80000000) {
              Outsym('-');
              P = Ctable[Dvdisp + 3 * Ii + 1];
              Outsym('(');
              Csexp(0x51);
              Outstring(_imp_str_literal(")+1"));
            } else if (Ctable[Dvdisp + 3 * Ii] < 1) {
              Outsym('+');
              Outint(1 - Ctable[Dvdisp + 3 * Ii]);
            } else if (Ctable[Dvdisp + 3 * Ii] > 1) {
              Outsym('-');
              Outint(Ctable[Dvdisp + 3 * Ii] - 1);
            }
            Outsym(']');
          }
        }
        if ((Pt & 0xcff) == 0x35) {
          Outsym('[');
          Outint(Lcell->Acc);
          Outsym(']');
        }
        Outsep();
        Outsym(Nl);
      }
      void Processformat(int Level, int Alt, int Structorunion, int Intid,
                         int *Strid, int *Ophead, int *Opbot) {
        Listf Lcell;
        int I;
        int J;
        int K;
        int Newid;
        int Lstrid;
        if (Structorunion == 's')
          while (Rfhead[Level][Alt]) {
            Pop(&Rfhead[Level][Alt], &Lcell.S1, &Lcell.S2, &Lcell.S3);
            if (Lcell.S1) {
              Outfmtcell(&Lcell);
              Lcell.Slink = Intid;
              Binsert(Ophead, Opbot, Lcell.S1, Lcell.S2, Lcell.S3);
            } else {
              Newid = Intid << 4 | (Lcell.S2);
              Outstring(_imp_str_literal("union {"));
              Outsym(Nl);
              Processformat(Lcell.S2, 0, 'u', Newid, Strid, Ophead, Opbot);
              Outstring(_imp_str_literal("} u"));
              Outint(Lcell.S2 - 1);
              Outsym(';');
              Outsym(Nl);
            }
          }
        else
          for (I = Alt; I <= Rfalt[Level]; I++)
            if (Rfhead[Level][I] == Rfbot[Level][I]) {
              Pop(&Rfhead[Level][I], &Lcell.S1, &Lcell.S2, &Lcell.S3);
              if (Lcell.S1) {
                Outfmtcell(&Lcell);
                Lcell.Slink = Intid;
                Binsert(Ophead, Opbot, Lcell.S1, Lcell.S2, Lcell.S3);
              } else {
                Newid = Intid << 4 | (Lcell.S2);
                Outstring(_imp_str_literal("union {"));
                Outsym(Nl);
                Processformat(Lcell.S2, 0, 'u', Newid, Strid, Ophead, Opbot);
                Outstring(_imp_str_literal("} u"));
                Outint(Lcell.S2 - 1);
                Outsym(';');
                Outsym(Nl);
              }
            } else {
              Lstrid = *Strid;
              *Strid = *Strid + 1;
              Newid = Intid << 4 | 8 | Lstrid;
              Outstring(_imp_str_literal("struct {"));
              Outsym(Nl);
              Processformat(Level, I, 's', Newid, Strid, Ophead, Opbot);
              Outstring(_imp_str_literal("} s"));
              Outint(Lstrid);
              Outsym(';');
              Outsym(Nl);
            }
      }
      int Displacement(int Link) {
        Listf *Fcell;
        Listf *Pcell;
        Listf *Lcell;
        Tagf Topnd;
        int Rr;
        int Ii;
        int Ename;
        int Cell;
        Ename = (A[P] << 8) + A[P + 1];
        Cell = 0;
        if (Link) {
          Fcell = &Aslist[Link];
          Cell = Link;
          Ii = -1;
          Acc = -1;
          while (Link > 0) {
            Lcell = &Aslist[Link];
            if ((unsigned)Lcell->Uioj << 16 >> 20 == Ename) {
              Tcell = Link;
              Sndisp = Lcell->Sndisp;
              K = Lcell->Slink;
              J = Lcell->Uioj & 15;
              Ptype = Lcell->Ptype;
              Acc = Lcell->Acc & 0xFFFF;
              Sndisp = Lcell->Sndisp;
              Kform = Lcell->Kform;
              if (Link != Cell) {
                Pcell->Link = Lcell->Link;
                Lcell->Link = Fcell->Link;
                Fcell->Link = Link;
              }
              return (K);
            }
            Pcell = Lcell;
            Link = Lcell->Link;
          }
        }
        Fault(65, 0, Ename);
        if (Cell > 0) {
          Topnd.Ptype = 0x51;
          Topnd.Uioj = Ename << 4;
          Push(&Aslist[Cell].Link, Topnd.S1, 0, 0);
        }
        Ptype = 0x51;
        Tcell = 0;
        Unpack();
        return (-1);
      }
      int Copyrecordtag(int *Subs) {
        int Q;
        int Fname;
        *Subs = 0;
        do {
          Fname = Kform;
          P += 2;
          Skipapp();
          if (A[P] == 2 || Fname <= 0) return (0);
          *Subs = *Subs + 1;
          P++;
          Q = Displacement(Fname);
          Unpack();
        } while (Type == 3);
        return (Q + 1);
      }
      int Chkrecalign(int P1) {
        int Cell;
        int I;
        auto int Scan(int Cell);
        P = P1;
        Reducetag(No);
        Cell = Kform;
        return (Scan(Cell));
        int Scan(int Cell) {
          int J;
          while (Cell) {
            I = (unsigned)Aslist[Cell].Ptype >> 4 & 7;
            if (I >= 5) return (I);
            if (Aslist[Cell].Ptype == 0x33) {
              I = Scan(Aslist[Cell].Kform);
              if (I >= 5) return (I);
            }
            Cell = Aslist[Cell].Link;
          }
          return (0);
        }
      }
      void Crname(int Z, int Mode, int Bs, int Dp, int *Namep) {
        int Depth;
        int Fname;
        int Emname;
        auto void Cename(int Mode, int Fname, int Bs, int Dp, int Xd);
        Rd Hdopnd;
        Hdopnd = (Rd){0};
        Depth = 0;
        Emname = *Namep & 0xFFFF;
        Fname = Kform;
        if (Arr == 0 || (6 <= Z && Z <= 7 && A[P + 2] == 2)) {
          if (A[P + 2] == 2)
            P += 3;
          else
            Noapp();
          Cename(Mode, Fname, Bs, Dp, 0);
        } else {
          Hdopnd.Ptype = Aheadpt;
          Hdopnd.Flag = Localir;
          Hdopnd.D = Bs << 16 | Dp;
          Caname(Z, Arr, &Hdopnd);
          *Namep = -1;
          Cename(Access, Fname, Base, Disp, 0);
        }
        return;
        void Cename(int Mode, int Fname, int Bs, int Dp, int Xd) {
          auto void Fetchrad(void);
          int Q;
          int Qq;
          int D;
          int C;
          int Tr;
          int Ename;
          int Rptype;
          int Eptype;
          Rd Radopnd;
          Rd Opnd1;
          Listf *Lcell;
          Depth++;
          Rptype = Ptype;
          if (A[P] == 2) {
            Access = Mode;
            Xdisp = Xd;
            Base = Bs;
            Disp = Dp;
            if (Z < 14)
              if ((3 > Z || Z > 4) && Z != 6 && Z != 7) {
                Fault(64, 0, Emname);
                Base = Rbase;
                Disp = 0;
                Access = 0;
                Ptype = 0x51;
                Unpack();
              }
            return;
          }
          P++;
          Q = Displacement(Fname);
          Eptype = Ptype;
          Unpack();
          Ename = A[P] << 8 | A[P + 1];
          *Namep = Ename << 16 | *Namep;
          if ((Rptype & 0xf00) == 0x400)
            Outstring(_imp_str_literal("->"));
          else
            Outstring(_imp_str_literal("."));
          Outinternames(Q);
          Outname(Ename);
          if (Arr == 1) goto Ae;
          if (A[P + 2] == 2)
            P += 3;
          else
            Noapp();
          if (Type <= 2 || Type == 5 ||
              (Type == 3 && A[P] == 2 &&
               (3 <= Z && Z <= 4 || 6 <= Z && Z <= 7))) {
            Access = Mode + 4 + 4 * Nam;
            Base = Bs;
            Disp = Dp;
            Xdisp = Xd + Q;
            return;
          }
          Xd += Q;
          *Namep = *Namep | 0xFFFF0000;
          if (Nam == 1) {
            Mode += 4;
            Fetchrad();
            Expopnd = Radopnd;
            Mode = 3;
            Dp = 0;
            Xd = 0;
            Bs = 0;
            *Namep = -1;
          }
          Cename(Mode, Kform, Bs, Dp, Xd);
          return;
        Ae:;
          Lcell = &Aslist[Tcell];
          Acc = Lcell->Acc & 0xFFFF;
          Sndisp = Lcell->Sndisp & 0xFFFF;
          Kform = Lcell->Kform;
          K = Lcell->Slink & 0xffff;
          C = Acc;
          D = Sndisp;
          Q = K;
          Qq = Kform;
          if ((Z == 6 || Z >= 11) && A[P + 2] == 2) {
            P += 3;
            if (Nam == 1) {
              Access = Mode + 8;
              Base = Bs;
              Disp = Dp;
              Xdisp = Xd + Q;
              Ptype = Aheadpt;
              Nameop(6, 8, *Namep);
              return;
            }
            Fetchrad();
            *Namep = -1;
            Opnd1 = (Rd){0};
            Opnd1.Ptype = Aheadpt;
            Opnd1.Flag = Localir;
            Opnd1.D = Q;
            Nameopnd.D = Createah(1, &Radopnd, &Opnd1);
            Nameopnd.Ptype = Aheadpt;
            Nameopnd.Flag = Reftrip;
            Nameopnd.Xtra = 0;
          } else {
            if (Nam == 1) {
              Xd += Q;
              Access = Mode + 8;
              Base = Bs;
              Disp = Dp;
              Xdisp = Xd;
              Nameop(6, Aheadsize, *Namep);
              Opnd1 = Nameopnd;
              Opnd1.Ptype = Aheadpt;
              Ptype = Lcell->Ptype;
              Unpack();
              Caname(Z, 3, &Opnd1);
              Xd = 0;
            } else {
              Fetchrad();
              Opnd1 = (Rd){0};
              Opnd1.Ptype = Aheadpt;
              Opnd1.Flag = Localir;
              Opnd1.D = Q;
              Caname(Z, 3, &Opnd1);
              Tr = 0;
              Expopnd.Flag = Reftrip;
              Expopnd.D = Tr;
              Xd = 0;
            }
            *Namep = -1;
            Xdisp = Xd;
            if (Type == 3) {
              Cename(Access, Qq, Base, Disp, Xd);
              C = Acc;
            } else if (Z >= 11)
              Fault(17, 0, Ename);
          }
          Acc = C;
          return;
          void Fetchrad(void) {
            Access = Mode + 4;
            Base = Bs;
            Disp = Dp;
            Xdisp = Xd;
            Ptype = Rptype;
            Unpack();
            Nameop(4, 4, *Namep);
            Ptype = Eptype;
            Unpack();
            Radopnd = Nameopnd;
          }
        }
      }
      void Cstrexp(int Mode) {
        int Pp;
        int Wkarea;
        int Dots;
        int Err;
        int Keepwa;
        int Fnam;
        int I;
        int Endflag;
        int Firsttrip;
        int Trip;
        Rd Opnd1;
        Rd Opnd2;
        Rd Opnd3;
        auto int Strop(Rd * Opnd);
        Keepwa = Mode & 16;
        Mode = Mode & 15;
        Opnd1 = (Rd){0};
        Opnd1.Ptype = 0x35;
        Opnd1.Flag = Localir;
        Opnd1.Xtra = 268;
        Pp = P;
        Stringl = 0;
        Fnam = 0;
        Wkarea = 0;
        P += 3;
        Err = 72;
        if (A[P] != 4) goto Error;
        P++;
        Dots = 0;
        Endflag = 0;
        Stringl = 0;
        Err = Strop(&Opnd2);
        if (Strresinwa == No && (Ptype & 0x1000) != 0) Mode = 1;
        if (Err) goto Error;
      Next:
        if (A[P] == 2)
          Endflag = 1;
        else {
          if (A[P + 1] != Concop) {
            Err = 72;
            goto Error;
          }
          P += 2;
          if (Dots == 0 && Opnd2.Flag == Lconst) {
            Err = Strop(&Opnd3);
            if (Err) goto Error;
          } else
            Opnd3.Flag = 255;
        }
        if (Endflag == 0 && Opnd2.Flag == Lconst && Lconst == Opnd3.Flag &&
            Mode == 1) {
          I = Concat;
          Ctop(&I, &Err, 0, &Opnd2, &Opnd3);
          if (!I) goto Next;
        }
        if (!Dots) {
          if (Endflag) {
            Outopnd(&Opnd2, 0);
            Opnd1 = Opnd2;
            goto Tidy;
          }
          Firsttrip = Brectrip(Precc, 0x35, 0, &Opnd1, &Opnd2);
          Opnd1.Flag = Reftrip;
          Opnd1.D = Firsttrip;
          Dots++;
        }
        if (!Endflag) {
          if (Opnd3.Flag == 255) {
            Err = Strop(&Opnd3);
            if (Err) goto Error;
          }
          Opnd1.D = Brectrip(Concat, 0x35, 0, &Opnd1, &Opnd3);
          Dots++;
          goto Next;
        }
        for (I = 2; I <= Dots; I++) Outstring(_imp_str_literal("imp_concat("));
        Trip = Firsttrip;
        while (Trip) {
          Outopnd(&Triples[Trip].Opnd2, 0);
          if (Trip == Firsttrip)
            Outstring(_imp_str_literal(","));
          else {
            Outstring(_imp_str_literal(")"));
            if (Triples[Trip].Puse) Outsym(',');
          }
          Trip = Triples[Trip].Puse;
        }
      Tidy:;
        Expopnd = Opnd1;
        Value = Wkarea;
        P++;
        if (Keepwa == 0 && Wkarea > 0) Returnwsp(Wkarea, 268);
        Stringl = 0;
        return;
      Error:
        Fault(Err, 0, Fnam);
        Expopnd = Opnd1;
        Base = Rbase;
        Disp = 0;
        Value = 0;
        Access = 0;
        P = Pp;
        Skipexp();
        return;
        int Strop(Rd * Opnd) {
          int Ctype;
          int Alt;
          int I;
          Alt = A[P];
          *Opnd = (Rd){0};
          if (Alt > 2) return (75);
          if (Alt != 1) {
            Ctype = A[P + 1];
            if (Ctype == 0x35) {
              Ptype = Ctype;
              Stringl = A[P + 2];
              Opnd->Ptype = Ctype;
              Opnd->Flag = Lconst;
              Opnd->D = P + 2;
              Opnd->Xtra = Stringl;
              P = P + Stringl + 3;
            } else
              return (73);
          } else {
            P++;
            Copytag(Fromar2(P), No);
            if (Ptype == 0x1006) Type = Acc & 7;
            if (Type == 3) Reducetag(No);
            if (5 != Type && Type != 7) {
              Fnam = Fromar2(P);
              return (71);
            }
            if (Ptype == 0x4035 && A[P + 2] == 2 && 2 == A[P + 3] &&
                Mode != 0) {
              Opnd->Flag = Lconst;
              Opnd->Ptype = 0x35;
              Opnd->D = Midcell;
              Opnd->Xtra = Kform;
              Stringl = Opnd->Xtra;
              P += 4;
              return (0);
            }
            if (Ptype == 0x35 && A[P + 2] == 2 && 2 == A[P + 3]) {
              Opnd->Flag = Dname;
              Opnd->Xtra = 0;
              Opnd->Ptype = Ptype;
              Opnd->D = Fromar2(P);
              P += 4;
            } else {
              Opnd->Flag = Arname;
              Opnd->D = P;
              P += 2;
              Skipapp();
              while (A[P] == 1) {
                P += 3;
                Skipapp();
              }
              P++;
            }
            Stringl = 0;
          }
          return (0);
        }
      }
      void Cres(int Lab) {
        int P1;
        int P2;
        int Sexprn;
        int W;
        int Last;
        int Err;
        int Fnam;
        int Jj;
        Rd Opnd1;
        Rd Opnd2;
        Last = 0;
        Fnam = 0;
        Sexprn = 0;
        P1 = P;
        Err = 43;
        if ((Nameopnd.Ptype & 0xC700) == 0x4000) {
          Fnam = Nameopnd.D;
          goto Error;
        }
        Err = 74;
        Getwsp(&W, 4);
        Opnd1.Ptype = 0x61;
        Opnd1.Flag = Localir;
        Opnd1.D = Rbase << 16 | W;
        P += 3;
        if (A[P] == 4) goto Res;
        Err = 72;
      Error:
        Fault(Err, 0, Fnam);
        P = P1;
        Skipexp();
        return;
      Res:
        P++;
        if (A[P] == 3) {
          Opnd2.Ptype = 0x51;
          Opnd2.Flag = Sconst;
          Opnd2.D = 0;
          Outstring(_imp_str_literal("NULL,"));
        } else {
          if (A[P] != 1) goto Error;
          P++;
          P2 = P;
          Cname(2);
          Outsym(',');
          Opnd2 = Nameopnd;
          if (Type != 5) {
            Err = 71;
            Fnam = Fromar2(P2);
            goto Error;
          }
          if (A[P + 1] != Concop) {
            Err = 72;
            goto Error;
          }
          P += 2;
        }
        if (A[P] != 3) goto Error;
        Sexprn++;
        P++;
        Cstrexp(0);
        Outsym(',');
        Opnd2.Ptype = 0x51;
        Opnd2.Flag = Sconst;
        Opnd2.D = Lab;
        if (A[P] == 2) {
          Outstring(_imp_str_literal("NULL"));
          goto End;
        }
        if (A[P + 1] != Concop) {
          Err = 72;
          goto Error;
        }
        P2 = P + 1;
        P = P2 + 1;
        if (A[P] == 3) {
          P = P2;
          Outstring(_imp_str_literal("_imptempstring)"));
          if (!Lab)
            Outsym(';');
          else
            Outsym('+');
          Outstring(_imp_str_literal("imp_resolve(_imptempstring,"));
          goto Res;
        }
        if (A[P] != 1) goto Error;
        do {
          P += 3;
          Skipapp();
        } while (A[P] != 2);
        if (A[P + 1] == 1) {
          P = P2;
          Outstring(_imp_str_literal("_imptempstring)"));
          if (!Lab)
            Outsym(';');
          else
            Outsym('+');
          Outstring(_imp_str_literal("imp_resolve(_imptempstring,"));
          goto Res;
        }
        P1 = P + 1;
        P = P2 + 2;
        Cname(2);
        P = P1;
      End:;
        P++;
      }
      void Savestackptr(void) {
        int Jjj;
        if (!Currinf->Auxsbase) {
          Jjj = Utemptrip(Ssptr, Minapt, 0, N);
          Currinf->Auxsbase = N;
          if (Target == Emas && Parm.Stack == 0)
            N += 16;
          else
            N += 4;
        }
      }
      void Cend(int Kkk) {
        int Kp;
        int Jj;
        int Bit;
        Tagf *Rcell;
        Tagf *Tcell;
        Tagf *Pcell;
        auto void Dtable(int Level);
        if (Kkk != 2) Setline();
        Bit = 1 << Level;
        if ((Kkk & 0x3FFF) > 0x1000 && Parm.Compiler == 0 && Lastinst == 0)
          Jj = Uconsttrip(Rtbad, 0x51, 0, 0);
        if (!Kkk) {
          if (Parm.Trace == 1) Jj = Uconsttrip(Rdptr, 0x51, 0, Level - 1);
          Jj = Currinf->Auxsbase;
          if (Jj) Jj = Uconsttrip(Rsptr, 0x51, 0, Jj);
        }
        Forcetrips();
        if (N > Nmax) Nmax = N;
        while (Currinf->Label) {
          Pop(&Currinf->Label, &I, &J, &Kp);
          if (J & 0xFFFF) {
            J = J & 0xFFFF;
            if (0 < Kp && Kp <= Maxulab) Fault(11, Aslist[J].S3 & 0xFFFF, Kp);
            Clearlist(&J);
          } else if ((I & Labusedbit) == 0 && Kp < Maxulab)
            Warn(3, Kp);
        }
        Nmax = (Nmax + 7) & (-8);
        Currinf->Snmax = Nmax;
        Jj = Currinf->M - 1;
        if (Jj >= 0) {
          Rcell = (Tagf *)&Aslist[Tags[Jj]]; /*gt: RCELL is a TAGF, but ASLIST is a LISTF. Yet this apparently compiled OK in the Imp version*/
          if (Rcell->Ptype & 0x1000) {
            K = Rcell->Slink;
            while (K > 0) {
              Tcell = (Tagf *)&Aslist[K]; /*gt: See above.*/
              if ((Tcell->Ptype & 0xF00) == 0x500 && (Tcell->Uioj & 15) == 0) {
                Pcell = (Tagf *)&Aslist[Tags[((unsigned)Tcell->Uioj >> 4) & 4095]];
                Tcell->Uioj = Tcell->Uioj | Pcell->Uioj & 15;
              }
              K = Tcell->Link;
            }
          }
        }
        if (Kkk & 0x1000) Jj = Uconsttrip(Rtxit, 0x51, 0, Kkk);
        if (Kkk == 1) Jj = Uconsttrip(Xstop, 0x51, 0, Kkk);
        Clearlist(&Twsphead);
        for (Jj = 0; Jj <= 4; Jj++) {
          Clearlist(Currinf->Avlwsp);
        }
        if (Target == Perq || Target == Accent) Forcetrips();
        Dtable(Level);
        Forcetrips();
        while (Currinf->Unattformats) {
          Pop(&Currinf->Unattformats, &I, &J, &Jj);
          Clearlist(&I);
          Clearlist(&J);
          Clearlist(&Jj);
        }
        if (Kkk == 2) return;
        if (Level <= 2 && (Level != 2 || Parm.Cprmode != 2)) {
          if (Kkk == 1 && Level == 2)
            Kkk = 2;
          else
            Fault(109, 0, 0);
        }
        Level--;
        Currinf = &Levelinf[Level];
        if (Kkk & 0x1000) {
          Rlevel = Currinf->Rbase;
          Rbase = Rlevel;
        }
        if (Kkk & 0x1000) Nmax = Currinf->Snmax;
        N = Currinf->Sn;
        if (Kkk == 2) Cend(Kkk);
        if ((Kkk & 0x1000) != 0 && Parm.Compiler == 0 &&
            (Rlevel > 0 || Parm.Cprmode != 2)) {
          Jj = Nextp + 6;
          if (A[Nextp + 5] != 11 || A[Jj + Fromar2(Jj)] != 2) {
            Jj = Enterlab(Currinf->Jround, 1);
            Currinf->Jround = 0;
          }
        }
        return;
        void Dtable(int Level) {
          auto int Swopof(int Ptype, int Value);
          _imp_string Rtname;
          _imp_string Localname;
#if (!(1 << Host & Unsignedshorts))
            typedef struct Headf {
              short Rtline;
              short Lineoff;
              short Oflags;
              short Env;
              short Display;
              short Rtflags;
              union {
                int Idhead;
                _imp_string Rtname;
              };
            } Headf;
            typedef struct Varf {
              short Flags;
              short Disp;
              _imp_string Vname;
            } Varf;
#else
            typedef struct Headf {
              unsigned short Rtline;
              unsigned short Lineoff;
              unsigned short Oflags;
              unsigned short Env;
              unsigned short Display;
              unsigned short Rtflags;
              union {
                int Idhead;
                _imp_string Rtname;
              };
            } Headf;
            typedef struct Varf {
              unsigned short Flags;
              unsigned short Disp;
              _imp_string Vname;
            } Varf;
#endif
          Headf *Dhead;
          Varf *Var;
          Listf *Lcell;
          Listf *Scell;
          Swdataform *Swdata;
          #define Larrrout (0xF300)
          Tagf T;
          int Dptr;
          int Lnum;
          int Ml;
          int Kk;
          int Jj;
          int Q;
          int Dend;
          int Bit;
          int S4;
          int Langd;
          int Rules;
          int Ii;
          #define Dlimit (700)
          int Dd[701 /*0:700*/];
          Bit = 1 << Level;
          Langd = (unsigned)Kkk >> 14 << 30 | Level << 18;
          if (Parm.Trace == 1) Pdata(Darea, 4, 0, Addr(Dd[0]));
          Filldtabrefs(&Currinf->Ral);
          if (Parm.Trace)
            Push(&Levelinf[Level - 1].Ral, Darea, Cas[Darea] + 4, Langd);
          Dhead = Record(Addr(Dd[0]));
          Dhead->Rtline = Swopof(0x41, Currinf->L);
          Dhead->Lineoff = Swopof(0x41, Currinf->Diaginf);
          Dhead->Oflags = Swopof(0x41, (unsigned)Langd >> 16);
          Dhead->Env = 0;
          if (Target == Ibm || Target == Ibmxa || Target == Amdahl)
            Dhead->Display = Currinf->Rbase;
          else
            Dhead->Display = Swopof(0x41, Currinf->Display);
          Dhead->Rtflags = Swopof(0x41, Currinf->Flag & 0x3FFF);
          Ml = Currinf->M;
          if (Ml) Ml = Word[Ml - 1];
          Lnum = Worka.Lett[Ml];
          Dptr = 4;
          Dend = 0;
          if (!Lnum)
            Dhead->Idhead = 0;
          else {
            Q = Addr(Worka.Lett);
            Rtname = *String(Q);
            Lnum = *Length(Rtname);
            Dhead->Rtname = Rtname;
            //         %if HOST#TARGET %and PARM_TRACE#0 %then %c
            //            CHANGE SEX(ADDR(DD(0)),12,LNUM+1)
            Dptr += (unsigned)Lnum >> 2;
          }
          Dd[Dptr] = Swopof(0x51, Currinf->Onword);
          Dptr++;
          Jj = Currinf->Names;
          while (0 <= Jj && Jj < 0x3FFF) {
            Lcell = &Aslist[Tags[Jj]];
            T = *(Tagf *)Lcell; /*gt: Tagf vs Listf again*/
            S4 = Lcell->Link;
            Ptype = T.Ptype;
            Type = Ptype & 15;
            if ((Type > 2 || (Ptype & 0xFF00) != 0x4000 || Parm.Stack != 0) &&
                (T.Uioj & 0xC000) == 0)
              Warn(2, Jj);
            I = (unsigned)T.Uioj >> 4 & 15;
            J = T.Uioj & 15;
            K = T.Slink;
            if (Parm.Diag != 0 && (Ptype & 0x7300) <= 0x200 &&
                Dptr < Dlimit - 3 && (1 <= Type && Type <= 3 || Type == 5)) {
              Q = Addr(Worka.Lett);
              if (!I)
                Ii = 1;
              else
                Ii = 0;
              Var = Record(Addr(Dd[Dptr]));
              Var->Flags = Swopof(0x41, Ptype << 4 | Ii << 2);
              if (((Paramsbwards == Yes && K < Currinf->Display) ||
                   (Stackdown == Yes && K > Currinf->Display)) &&
                  (Ptype & 0xC00) == 0 && Ii == 0 && (Type == 3 || Type == 5)) {
                if (K < Currinf->Display)
                  Rules = 2;
                else
                  Rules = 1;
                Kk = Roundinglength(Ptype, Rules);
                K = (K + T.Acc + Kk) & (~Kk);
              }
              Var->Disp = Swopof(0x41, K);
              if (Target == Eamd && I != 0) Var->Disp = K + 64;
              Localname = *String(Q);
              Lnum = *Length(Localname);
              Var->Vname = Localname;
#if (Host != Target)
              if (Parm.Trace != 0)
                Changesex(Addr(Dd[0]), 4 * Dptr + 4, Lnum + 1);
#endif
              Dptr += (unsigned)(Lnum + 8) >> 2;
            }
            if (J == 15 && (Ptype & 0x3000) != 0 && (T.Uioj & 0xC000) != 0)
              Fault(28, 0, Jj);
            if (J == 15 && Type == 4) Fault(62, 0, Jj);
            if (Ptype & 0x3000) Clearlist(&K);
#ifdef NEVER
            if (Type == 4) Clearlist(&T.Kform); /*gt: passed a *short should be a *int - looks a LOT like an original code bug */
#else
            if (Type == 4) {
              int Dummy;
              Dummy = T.Kform;
              fprintf(stderr, "Coder warning: dubious code was invoked at pass2.c:%d\n", __LINE__+1);
              Clearlist(&Dummy); /*gt: passed a *short should be a *int - looks a LOT like an original code bug */
              T.Kform = Dummy;
            }
#endif
            if (Type == 6) {
              Scell = &Aslist[Lcell->Slink];
              Swdata = Record(Scell->S1);
              Outstring(_imp_str_literal("goto "));
              Outswadname(Jj);
              Outstring(_imp_str_literal("_skip;"));
              Outsym(Nl);
              Outswadname(Jj);
              Outstring(_imp_str_literal("_despatch:"));
              Outsym(Nl);
              Outstring(_imp_str_literal("switch ("));
              Outswadname(Jj);
              Outstring(_imp_str_literal("_value) {"));
              Outsym(Nl);
              for (Lnum = 0; Lnum <= Swdata->Lseen - 1; Lnum++) {
                Outstring(_imp_str_literal("case "));
                P = Swdata->Slabs[Lnum];
                Csexp(0x51);
                Outstring(_imp_str_literal(": goto "));
                Outswadname(Jj);
                Outsym('_');
                P = Swdata->Slabs[Lnum];
                Labexp();
                Outsym(';');
                Outsym(Nl);
              }
              Outstring(_imp_str_literal("default:"));
              if (Swdata->Default) {
                Outstring(_imp_str_literal("goto "));
                Outswadname(Jj);
                Outstring(_imp_str_literal("_default;"));
              } else {
                Outstring(_imp_str_literal("BADSWITCH("));
                Outswadname(Jj);
                Outstring(_imp_str_literal("_value,"));
                Outswadname(Jj);
                Outstring(_imp_str_literal("_line,"));
                Outswadname(Jj);
                Outstring(_imp_str_literal("_file);"));
              }
              Outsym(Nl);
              Outsym('}');
              Outsym(Nl);
              Outswadname(Jj);
              Outstring(_imp_str_literal("_skip:;"));
              Outsym(Nl);
              Free(Addr(*Swdata));
              Kk = T.Slink;
              Clearlist(&Kk);
            }
            Lcell->Link = Asl;
            Asl = Tags[Jj];
            Tags[Jj] = S4 & 0x3FFFF;
            Jj = (unsigned)S4 >> 18;
          }
          Dd[Dptr] = -1;
          Dptr = (Dptr << 2) + 4;
          if (Parm.Trace == 1) Pdata(Darea, 4, Dptr, Addr(Dd[0]));
          return;
          int Swopof(int Ptype, int Value) {
            Rd Opnd;
            if (Host != Target) {
              Opnd = (Rd){0};
              Opnd.D = Value;
              Opnd.Ptype = Ptype;
#if (Host != Target)  // test added by gtoal as 'Reformatc' was not declared
                      // due to a similar condition around the declaration.
                      // We need an explicit "Imptoc" target...
              Reformatc(Opnd);
#endif
              Value = Opnd.D;
            }
            return (Value);
          }
        }
      }
      void Declarescalars(int Xtra) {
        int Inc;
        int Scalname;
        int Rl;
        Pack(&Ptype);
        Inc = Acc;
        Sndisp = 0;
        Rl = Roundinglength(Ptype, 1);
        if (Nam != 0 && Arr == 0) {
          Inc = Ptrsize[Ptype & 127];
          Rl = Ptrrounding[(Ptype & 127) + 128];
        }
        if (Nam > 0 && Arr > 0) {
          Inc = Aheadsize;
          Rl = Roundinglength(Aheadpt, 1);
        }
        if (Ptype == 0x35 && (Acc <= 0 || Acc > 256)) {
          Fault(70, Acc - 1, 0);
          Acc = 255;
        }
        if (Type == 5)
          Outstring(_imp_str_literal("char "));
        else
          Outtype(Ptype & 255, Xtra);
        do {
          N = ((N + Rl + Sframemisalign) & (~Rl)) - Sframemisalign;
          Scalname = Fromar2(P);
          if (Nam) Outstring(_imp_str_literal("*"));
          Outname(Scalname);
          P += 3;
          Storetag(Scalname, Level, Rbase, 0, Sndisp, Acc, N, Xtra);
          N += Inc;
          if (Type == 5 && Nam == 0) {
            Outstring(_imp_str_literal(" ["));
            Outint(Acc);
            Outstring(_imp_str_literal("] "));
          }
          if (A[P - 1] == 1) Outsym(',');
        } while (A[P - 1] != 2);
        N = (N + Minparamsize - 1) & (-Minparamsize);
      }
      int Dopevector(int Tamper, int Typep, int Elsize, int Mode, int Iden) {
        int I;
        int Jj;
        int K;
        int Nd;
        int D;
        int M0;
        int Head;
        int Nops;
        int Typepp;
        int Pin;
        int Etype;
        int Value;
        Rd Opnd;
        Listf *Lcell;
        int Lbh[13 /*0:12*/];
        int Lbb[13 /*0:12*/];
        int Lbp[13 /*0:12*/];
        int Ubp[13 /*0:12*/];
        int Dv[40 /*0:39*/];
        Nd = 0;
        Typepp = 0;
        Pin = P;
        M0 = 1;
        do {
          Nd++;
          P++;
          Lbp[Nd] = P;
          Etype = Tsexp(&Value);
          P = Lbp[Nd] + 3;
          if (Nd > 12) {
            Fault(37, 0, Iden);
            Nd = 1;
          }
          Lbh[Nd] = 0;
          Lbb[Nd] = 0;
          Nops = 0;
          Torp(&Lbh[Nd], &Lbb[Nd], &Nops, 1);
          Ubp[Nd] = P;
          Skipexp();
          if (Imod(Etype) == 1) {
            Expop(&Lbh[Nd], &Lbb[Nd], Nops, 0x251);
            Lbb[Nd] = Expopnd.D;
          } else
            Lbb[Nd] = 0x80000000;
        } while (A[P] != 2);
        P++;
        if (Tamper == Yes)
          for (D = 1; D <= Nd; D++)
            if (Lbb[D] > 0 && Lbb[D] * Nd <= 6) Lbb[D] = 0;
        Dv[1] = Nd << 16 | Elsize;
        for (D = 1; D <= Nd; D++) {
          K = 3 * D;
          Dv[K] = Lbb[D];
          Dv[K + 1] = Lbp[D];
          Dv[K + 2] = Ubp[D];
        }
        K = 3 * Nd + 2;
        J = Nd;
        Sndisp = 4 * Worka.Constptr;
        I = Sndisp;
        for (D = 0; D <= K; D++) {
          Ctable[Worka.Constptr] = Dv[D];
          Worka.Constptr = Worka.Constptr + 1;
        }
        if (Worka.Constptr > Worka.Constlimit) Fault(102, Worka.Wkfilek, 0);
        return (I);
      }
      void Declarearrays(int Format, int Finf) {
        int Dvdisp;
        int Pp;
        int Dvf;
        int Elsize;
        int Totsize;
        int Ptypep;
        int Arrp;
        int Nn;
        int Nd;
        int Ii;
        int Cdv;
        int Lwb;
        int Ptypepp;
        int Jjj;
        int Jj;
        int Trip1;
        int Rl;
        int Topp;
        int Iden;
        Rd Opnd1;
        Savestackptr();
        Arrp = 2 * Format + 1;
        Arr = Arrp;
        Pack(&Ptypep);
        Elsize = Acc;
      Start:
        Nn = 1;
        P++;
        Pp = P;
        Cdv = 0;
        Ptypepp = Ptypep;
        while (A[P + 2] == 1) {
          P += 3;
          Nn++;
        }
        P += 3;
        Dvdisp = Dopevector(Yes, Type, Elsize, 1, Fromar2(Pp));
        Topp = P;
        Nd = J;
        Cdv = 1;
        if (Lwb == 0 && Format == 0) Ptypepp = Ptypep + 256;
        Sndisp = (unsigned)Sndisp >> 2;
        Dvdisp = (unsigned)Dvdisp >> 2;
      Decl:;
        J = Nd;
        Rl = Roundinglength(Aheadpt, 1);
        N = (N + Rl) & (~Rl);
        for (Jjj = 0; Jjj <= Nn - 1; Jjj++) {
          Iden = Fromar2(Pp + 3 * Jjj);
          Ptype = Ptypepp;
          Unpack();
          Storetag(Iden, Level, Rbase, Nd, Dvdisp, Elsize, N, Finf);
          N += Aheadsize;
          if (!Format) {
            if ((Ptypepp & 15) == 5)
              Outstring(_imp_str_literal("char "));
            else
              Outtype(Ptypepp & 255, Finf);
            Outname(Iden);
            for (Ii = Nd; Ii >= 1; Ii--) {
              P = Ctable[Dvdisp + 3 * Ii + 2];
              Outstring(_imp_str_literal(" ["));
              Csexp(0x51);
              if (Ctable[Dvdisp + 3 * Ii] == 0x80000000) {
                Outsym('-');
                P = Ctable[Dvdisp + 3 * Ii + 1];
                Outsym('(');
                Csexp(0x51);
                Outstring(_imp_str_literal(")+1"));
              } else if (Ctable[Dvdisp + 3 * Ii] < 1) {
                Outsym('+');
                Outint(1 - Ctable[Dvdisp + 3 * Ii]);
              } else if (Ctable[Dvdisp + 3 * Ii] > 1) {
                Outsym('-');
                Outint(Ctable[Dvdisp + 3 * Ii] - 1);
              }
              Outsym(']');
              if ((Ptypepp & 15) == 5) {
                Outstring(_imp_str_literal(" ["));
                Outint(Elsize);
                Outstring(_imp_str_literal("] "));
              }
            }
            if (Jjj != Nn - 1) {
              Outsym(';');
              Outsym(Nl);
            }
          }
        }
        P = Topp + 1;
        if (A[P - 1] == 2) return;
        Outsym(';');
        Outsym(Nl);
        goto Start;
      }
      int Roundinglength(int Ptype, int Rules) {
        if (Ptype & 0x1000) return (Ptrrounding[128 * Rules]);
        if (Ptype & 0xC00) return (Ptrrounding[(Ptype & 0x7F) + 128 * Rules]);
        return (Rnding[(Ptype & 0x7F) + 128 * Rules]);
      }
      void Clt(void) {
        int Alt;
        int Ptypep;
        int I;
        int Flags;
        int Sj;
        Alt = A[P];
        Flags = Typeflag[Alt];
        if (Flags & 0x8000) {
          P++;
          Flags = Typeflag[A[P] + (Flags & 15)];
        }
        if (Flags & 0x4000) P++;
        if (Flags & 0x2000) Warn(8, 0);
        if (Flags & 0x1000) Fault(99, 0, 0);
        Prec = (unsigned)Flags >> 4 & 15;
        Type = Flags & 7;
        P++;
        Acc = Bytes[Prec];
        Pack(&Ptypep);
        if (Type == 5)
          if (A[P] == 1)
            if (A[P + 1] == 1) {
              P += 4;
              if (Intexp(&I, Minapt)) {
                Fault(41, 0, 0);
                I = 255;
              }
              if (1 > I || I > 255) Fault(70, I, 0);
              Acc = I + 1;
              Ptype = Ptypep;
              Unpack();
            } else {
              Acc = 0;
              P += 2;
            }
          else {
            Acc = 0;
            P++;
          }
        Kform = 0;
        if (Type == 3) {
          Sj = J;
          Kform = Cformatref();
          Ptype = Ptypep;
          Unpack();
          J = Sj;
        }
      }
      void Cqn(int P) {
        int I;
        I = A[P];
        Nam = 0;
        Arr = 0;
        if (I == 1) Arr = 1;
        if (I <= 2) Nam = 1;
      }
      void Crspec(int M) {
        int Kk;
        int Jj;
        int Typep;
        int Ophead;
        int Nparms;
        int Axname;
        int Sacc;
        int Skform;
        int Pchkword;
        int Pcount;
        Listf *Lcell;
        _imp_string Ss;
        Litl = Extrn & 3;
        Acc = 0;
        Kform = 0;
        if (A[P] == 1) {
          Typep = Litl << 14 | 0x1000;
          P += 4;
        } else {
          Rout = 1;
          Arr = 0;
          P++;
          Clt();
          Nam = 0;
          if (A[P] == 2) Nam = 2;
          Pack(&Typep);
          P += 4;
        }
        Kk = Fromar2(P);
        Axname = Addr(Worka.Lett);
        Jj = 0;
        P += 3;
        Sacc = Acc;
        Skform = Kform;
        if (A[P - 1] == 1) {
          if (!Litl) Warn(10, 0);
          Movebytes(A[P] + 1, Addr(A[0]), P, Addr(A[0]), Worka.Artop);
          Outstring(_imp_str_literal("#define "));
          Outstring(*String(Axname));
          Axname = Addr(A[Worka.Artop]);
          Outsym(' ');
          if (_imp_strcmp(*String(Axname), _imp_str_literal("s_cstring"))==0)
            Outstring(_imp_str_literal("s__cstring"));
          else
            Outstring(*String(Axname));
          Outsym(Nl);
          Worka.Artop = (Worka.Artop + 4 + A[P]) & (-4);
          P = P + A[P] + 1;
        }
        Cfplist(&Ophead, &Nparms);
        Pchkword = 0;
        Ss = *String(Axname);
        if (0 <= M && M <= 1)
          if ((Typep & 0xc000) == 0 || (_imp_strcmp(Ss, _imp_str_literal("malloc"))!=0 &&
                                        _imp_strcmp(Ss, _imp_str_literal("free"))!=0 &&
                                        _imp_strcmp(Ss, _imp_str_literal("realloc"))!=0 &&
                                        _imp_strcmp(Ss, _imp_str_literal("perror"))!=0 &&
                                        _imp_strcmp(Ss, _imp_str_literal("getcwd"))!=0 &&
                                        _imp_strcmp(Ss, _imp_str_literal("strlen"))!=0)) {
            if ((Typep & 0xc000) == 0x8000)
              Outstring(_imp_str_literal("extern "));
            Outtype(Typep & 255, Skform);
            if ((Typep & 0x800) != 0 && (Typep & 7) != 5) Outsym('*');
            Outname(Kk);
            Outsym('(');
            Outsym(' ');
            Lcell = &Aslist[Ophead];
            if (!Nparms)
              Outstring(_imp_str_literal("void "));
            else
              for (Pcount = 1; Pcount <= Nparms; Pcount++) {
                if (Lcell->S1 & 0x10000000) {
                  Outtype((unsigned)Lcell->S1 >> 16 & 255, Lcell->Sndisp);
                  Outstring(_imp_str_literal("()"));
                } else
                  Outxtype((unsigned)Lcell->S1 >> 16, Lcell->Sndisp);
                if (Lcell->Link) Outsym(',');
                Lcell = &Aslist[Lcell->Link];
              }
            Outstring(_imp_str_literal(");"));
          }
        if (Nparms > 0)
          Pchkword = Nparms << 16 | (unsigned)Aslist[Ophead].S3 >> 16;
        if (M == 1) {
          if (Target == Emas || Target == Pnx || Target == Ibm ||
              Target == Ibmxa || Target == Amdahl ||
              (1 << Target & Emachine) != 0)
            Cxref(*String(Axname), 3 * Parm.Dynamic | Extrn, Pchkword, &Jj);
          if (Target == Perq || Target == Accent)
            Jj = Axname - Addr(A[Worka.Dictbase]);
        } else if (Target == Perq || Target == Accent) {
          Jj = Worka.Rtcount;
          Worka.Rtcount = Worka.Rtcount + 1;
        }
        if (M == 0 && Rlevel == 0) {
          if (!Parm.Cprmode) Parm.Cprmode = 2;
          if (Parm.Cprmode != 2) Fault(56, 0, Kk);
        }
        J = 15 - (M & 1);
        Ptype = Typep;
        Storetag(Kk, Level, Rbase, J, Jj, Sacc, Ophead, Skform);
      }
      void Cfplist(int *Ophead, int *Nparms) {
        int Opbot;
        int Pp;
        int Inc;
        int Rl;
        int Rsize;
        int Cell;
        int Psimple;
        Listf *Lcell;
        *Ophead = 0;
        Opbot = 0;
        *Nparms = 0;
        Psimple = 1;
        while (A[P] == 1) {
          Pp = P + 1 + Fromar2(P + 1);
          P += 3;
          Cfpdel();
          if (Ptype != 0x51 &&
              (Rout != Arr || Arr != 0 || Nam != 1 || 0 >= Type || Type > 3))
            Psimple = 0;
          if (Rout) {
            Inc = Rtparamsize;
            Rl = Roundinglength(Rtparampt, 2);
          } else if (Arr == 1) {
            Inc = Aheadsize;
            Rl = Roundinglength(Aheadpt, 2);
          } else if (Nam == 1) {
            Inc = Ptrsize[Ptype & 0x7F];
            Rl = Ptrrounding[(Ptype & 0x7F) + 256];
          } else if (Strvalinwa == Yes && Ptype == 0x35) {
            Inc = Ptrsize[0x35];
            Rl = Ptrrounding[256 + 0x35];
          } else if (Recvalinwa == Yes && Ptype == 0x33) {
            Inc = Ptrsize[0x33];
            Rl = Ptrrounding[256 + 0x33];
          } else if (Target == Emas && Ptype == 0x33) {
            Inc = Acc + 8;
            Rl = 3;
          } else {
            Inc = Acc;
            Rl = Roundinglength(Ptype, 2);
          }
          do {
#if (Paramsbwards == Yes)
              Push(Ophead, 0, 0, Rl);
              Cell = *Ophead;
#else
              Binsert(Ophead, &Opbot, 0, 0, Rl);
              Cell = Opbot;
#endif
            Lcell = &Aslist[Cell];
            Lcell->Ptype = Ptype;
            Lcell->Sndisp = Kform;
            Lcell->Acc = Acc;
            *Nparms = *Nparms + 1;
            P += 3;
          } while (A[P - 1] != 2);
          P = Pp;
        }
        Opbot = *Ophead;
        Inc = 0;
        Inc = ((Inc + Rl + Sframemisalign) & (~Rl)) - Sframemisalign;
        P++;
        if (Parm.Z) Printlist(*Ophead);
        Pp = Inc << 16 | *Nparms;
        if (Target == Ibm || Target == Ibmxa || Target == Amdahl)
          Pp = Pp | Psimple << 15;
        if (*Nparms > 0) Aslist[*Ophead].S3 = Pp;
        if (Parm.Z) Printlist(*Ophead);
      }
      void Cfpdel(void) {
        static int Fp_sw;
        static void *Fp[3 /*1:3*/] = {
            &&Fp_1,
            &&Fp_2,
            &&Fp_3,
        };
        int Fpalt;
        Fpalt = A[P];
        P++;
        Kform = 0;
        Litl = 0;
        goto *Fp[Fp_sw = (Fpalt)-1];
      Fp_1:;
        Rout = 0;
        Clt();
        Cqn(P);
        if (Type == 5 && Nam == 0 && (Acc <= 0 || Acc > 256)) {
          Fault(70, Acc - 1, 0);
          Acc = 255;
        }
        P++;
        goto Pk;
      Fp_2:;
        Rout = 1;
        Nam = 1;
        Arr = 0;
        if (A[P] == 1) {
          Type = 0;
          Prec = 0;
          P += 2;
        } else {
          P++;
          Clt();
          Nam = 1;
          if (A[P] == 2) Nam = 3;
          P += 2;
        }
        Acc = Rtparamsize;
        goto Pk;
      Fp_3:;
        Acc = Ptrsize[0];
        Nam = 1;
        Rout = 0;
        Type = 0;
        Arr = 0;
        Prec = 0;
      Pk:
        Pack(&Ptype);
      }
      void Rhead(int Rtname, int Axname, int Xtra) {
        int W3;
        int Flags;
        Listf *Lcell;
        Flags = 0;
        if (Xtra) Flags = Bstruct;
        Currinf->Snmax = Nmax;
        Currinf->Sn = N;
        if (Rtname >= 0) {
          Lcell = &Aslist[Tags[Rtname]];
          if (Parm.Compiler == 0 && Level > 1 && Currinf->Jround == 0) {
            Plabel--;
            Currinf->Jround = Plabel;
            if (Jrndbodies == Yes) Enterjump(15, Plabel, 0);
          }
          Rlevel++;
          Rbase = Rlevel;
        }
        Level++;
        Currinf = &Levelinf[Level];
        *Currinf = (Levelf){0};
        Currinf->Rbase = Rbase;
        Currinf->Clevel = Level;
        Currinf->Names = -1;
        Currinf->Diaginf = Levelinf[Level - 1].Diaginf;
        Currinf->Display = Levelinf[Level - 1].Display;
        if (Level == Maxlevels) Fault(34, 0, 0);
        if (Level > Maxlevels) Fault(105, 0, 0);
        if (Rtname < 0) {
          if (!Axname) {
            Currinf->Iblkid = Internalblockid;
            Internalblockid++;
          }
          W3 = 0;
        } else {
          W3 = Rtname + 1;
          Internalblockid = 0;
        }
        Currinf->L = Line;
        Currinf->M = W3;
        Currinf->Flag = Ptype & 0xFFFF;
        W3 = Ulconsttrip(Rthd, 0x61, Flags, Rtname, Axname);
      }
      void Rdisplay(int Kk) {
        int Tripno;
        if (Kk >= 0 || Level == 2) {
          Currinf->Psize = N - Alpha;
          if (1 << Target & Riskmc)
            N = (N + Displayrounding) & (~Displayrounding);
          Currinf->Display = N;
          if (Displayneeded == Yes) {
            N = N + Displayc1 * Rlevel + Displayc0;
          }
          Tripno = Uconsttrip(Rdspy, 0x51, 0, Currinf->Display);
        }
        if (Parm.Trace) {
          if (Kk >= 0 || Level == 2)
            if (Target == Vns)
              Currinf->Diaginf = Currinf->Psize + 8;
            else {
              Tripno = Uconsttrip(Rdarea, 0x51, 0, N);
              N += 4;
              if (1 << Target & Riskmc) N += 4;
              Currinf->Diaginf = N;
              N += 4;
              if (Target == Orn || (1 << Target & Riskmc) != 0) N += 4;
            }
          Tripno = Uconsttrip(Rdptr, 0x51, 0, Level);
        }
        Oldline = 0;
        Setline();
        if (Kk >= 0 || Level == 2) Nmax = N;
      }
      void Cui(int Code) {
        int Pt;
        int Marker;
        int J;
        int Lname;
        int Typep;
        int Precp;
        int Alt;
        int Kk;
        Rd Opnd1;
        int Head1;
        int Bot1;
        int Nops;
        int Savepos;
        Rd Rpop;
        Listf *Lcell;
        Swdataform *Swdata;
        static int Depth;
        static int Sw_sw;
        static void *Sw[9 /*1:9*/] = {
            &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, &&Sw_5,
            &&Sw_6, &&Sw_7, &&Sw_8, &&Sw_9,
        };
        Depth++;
        if (Depth == 1) {
          Savepos = Opline.LengthX;
          Outsym(' ');
        }
        Reportui = 0;
        Alt = A[P];
        goto *Sw[Sw_sw = (Alt)-1];
      Sw_1:;
        P++;
        Marker = P + Fromar2(P);
        if (A[Marker] == 1) {
          J = P + 2;
          P = Marker + 2;
          Assign(A[Marker + 1], J);
        } else {
          P += 2;
          Cname(0);
          P++;
        }
      Aui:
        J = A[P];
        P++;
        if (J == 1) {
          if (Depth == 1) Opline.L[Savepos] = '{';
          if (Opline.L[Opline.LengthX-1] != '{') Outstring(_imp_str_literal("; "));
          Cui(Code);
          if (Depth == 1) Outstring(_imp_str_literal(";}"));
        }
        Depth--;
        return;
      Sw_2:;
        Currinf->Nmdecs = Currinf->Nmdecs | 1;
        if (!Code) Currinst = 1;
        Lname = Fromar2(P + 1);
        J = A[P + 3];
        P += 4;
        if (J == 2) {
          Enterjump(15, Lname, 0);
          Reportui = 1;
          Outstring(_imp_str_literal("goto "));
          Outname(Lname);
        } else {
          Copytag(Lname, No);
          if (Oldi != Level || Type != 6) {
            Fault(4, 0, Lname);
            P--;
            Skipapp();
            return;
          }
          Outsym('{');
          Outswadname(Lname);
          Outstring(_imp_str_literal("_value="));
          Csexp(Minapt);
          Outstring(_imp_str_literal("; "));
          Outswadname(Lname);
          Outstring(_imp_str_literal("_line = __LINE__"));
          Outstring(_imp_str_literal("; "));
          Outswadname(Lname);
          Outstring(_imp_str_literal("_file = __FILE__"));
          Outstring(_imp_str_literal("; goto "));
          Outswadname(Lname);
          Outstring(_imp_str_literal("_despatch;}"));
          Reportui = 1;
        }
        Depth--;
        return;
      Sw_3:;
        if ((Currinf->Flag & 0x3FFF) != 0x1000) Fault(30, 0, 0);
        P++;
        Outstring(_imp_str_literal("return "));
      Ret:
        Kk = Uconsttrip(Rtxit, 0x51, 0, 0);
        Reportui = 1;
        if (!Code) Currinst = 1;
        Depth--;
        return;
      Sw_4:;
        Outstring(_imp_str_literal("return "));
        Ptype = Currinf->Flag & 0x3FFF;
        Unpack();
        Pt = Ptype & 255;
        Opnd1 = (Rd){0};
        Opnd1.Ptype = Ptype;
        Opnd1.Flag = Dname;
        Opnd1.D = Currinf->M - 1;
        if (Ptype > 0x1000 && A[P + 1] != 3) {
          if (A[P + 1] == 1 && Nam != 0 && A[P + 5] == 4 && A[P + 6] == 1) {
            P += 7;
            Typep = Type;
            Precp = Prec;
            J = P;
            Cname(4);
            Kk = Brectrip(Mapres, Ptype & 255, 0, &Opnd1, &Nameopnd);
            if (A[P] != 2) Fault(81, 0, 0);
            P++;
            if (Typep != Type || Precp != Prec)
              Fault(83, Currinf->M - 1, Fromar2(J));
            goto Ret;
          }
          if (A[P + 1] == 2 && Nam == 0) {
            P += 2;
            if (Type == 5) {
              Cstrexp(0);
            } else if (Type == 3) {
              if (A[P + 3] != 4 || A[P + 4] != 1) goto Badres;
              P += 5;
              Cname(3);
              if (Type != 3) Fault(66, 0, Opnd1.D);
              Expopnd = Nameopnd;
            } else {
              if (Prec < 4) Prec = 4;
              Csexp(Prec << 4 | Type);
            }
            if (Pt == 0x31 || Pt == 0x41) {
              Kk = Urectrip(Shrtn, Pt, 0, &Expopnd);
              Expopnd.Flag = Reftrip;
              Expopnd.D = Kk;
              Expopnd.Ptype = Pt;
            }
            Kk = Brectrip(Fnres, Ptype & 255, 0, &Opnd1, &Expopnd);
            goto Ret;
          }
        }
        P += 2;
      Badres:;
        Fault(31, 0, 0);
        Skipexp();
        Depth--;
        return;
      Sw_5:;
        Outstring(_imp_str_literal("assert(_IMP_MONITOR_)"));
        P++;
        goto Aui;
      Sw_6:;
        Outstring(_imp_str_literal("exit(0)"));
        P++;
        if (!Code) Currinst = 1;
        Reportui = 1;
        Depth--;
        return;
      Sw_7:;
        P += 5;
        Kk = Intexp(&J, Minapt);
        if (A[P] == 1) {
          P += 3;
          Skipexp();
        }
        Outstring(_imp_str_literal("*** IMP signals untranslateable *****"));
        Depth--;
        return;
      Sw_8:;
        Outstring(_imp_str_literal(" break "));
        Reportui = 1;
        if (!Code) Currinst = 1;
        Depth--;
        return;
      Sw_9:;
        Reportui = 1;
        if (!Code) Currinst = 1;
        Outstring(_imp_str_literal(" continue "));
        Depth--;
        return;
      }
      void Cifthen(int Markiu, int Markc, int Markui, int Marke, int Markr,
                   int Afterelse) {
        int Altui;
        int Ccres;
        int Elres;
        int Thenlab;
        int Elselab;
        int Userlab;
        int Report;
        int Start;
        int Elsealt;
        int K;
        int J;
        int Cs;
        int Linetrip;
        int Ctype;
        #define Nullelse (4)
        static int Esw_sw;
        static void *Esw[Nullelse /*1:Nullelse*/] = {
            &&Esw_1,
            &&Esw_2,
            &&Esw_3,
            &&Esw_4,
        };
        static int Depth = 0;
        Depth++;
        Linetrip = -1;
        Setline();
        Linetrip = Triples[0].Blink;
        Markiu = A[Markiu];
        Plabel--;
        Thenlab = Plabel;
        Start = 0;
        Cs = 0;
        if (Starsize > 100) Cs = 1;
        Elselab = 0;
        P = Markc;
        if (Markr > 0 && A[Markr] <= 2) Start = 1;
        Userlab = -1;
        if (Start)
          Altui = 0;
        else
          Altui = A[Markui];
        if (Altui == 2 && A[Markui + 3] == 2) Userlab = Fromar2(Markui + 1);
        if (8 <= Altui && Altui <= 9 && Currinf->Exitlab != 0)
          if (Altui == 8)
            Userlab = Currinf->Exitlab;
          else
            Userlab = Currinf->Contlab;
        Ctype = Rlevel;
        if (Tcond()) Ctype = 0;
        P = Markc;
        if (!Ctype) {
          if (Afterelse == No) {
            Outsym(Nl);
            Outstring(_imp_str_literal("#if"));
          }
        } else
          Outstring(_imp_str_literal("if "));
        Ccres = Ccond(1, Markiu, Thenlab, 0b11 ^ Start ^ Cs);
        if (Start) {
          if (!Ccres)
            Currinf->Nmdecs = Currinf->Nmdecs | 1;
          else if (Linetrip > 0)
            Triples[Linetrip].Opern = Nullt;
          P = Markr + 1;
          if (Ctype) {
            Curlycheck(1);
            Outsym('{');
          }
          Outsym(Nl);
          Cstart(Ccres, 1);
          if (Ctype) Outstring(_imp_str_literal("}"));
          if (A[P] <= 2) {
            Plabel--;
            Elselab = Plabel;
          }
          Marke = P;
          Report = Lastinst;
        } else if (Ccres != 2) {
          if (!Ctype) Outsym(Nl);
          P = Markui;
          Cui(1);
          if (Marke != 0 && A[Marke] != Nullelse && Opline.L[Opline.LengthX-1] != '}') Outsep();
          Report = Reportui;
        } else
          Report = 1;
      Else:;
        if (!Marke)
          Elsealt = Nullelse;
        else
          Elsealt = A[Marke];
        if (Elsealt < Nullelse) {
          Plabel--;
          Elselab = Plabel;
        }
        P = Marke + 1;
        goto *Esw[Esw_sw = (Elsealt)-1];
      Esw_1:;
        if (!Ctype) {
          Outsym(Nl);
          Outstring(_imp_str_literal("#else"));
          Curlycheck(1);
          Outsym(Nl);
        } else {
          Outstring(_imp_str_literal(" else {"));
          Curlycheck(1);
          Outsym(Nl);
        }
        if (!Ccres) Currinf->Nmdecs = Currinf->Nmdecs | 1;
        Cstart(Ccres, 2);
        if (Ctype) Outstring(_imp_str_literal("}"));
        if (!Ctype) {
          Outsym(Nl);
          Outstring(_imp_str_literal("#endif"));
        }
        goto Enterelselab;
      Esw_2:;
        Marke = 0;
        Markui = 0;
        Markr = P + 1 + Fromar2(P + 1);
        if (A[Markr] == 3) {
          Marke = Markr + 1 + Fromar2(Markr + 1);
          Markui = Markr + 3;
        }
        J = Nexttrip;
        if (!Ctype) {
          Outsym(Nl);
          Outstring(_imp_str_literal("#else"));
          Outsym(Nl);
          Cifthen(P, P + 3, Markui, Marke, Markr, No);
          Outsym(Nl);
          Outstring(_imp_str_literal("#endif"));
        } else {
          Outstring(_imp_str_literal(" else "));
          Cifthen(P, P + 3, Markui, Marke, Markr, No);
          Outsym(Nl);
        }
        Report = 0;
        goto Enterelselab;
      Esw_3:;
        if (!Ctype) {
          Outsym(Nl);
          Outstring(_imp_str_literal("#else"));
          Outsym(Nl);
        } else
          Outstring(_imp_str_literal(" else "));
        if (Ccres != 1) {
          if (Start) Setline();
          if (!Thenlab)
            K = 0;
          else
            K = 2;
          Cui(K);
          Report = Reportui;
          if (!Ctype) {
            Outsep();
            Outsym(Nl);
            Outstring(_imp_str_literal("#endif"));
          } else if (Depth > 1)
            Outsep();
        }
      Enterelselab:;
        if (Elselab > 0) Elres = Enterlab(Elselab, 0b11 | Report << 2);
        Depth--;
        return;
      Esw_4:;
        if (!Ctype) {
          if (!Start) Outsep();
          Outsym(Nl);
          Outstring(_imp_str_literal("#endif"));
        }
        Depth--;
      }
      void Cstart(int Ccres, int Code) {
        int Skipcode;
        int Finishar;
        int Oldnextp;
        int Oldline;
        if (Code == 3) {
          Outstring(_imp_str_literal("/* beginning of onevent block */"));
          Outsym(Nl);
        }
        Skipcode = No;
        if (1 <= Code && Code <= 2 && (Ccres | Code) == 3) Skipcode = Yes;
        Finishar = Fromar4(P);
        Oldline = Line;
        do {
          Oldnextp = Nextp;
          Compileastmnt();
        } while (Oldnextp < Finishar);
        if (Code == 3) {
          Outstring(_imp_str_literal("/* end of onevent block */"));
          Outsym(Nl);
        }
        P = Finishar + 10;
        if (A[P] <= 3 && Code != 1) Fault(45 + Code, Oldline, 0);
        if (Skipcode == Yes) Lastinst = 1;
      }
      void Ccycbody(int Ua, int Elab, int Clab) {
        int Finishar;
        int Oldline;
        int Savee;
        int Savec;
        Finishar = Fromar4(P);
        if (Finishar <= P) Impabort();
        Fordpth++;
        Oldline = Line;
        Savee = Currinf->Exitlab;
        Savec = Currinf->Contlab;
        Currinf->Exitlab = Elab;
        Currinf->Contlab = Clab;
        Curlycheck(1);
        Outsym('{');
        Outsym(Nl);
        while (Nextp <= Finishar) Compileastmnt();
        Outstring(_imp_str_literal("}"));
        Currinf->Exitlab = Savee;
        Currinf->Contlab = Savec;
        P = Finishar + 10;
        Fordpth--;
        if (A[P] == 1 && Ua == 0) Fault(12, Oldline, 0);
      }
      void Cloop(int Alt, int Markc, int Markui) {
        int L1;
        int L2;
        int L3;
        int L4;
        int Ccres;
        int Elres;
        int Fline;
        int Trip;
        int Fot;
        int Pp;
        int Debj;
        int Jj;
        int Fstrip;
        int Forname;
        int Initp;
        int Stepp;
        int Finalp;
        int Repmask;
        int Forpt;
        int Forwords;
        int Forbits;
        Rd Initopnd;
        Rd Stepopnd;
        Rd Finalopnd;
        Rd Diffopnd;
        Rd Zopnd;
        Rd Opnd;
        Tripf *Currt;
        auto void Forexp(Rd * Eopnd, int Tt, int Sh);
        static int Sw_sw;
        static void *Sw[7 /*0:6*/] = {
            &&Sw_0, &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4, &&Sw_5, &&Sw_6,
        };
        P = Markc;
        Forbits = 0;
        Sflabel -= 2;
        L1 = Sflabel;
        L2 = L1 + 1;
        L3 = 0;
        if (0b1100001 & 1 << Alt) {
          L3 = Sflabel - 1;
          Sflabel = L3;
        }
        if (1 <= Alt && Alt <= 3) Setline();
        goto *Sw[Sw_sw = Alt];
      Sw_0:;
        Pp = Fromar4(P) + 10;
        if (A[Pp] == 1) {
          Outstring(_imp_str_literal("do "));
          Ccycbody(1, L2, L3);
          Setline();
          Outstring(_imp_str_literal(" while "));
          P = Pp + 1;
          Ccres = Ccond(0, 2, L1, 0);
        } else {
          Outstring(_imp_str_literal("for (;;) "));
          Ccycbody(1, L2, L1);
        }
      Wayout:;
        return;
      Sw_1:;
        Outstring(_imp_str_literal("while "));
        Ccres = Ccond(0, 1, L2, 0b11);
        P = Markui;
        Cui(1);
        goto Wayout;
      Sw_2:;
        P = Markui;
        Outstring(_imp_str_literal("do "));
        Cui(1);
        P = Markc;
        Outsep();
        Outstring(_imp_str_literal(" while "));
        Ccres = Ccond(0, 2, L1, 0);
        goto Wayout;
      Sw_6:;
      Sw_3:;
        Forcnt++;
        Forname = Fromar2(P);
        Initp = P + 2;
        Copytag(Forname, Yes);
        if ((Type != 7 && Type != 1) || 4 > Prec || Prec > 5 || Rout != 0 ||
            0 != Arr || Litl == 1) {
          Fault(91, 0, Forname);
          Ptype = 0x51;
        }
        Fot = Dname;
        if (Nam) Fot = Indname;
        Forpt = Ptype & 255;
        P = Initp;
        Skipexp();
        Stepp = P;
        Skipexp();
        Finalp = P;
        P = Stepp;
        Forexp(&Stepopnd, 1, 1);
        Outstring(_imp_str_literal(" for ("));
        if (Fot == Indname) Outsym('*');
        Outname(Forname);
        Outsym('=');
        P = Initp;
        Csexp(Forpt);
        Outsep();
        Outsym(' ');
        if (Fot == Indname) Outsym('*');
        Outname(Forname);
        if (Stepopnd.Flag <= 1) {
          if (!Stepopnd.D) Fault(92, 0, 0);
          if (Stepopnd.D < 0)
            Outstring(_imp_str_literal(">="));
          else
            Outstring(_imp_str_literal("<="));
        } else {
          Outstring(_imp_str_literal("<="));
          Warn(10, 0);
        }
        P = Finalp;
        Csexp(Forpt);
        Outsep();
        Outsym(' ');
        if (Fot == Indname) Outsym('*');
        Outname(Forname);
        if (Stepopnd.Flag <= 1 && Imod(Stepopnd.D) == 1)
          if (Stepopnd.D < 0)
            Outstring(_imp_str_literal("--"));
          else
            Outstring(_imp_str_literal("++"));
        else {
          Outstring(_imp_str_literal("+="));
          P = Stepp;
          Csexp(Forpt);
        }
        Outstring(_imp_str_literal(") "));
        P = Markui;
        if (Alt == 3)
          Cui(0);
        else
          Ccycbody(0, L2, L3);
        goto Wayout;
      Sw_4:;
        Setline();
        Outstring(_imp_str_literal("while "));
        Ccres = Ccond(0, 1, L2, 2);
        Ccycbody(0, L2, L1);
        goto Wayout;
      Sw_5:;
        P = Markui;
        Fline = Line;
        Outstring(_imp_str_literal("do "));
        Ccycbody(0, L2, L3);
        P = Markc;
        Line = Fline;
        Setline();
        Outsep();
        Outstring(_imp_str_literal(" while "));
        Ccres = Ccond(0, 2, L1, 0);
        goto Wayout;
        void Forexp(Rd * Eopnd, int Totemp, int Shift) {
          int Inp;
          int Val;
          int Subbits;
          int Exphead;
          int Expbot;
          int Nops;
          Exphead = 0;
          Expbot = 0;
          Nops = 0;
          Inp = P;
          P += 3;
          Torp(&Exphead, &Expbot, &Nops, 1);
          if (!((unsigned)Nops >> 16 & 7)) {
            Expop(&Exphead, &Expbot, Nops, 0x200 + Forpt);
            *Eopnd = Expopnd;
          } else
            Eopnd->Flag = 255;
        }
      }
      void Assign(int Assop, int P1) {
        int Q;
        int Kk;
        int Typep;
        int Precp;
        int Ptypep;
        int Jjj;
        int P2;
        int Jj;
        int B;
        int D;
        int Head2;
        int Bot2;
        int Accp;
        int Ii;
        int Head1;
        int Nops;
        int Tpcell;
        int Lvl;
        int Bot1;
        int Lhname;
        int Rhname;
        int A1;
        int A2;
        Listf *Lhcell;
        Rd Opnd1;
        Rd Opnd2;
        static int Sw_sw;
        static void *Sw[5 /*0:4*/] = {
            &&Sw_default, &&Sw_1, &&Sw_2, &&Sw_3, &&Sw_4,
        };
        P2 = P;
        Lhname = A[P1] << 8 | A[P1 + 1];
        Lhcell = &Aslist[Tags[Lhname]];
        P = P1;
        Reducetag(No);
        Ptypep = Ptype;
        Jj = J;
        Kk = K;
        Ii = I;
        Lvl = Oldi;
        Tpcell = Tcell;
        Accp = Acc;
        P = P2;
        Typep = Type;
        Precp = Prec;
        goto *Sw[Sw_sw = Assop];
      Sw_2:;
      Sw_3:;
        if (Type == 3) goto Recop;
        if (Type != 2 && Type != 5) Type = 1;
        if (Type == 5) goto St;
      Back:
        Head1 = 0;
        Bot1 = 0;
        Head2 = 0;
        Bot2 = 0;
        if (Type != 2) Type = 1;
        Typep = Type;
        Nops = (1 << 18) + 1;
        Ptype = Ptypep;
        Unpack();
        if (Lhsaddrfirst == No ||
            (Nam == 0 && 0 == Arr && A[P1 + 2] == 2 && 2 == A[P1 + 3])) {
          Opnd1 = (Rd){0};
          Opnd1.Ptype = Ptype;
          Opnd1.Flag = Arname;
          Binsert(&Head1, &Bot1, Opnd1.S1, P1, Lhname);
        } else {
          P = P1;
          Cname(3);
          Binsert(&Head1, &Bot1, Nameopnd.S1, Nameopnd.D, Nameopnd.Xtra);
        }
        P = P2 + 3;
        Torp(&Head2, &Bot2, &Nops, 0);
        Opnd2 = (Rd){0};
        Opnd2.Flag = Vass + Assop - 2;
        Binsert(&Head2, &Bot2, Opnd2.S1, Lhname << 16 | Ptypep, 0);
        Aslist[Bot1].Link = Head2;
        Head2 = 0;
        Bot1 = Bot2;
        if (Parm.Z) Printlist(Head1);
        Expop(&Head1, &Bot1, Nops, 256 + (Precp << 4) + Typep);
        Tripopt(Triples, Triples[0].Flink);
        Outopnd(&Expopnd, 0);
        return;
      St:;
        P = P1;
        if (Assop == 3) {
          Outstring(_imp_str_literal("imp_strjam("));
          if (Nam) Warn(10, 0);
        } else
          Outstring(_imp_str_literal("strcpy("));
        Cname(2);
        Outsym(',');
        P = P2;
        Cstrexp(0);
        if (Assop == 3) {
          Outsym(',');
          Outint(Accp - 1);
        }
        Outsym(')');
        return;
      Recop:;
        Q = Tsexp(&Jjj);
        if (Q == 1 && Jjj == 0) {
          Outstring(_imp_str_literal("memset("));
          P = P1;
          Cname(3);
          Outstring(_imp_str_literal(",0,"));
          Opnd1 = Nameopnd;
          Opnd2 = (Rd){0};
          Opnd2.Ptype = 0x51;
          Opnd2.Flag = Sconst;
          Outstring(_imp_str_literal("sizeof( "));
          P = P1;
          Reducetag(No);
          Outformatname(Kform);
          Outsym(')');
          Outsym(')');
          P = P2;
          Skipexp();
          return;
        }
        if (Assop == 3) {
          if (Type != 3 || A[P2 + 3] != 4 || A[P2 + 4] != 1) goto Back;
          Outstring(_imp_str_literal("memcpy("));
          P = P1;
          Cname(3);
          Outsym(',');
          Opnd1 = Nameopnd;
          Accp = Acc;
          P = P2 + 5;
          Cname(3);
          Outsym(',');
          Opnd2 = Nameopnd;
          if (A[P] != 2) {
            Fault(66, 0, Lhname);
            goto F00;
          }
          if (Accp > Acc) Accp = Acc;
          Outstring(_imp_str_literal("sizeof( "));
          P = P1;
          Reducetag(No);
          Outformatname(Kform);
          Outsym(')');
          Outsym(')');
          P = P2;
          Skipexp();
          return;
        }
        P = P1;
        Cname(7);
        Outstring(_imp_str_literal("="));
        P = P2 + 5;
        Cname(7);
        P = P2;
        Skipexp();
        return;
      Sw_4:;
        Outstring(_imp_str_literal("imp_resolve("));
        P = P1;
        Cname(2);
        Outsym(',');
        P = P2;
        if (Type == 5)
          Cres(0);
        else {
          Skipexp();
          if (Type != 7) Fault(71, 0, Lhname);
        }
        Outsym(')');
        return;
      Sw_1:;
        if (A[P2 + 3] != 4 || A[P2 + 4] != 1) goto F81;
        if (Nam != 1 || Litl == 1) {
          Fault(82, 0, Lhname);
          goto F00;
        }
        Lhformatname = Kform;
        if (Arr == 1) {
          Jj = 11;
          Kk = 12;
          Ii = Ahass;
          B = Aheadpt;
        } else {
          Jj = 6;
          Kk = 3;
          Ii = Ptras;
          B = 0x51;
          if (Ptrsize[Ptype & 255] > 4) B = 0x61;
        }
        P = P1;
        Cname(Jj);
        Outsym('=');
        P = P2 + 5;
        Rhname = A[P] << 8 | A[P + 1];
        if (Typep == 3) {
          Reducetag(No);
          if (Kform != Lhformatname) {
            Outsym('(');
            Outformatname(Lhformatname);
            Outstring(_imp_str_literal("*)"));
          }
        }
        Cname(Kk);
        if (Kk == 12) {
          if (!(Lhcell->Uioj & 15)) Lhcell->Uioj = Lhcell->Uioj | (J & 15);
          if (!Lhcell->Sndisp) Lhcell->Sndisp = Sndisp;
        }
        if (A[P] != 2) goto F81;
        P++;
        return;
      F83:
        Fault(83, Lhname, Rhname);
        goto F00;
      F86:
        Fault(86, Lhname, Rhname);
        goto F00;
      F81:
        Fault(81, 0, Lhname);
      F00:;
        P = P2;
        Skipexp();
        goto Sw_skip;
      Sw_default:
        fprintf(stderr, "\nSwitch label 'Sw(%d):' not set in %s\n", Sw_sw,
                __PRETTY_FUNCTION__);
        fflush(stderr);
        abort();
      Sw_skip:;
      }
      void Outopnd(Rd * Opnd, int Mode) {
        int I;
        int Pp;
        double R;
        static int Sw_sw;
        static void *Sw[10 /*0:9*/] = {
            &&Sw_0,       &&Sw_1,       &&Sw_2,       &&Sw_3, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_8, &&Sw_default,
        };
        if ((Mode & 1) == 1) Outsym('(');
        goto *Sw[Sw_sw = Opnd->Flag];
      Sw_0:;
      Sw_1:;
        if ((Opnd->Ptype & 7) == 1)
          if ((Opnd->Ptype & 0xf0) == 0x60)
            Outlhex(Opnd->D, Opnd->Xtra);
          else if ((Opnd->Ptype & 8) != 0 && Doinglabel == 0)
            if (((unsigned)Opnd->Ptype >> 4 & 7) == 3) {
              Outsym('\'');
              if (Opnd->D == '\\' || Opnd->D == '\'') Outsym('\\');
              Outsym(Opnd->D);
              Outsym('\'');
            } else
              Outhex(Opnd->D);
          else
            Outint(Opnd->D);
        if (Opnd->Ptype == 0x52) Outfl(Opnd->R, 7);
        if (Opnd->Ptype == 0x62) {
          *Integer(Addr(R)) = Opnd->D;
          *Integer(Addr(R) + 4) = Opnd->Xtra;
          Outfl(R, 15);
        }
        if (Opnd->Ptype == 0x72)
          Outstring(_imp_str_literal("NAN or unrepresentable value"));
        if (Opnd->Ptype == 0x35) {
          Outsym('"');
          Outstring(*String(Addr(A[Opnd->D])));
          Outsym('"');
        }
      Wayout:;
        if ((Mode & 1) == 1) Outsym(')');
        return;
      Sw_2:;
        Outname(Opnd->D);
        goto Wayout;
      Sw_3:;
        Pp = P;
        P = Opnd->D;
        if (Mode & 2)
          Cname(1);
        else
          Cname(2);
        P = Pp;
        goto Wayout;
      Sw_8:;
        Outtriple(Opnd->D, Mode & 0xff00);
        goto Wayout;
        goto Sw_skip;
      Sw_default:
        fprintf(stderr, "\nSwitch label 'Sw(%d):' not set in %s\n", Sw_sw,
                __PRETTY_FUNCTION__);
        fflush(stderr);
        abort();
      Sw_skip:;
      }
      void Outtriple(int Tripno, int Mode) {
        Tripf *Trip;
        static const _imp_string Rsassop[128+8 /*128:135*/] = { // [8 /*128:135*/]
            [0 ... 127 ] = _imp_str_literal(""),
            _imp_str_literal("+="), _imp_str_literal("-="),
            _imp_str_literal("^="), _imp_str_literal("|="),
            _imp_str_literal("*="), [5 ... 6] = _imp_str_literal("/="),
            _imp_str_literal("&=")};
        _imp_string Op;
        _imp_string Opl;
        int Case;
        int I;
        int J;
        static int Sw_sw;
        static void *Sw[193 /*0:192*/] = {
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_10,      &&Sw_11,
            &&Sw_12,      &&Sw_default, &&Sw_14,      &&Sw_15,
            &&Sw_16,      &&Sw_default, &&Sw_18,      &&Sw_19,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_128,     &&Sw_129,     &&Sw_130,     &&Sw_131,
            &&Sw_132,     &&Sw_133,     &&Sw_134,     &&Sw_135,
            &&Sw_136,     &&Sw_137,     &&Sw_138,     &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_143,
            &&Sw_144,     &&Sw_145,     &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_default,
            &&Sw_default, &&Sw_default, &&Sw_default, &&Sw_191,
            &&Sw_default,
        };
        Trip = &Triples[Tripno];
        if (Mode == 1 && Doinglabel == 0) Outsym('(');
        Case = Trip->Opern;
        goto *Sw[Sw_sw = Case];
      Sw_128:;
        Op = _imp_str_literal("+");
        Opl = _imp_str_literal("plus");
      Binop:;
        Outopnd(&Trip->Opnd1, Mode & 0xff00 | (unsigned)Trip->Opnd1.Flag >> 3 & 1);
        if (Doinglabel)
          Outstring(Opl);
        else
          Outstring(Op);
        Outopnd(&Trip->Opnd2, Mode & 0xff00 | (unsigned)Trip->Opnd2.Flag >> 3 & 1);
      Wayout:;
        if (Mode == 1 && Doinglabel == 0) Outsym(')');
        return;
      Sw_129:
        Op = _imp_str_literal("-");
        Opl = _imp_str_literal("minus");
        goto Binop;
      Sw_130:
        Op = _imp_str_literal("^");
        Opl = _imp_str_literal("non");
        goto Binop;
      Sw_131:
        Op = _imp_str_literal("|");
        Opl = _imp_str_literal("or");
        goto Binop;
      Sw_132:
        Op = _imp_str_literal("*");
        Opl = _imp_str_literal("mul");
        goto Binop;
      Sw_133:
        Op = _imp_str_literal(" / ");
        Opl = _imp_str_literal("idiv");
        goto Binop;
      Sw_134:
        Op = _imp_str_literal(" / ");
        Opl = _imp_str_literal("div");
        goto Binop;
      Sw_135:
        Op = _imp_str_literal("&");
        Opl = _imp_str_literal("and");
        goto Binop;
      Sw_136:
        Op = _imp_str_literal(">>");
        Opl = _imp_str_literal("rsh");
        if (!Doinglabel)
          if ((Trip->Opnd1.Ptype & 0xff) == 0x61)
            Outstring(_imp_str_literal("(unsigned long long)"));
          else
            Outstring(_imp_str_literal("(unsigned)")); // unsigned long? unsigned int?
        goto Binop;
      Sw_137:
        Op = _imp_str_literal("<<");
        Opl = _imp_str_literal("lsh");
        goto Binop;
      Sw_145:;
        Outstring(_imp_str_literal("(int)"));
      Sw_138:;
        Outstring(_imp_str_literal("pow("));
        Outopnd(&Trip->Opnd1, Mode & 0xff00);
        Outstring(_imp_str_literal(","));
        Outopnd(&Trip->Opnd2, Mode & 0xff00);
        Outstring(_imp_str_literal(")"));
        goto Wayout;
      Sw_191:;
        if (Add <= Trip->X1 && Trip->X1 <= Sub && 0 <= Trip->Opnd2.Flag &&
            Trip->Opnd2.Flag <= 1 && Trip->Opnd2.D == 1 &&
            (Trip->Opnd1.Ptype & 0xff00) == 0) {
          Outopnd(&Trip->Opnd1, Mode & 0xff00);
          if (Trip->X1 == Add)
            Outstring(_imp_str_literal("++"));
          else
            Outstring(_imp_str_literal("--"));
          goto Wayout;
        }
        Op = Rsassop[Trip->X1];
        goto Assop;
      Sw_143:
      Sw_144:;
        Op = _imp_str_literal("=");
      Assop:;
        Outopnd(&Trip->Opnd1, Mode & 0xff00 | 2);
        Outstring(Op);
        Outopnd(&Trip->Opnd2, Mode & 0xff00 | 0);
        goto Wayout;
      Sw_10:
        Op = _imp_str_literal("~");
        Opl = _imp_str_literal("not");
      Unaryop:;
        if (Doinglabel)
          Outstring(Opl);
        else
          Outstring(Op);
        Outopnd(&Trip->Opnd1, Mode & 0xff00 | (unsigned)Trip->Opnd1.Flag >> 3 & 1);
        goto Wayout;
      Sw_11:;
        Op = _imp_str_literal("-");
        Opl = _imp_str_literal("uminus");
        goto Unaryop;
      Sw_12:;
        if (Trip->Opnd1.Flag == Sconst) {
          Trip->Opnd1.Ptype = 0x62;
          {
            double X;
            X = Trip->Opnd1.D;
            Trip->Opnd1.D = *Integer(Addr(X));
            Trip->Opnd1.Xtra = *Integer(Addr(X) + 4);
          }
          Op = _imp_str_literal("");
          goto Unaryop;
        }
        Op = _imp_str_literal("(double)");
        goto Unaryop;
      Sw_14:
      Sw_15:
      Sw_16:
      Sw_18:
      Sw_19:;
        Outopnd(&Trip->Opnd1, Mode & 0xff00 | 0);
        goto Sw_skip;
      Sw_default:
        fprintf(stderr, "\nSwitch label 'Sw(%d):' not set in %s\n", Sw_sw,
                __PRETTY_FUNCTION__);
        fflush(stderr);
        abort();
      Sw_skip:;
      }
      void Csexp(int Mode) {
        int Exphead;
        int Nops;
        int Expbot;
        int Form;
        Exphead = 0;
        Expbot = 0;
        Nops = 0;
        Form = 0;
        P += 3;
        if (A[P] == 4 && A[P + 1] == 3) Form = 1;
        Torp(&Exphead, &Expbot, &Nops, 0);
        Expop(&Exphead, &Expbot, Nops, Mode & 0xffff);
        Outopnd(&Expopnd, Form | (unsigned)Mode >> 16);
      }
      void Labexp(void) {
        Doinglabel = 1;
        Csexp(0x51);
        Doinglabel = 0;
      }
      int Constexp(int Prectype) {
        int Exphead;
        int Expbot;
        int Nops;
        int Res;
        Exphead = 0;
        Expbot = 0;
        Nops = 0;
        Res = 0;
        Torp(&Exphead, &Expbot, &Nops, 1);
        Expop(&Exphead, &Expbot, Nops, 0x200 + Prectype);
        if (Expopnd.Flag > 1) goto Wayout;
        Res = Addr(Expopnd.D);
      Wayout:;
        return (Res);
      }
      int Intexp(int *Value, int Prectype) {
        int Exphead;
        int Expbot;
        int Nops;
        int Code;
        int Sptype;
        int Sacc;
        Exphead = 0;
        Expbot = 0;
        Nops = 0;
        Code = 0;
        Sptype = Ptype;
        Sacc = Acc;
        Torp(&Exphead, &Expbot, &Nops, 1);
        Expop(&Exphead, &Expbot, Nops, 0x200 + Prectype);
        if (Expopnd.Flag > 1 || (Expopnd.Ptype & 0x77) != Prectype) Code = 1;
        *Value = Expopnd.D;
        Acc = Sacc;
        Ptype = Sptype;
        Unpack();
        return (Code);
      }
      void Torp(int *Head, int *Bot, int *Nops, int Mode) {
        static int Operand_sw;
        static void *Operand[3 /*1:3*/] = {
            &&Operand_1,
            &&Operand_2,
            &&Operand_3,
        };
        static const unsigned char Precedence[21 /*0:20*/] = {
            0, 3, 3, 4, 5, 5, 4, 3, 3, 4, 4, 5, 5, 3, 5, 5, [16 ... 18] = 0,
            3, 5};
        static const unsigned char Opval[21 /*0:20*/] = {0,
                                                         128,
                                                         129,
                                                         135,
                                                         145,
                                                         138,
                                                         132,
                                                         130,
                                                         131,
                                                         133,
                                                         134,
                                                         136,
                                                         137,
                                                         128,
                                                         145,
                                                         138,
                                                         [16 ... 18] = 0,
                                                         11,
                                                         10};
        int Rphead;
        int Passhead;
        int Savehead;
        int Real;
        int Realop;
        int Operator;
        int Opprec;
        int Opnd;
        int C;
        int D;
        int E;
        int Bdisp;
        int Opname;
        int Opmask;
        int Rpbot;
        int Opstk;
        int Oppstk;
        int Passbot;
        int Pin;
        Tagf *Lcell;
        Rd Rpop;
        Passhead = 0;
        Rphead = 0;
        Savehead = 0;
        Real = 0;
        Realop = 0;
        Bdisp = 0;
        Rpbot = 0;
        Opstk = 0;
        Oppstk = 0;
        Pin = P;
        C = A[P];
        if (2 <= C && C <= 3) {
          *Nops = *Nops + 1;
          Opstk = C + 17;
          Oppstk = Precedence[Opstk];
          Opmask = 1 << (19 + C);
        } else
          Opmask = 0;
      Nextopnd:
        Opnd = A[P + 1];
        P += 2;
        Rpop = (Rd){0};
        goto *Operand[Operand_sw = (Opnd)-1];
      Operand_1:;
        Opname = (A[P] << 8) + A[P + 1];
        Lcell = (Tagf *)&Aslist[Tags[Opname]]; /*gt: Tagf vs Listf*/
        Lcell->Uioj = Lcell->Uioj | 0x8000;
        Ptype = Lcell->Ptype;
        Type = Ptype & 7;
        Prec = (unsigned)Ptype >> 4 & 15;
        if (Ptype == 0xFFFF) Ptype = 0x51;
        if (Ptype == Snpt) {
          Ptype = Lcell->Acc;
          Unpack();
        }
        if ((Mode != 0 ||
             _imp_strcmp(*String(Addr(Worka.Lett)), _imp_str_literal("pi"))==0) &&
            (Ptype & 0xFF00) == 0x4000 && A[P + 2] == 2 && 2 == A[P + 3] &&
            1 <= Type && Type <= 2) {
          Rpop.D = Lcell->S2;
          Rpop.Xtra = Lcell->S3;
          Rpop.Flag = 1;
          Ptype = Ptype & 255;
          if (Type == 1 && Prec <= 5 && 0xFFFF8000 < Rpop.D &&
              Rpop.D <= 0x7FFF) {
            Rpop.Flag = 0;
            Ptype = Minapt;
          }
          if (Type == 2) Real = 1;
          P += 2;
          goto Sknam;
        }
        Rpop.Xtra = Opname;
        Rpop.Flag = Arname;
        Rpop.D = P;
        if (Ptype == 0x57) Ptype = 0x51;
        if (Type == 3) {
          D = P;
          Kform = Lcell->Kform;
          C = Copyrecordtag(&E);
          P = D;
        }
        if (Type == 5) {
          Fault(76, 0, Opname);
          Rpop.Flag = 0;
          Ptype = 0x51;
        }
        if (Prec >= 6) Opmask = Opmask | 1 << 17;
        if (Type == 2) Real = 1;
        P += 2;
      Sknam:
        if (A[P] == 2)
          P++;
        else
          Skipapp();
        if (A[P] == 1) {
          P += 3;
          goto Sknam;
        }
        P += 2;
      Ins:
        if (Rpop.Flag == Arname) Opmask = Opmask | 1 << 18;
        if (((unsigned)Ptype >> 4 & 15) > 5) Opmask = Opmask | 1 << 17;
        if (3 <= (Ptype & 7) && (Ptype & 7) <= 7) Ptype = 0x51;
        Rpop.Ptype = Ptype;
        Binsert(&Rphead, &Rpbot, Rpop.S1, Rpop.D, Rpop.Xtra);
        goto Op;
      Operand_2:;
        Ptype = A[P];
        D = (unsigned)Ptype >> 4;
        C = Ptype & 7;
        if ((Ptype == 0x61 && (1 << Target & Lintavail) == 0) ||
            (D == 7 && C == 2 && (1 << Target & Llrealavail) == 0))
          Fault(99, 0, 0);
        if (D >= 6) Opmask = Opmask | 1 << 17;
        if (D == 4 || D == 3) {
          D = 4;
          Rpop.D = Fromar2(P + 1);
        } else
          Rpop.D = Fromar4(P + 1);
        if (C == 2) Real = 1;
        Rpop.Flag = 1;
        if (D == 6) Rpop.Xtra = Fromar4(P + 5);
        if (C == 5) {
          Fault(77, 0, 0);
          Rpop.D = 1;
          Rpop.Flag = 0;
          P = P + A[P + 1] + 3;
          Ptype = 0x51;
        } else {
          if (D == 7) {
            Rpop.Xtra = Rpop.D;
            Rpop.D = P + 1;
          }
          if (Ptype == 0x51 && 0xFFFF8000 <= Rpop.D && Rpop.D <= 0x7FFF) {
            Rpop.Flag = 0;
            Ptype = Minapt;
          }
          P = P + 2 + Bytes[D];
        }
        goto Ins;
      Operand_3:;
        Passhead = 0;
        Passbot = 0;
        P += 3;
        Torp(&Passhead, &Passbot, Nops, Mode);
        if (Type == 2) Real = 1;
        if (!Rpbot)
          Rphead = Passhead;
        else
          Aslist[Rpbot].Link = Passhead;
        Rpbot = Passbot;
        P++;
      Op:;
        Rpop = (Rd){0};
        if (A[P - 1] == 2) goto Eoe;
        Operator = A[P];
        if (Operator == Concop) Fault(78, 0, 0);
        Opprec = Precedence[Operator];
        C = Opval[Operator];
        if (C == Realdiv || C == Rexp) Real = 1;
        *Nops = *Nops + 1;
        while (Opprec <= (Oppstk & 31)) {
          Rpop.Flag = Opval[Opstk & 31];
          Binsert(&Rphead, &Rpbot, Rpop.S1, 0, 0);
          Opstk = (unsigned)Opstk >> 5;
          Oppstk = (unsigned)Oppstk >> 5;
        }
        Opstk = Opstk << 5 | Operator;
        Oppstk = Oppstk << 5 | Opprec;
        goto Nextopnd;
      Eoe:;
        while (Opstk) {
          Rpop.Flag = Opval[Opstk & 31];
          Binsert(&Rphead, &Rpbot, Rpop.S1, 0, 0);
          Opstk = (unsigned)Opstk >> 5;
        }
        Ptype = Real + 1;
        Type = Ptype;
        if (!*Head)
          *Bot = Rpbot;
        else
          Aslist[Rpbot].Link = *Head;
        *Head = Rphead;
        *Nops = *Nops | Opmask;
      }
      void Expop(int *Head, int *Bot, int Nops, int Mode) {
        auto void Pseval(void);
        int Operand[3 /*0:2*/];
        int Stk[100 /*0:99*/];
        Listf *List;
        Rd *Opnd1;
        Rd *Opnd2;
        Rd *Opnd;
        Tripf *Currt;
        int C;
        int D;
        int Kk;
        int Jj;
        int Comm;
        int Xtra;
        int Inhead;
        int Currtrip;
        int Stptr;
        int Constform;
        int Condform;
        int Savep;
        int Inittrip;
        static const unsigned short Corules[21 /*0:20*/] = {
            0x1FF, 0xFF, 0x1F1, 0x1F1, 0x1FF, 0xF1,  0xF2,
            0x1F1, 0x71, 0x71,  0x43,  0x1FF, 0xFF,  0x21,
            0x1F1, 0x14, 0x54,  0x71,  0x01,  0x001, 0x100};
        static const int Ptypech[20 /*0:19*/] = {
            [0 ... 11] = 0, 0x11, 0, -16, 0x10, -16, [17 ... 19] = 0};
        Stptr = 0;
        Constform = Mode & 512;
        Inittrip = Nexttrip;
        Condform = Mode & 256;
        Savep = P;
        Inhead = *Head;
        Pseval();
      Next:
        List = &Aslist[Inhead];
        Xtra = List->S2;
        Jj = List->Flag;
        D = Inhead;
        Inhead = List->Link;
        if (Jj >= 10) goto Operator;
        Opnd1 = (Rd *)&Aslist[D];    /*gt: Rd vs Listf */
        Stk[Stptr] = D;
        Stptr++;
        if (Stptr > 99) Impabort();
      Anymore:;
        if (Inhead) goto Next;
        Opnd1 = (Rd *)&Aslist[Stk[Stptr-1]];    /*gt: Rd vs Listf */
        Expopnd = *Opnd1;
        goto Finish;
      Operator:;
        if (Jj < 128)
          Kk = 1;
        else
          Kk = 2;
        for (Kk = Kk; Kk >= 1; Kk--) {
          Stptr--;
          Operand[Kk] = Stk[Stptr];
        }
        Comm = 1;
        Opnd1 = (Rd *)&Aslist[Operand[1]];    /*gt: Rd vs Listf */
        if (Jj >= 128) {
          Opnd2 = (Rd *)&Aslist[Operand[2]];    /*gt: Rd vs Listf */
        } else
          Opnd2 = Record(0); /* gt: could put Opnd2 = NULL? */
        if (Jj < 128)
          C = 0;
        else
          C = Corules[Jj - 128];
        if (Jj == Vass || Jj == Vjass)
          Kk = 1;
        else
          Kk = 2;
        if (Constform != 0 && Opnd1->Flag < 2 && (Jj < 128 || Opnd2->Flag < 2))
          Ctop(&Jj, &Mask, Xtra, Opnd1, Opnd2);
        if (Jj) {
          Currtrip = Newtrip();
          Currt = &Triples[Currtrip];
          Currt->Dpth = 0;
          Currt->Cnt = 0;
          Currt->Flags = 1 | ((unsigned)C >> 1 & 128);
          Currt->Opern = Jj;
          Currt->Optype = Opnd1->Ptype;
          if (12 <= Jj && Jj <= 16) {
            Currt->Optype = Xtra;
            Xtra = 0;
          } else if ((Opnd1->Ptype & 7) == 1 && (Opnd1->Ptype & 255) < Minapt)
            Currt->Optype = Minapt;
          if ((Target == Perq || Target == Accent || Target == Pnx) &&
              Jj == 39 && (unsigned)Xtra >> 20 == 1)
            Currt->Flags = Currt->Flags | Dontopt;
          Currt->X1 = Xtra;
          Currt->Opnd1 = *Opnd1;
          if (1 << Opnd1->Flag & Btrefmask) Keepusecount(Opnd1);
          if (Jj >= 128) {
            Currt->Opnd2 = *Opnd2;
            if (1 << Opnd2->Flag & Btrefmask) Keepusecount(Opnd2);
          }
          Opnd1->Flag = 8;
          Opnd1->Ptype = Currt->Optype;
          Opnd1->D = Currtrip;
        }
        Stk[Stptr] = Operand[Comm];
        Stptr++;
        goto Anymore;
      Finish:;
        //            %if EXPOPND_FLAG=ARNAME %then %start
        //               P = EXPOPND_D
        //               CNAME(2)
        //               EXPOPND = NAMEOPND
        //            %finish
        Ptype = Expopnd.Ptype;
        Type = Ptype & 7;
        Prec = (unsigned)Ptype >> 4;
        P = Savep;
        Aslist[*Bot].Link = Asl;
        Asl = *Head;
        *Head = 0;
        *Bot = 0;
        return;
        void Pseval(void) {
          auto void Amend(Rd * Opnd, int Op);
          auto void Coercet(int Rules);
          auto void Coercep(int Rules);
          int Tmphead;
          int Inhead;
          int C;
          int Jj;
          int Next;
          Rd *Opnd1;
          Rd Opnd2;
          Rd Rpop;
          Listf *Cell;
          if (Aslist[*Bot].Link) {
            Printlist(*Head);
            Impabort();
          }
          Rpop = (Rd){0};
          Tmphead = 0;
          Inhead = *Head;
          while (Inhead) {
            Cell = &Aslist[Inhead];
            Next = Cell->Link;
            Rpop = *(Rd *)Cell; //  RPOP <- CELL;          ! COPY BEFOR ADJUSTING PTYPE
            Jj = Rpop.Flag;
            if (Jj < 10)
              Push(&Tmphead, Rpop.S1, Rpop.D, Inhead);
            else {
              if (Jj >= 128) {
                Pop(&Tmphead, &Opnd2.S1, &Opnd2.D, &Opnd2.Xtra);
                Opnd1 = (Rd *)&Aslist[Tmphead];   /*gt: Rd vs Listf again*/
                C = Corules[Jj - 128];
                if (Jj == Rexp && (Opnd2.Ptype & 7) == 2) C = 0xF2;
                if (C & 15) Coercet(C & 15);
                if ((unsigned)C >> 4 & 15) Coercep((unsigned)C >> 4 & 15);
              } else {
                Opnd1 = (Rd *)&Aslist[Tmphead];   /*gt: Rd vs Listf again*/
                if (Jj == Modulus) {
                  if ((Opnd1->Ptype & 7) == 1 && (Rpop.D & 7) == 2) Coercet(3);
                  if (((unsigned)Opnd1->Ptype >> 4 & 15) <
                      ((unsigned)Rpop.D >> 4 & 15))
                    Amend(Opnd1, Lngthn);
                  if (((unsigned)Opnd1->Ptype >> 4 & 15) >
                      ((unsigned)Rpop.D >> 4 & 15))
                    Amend(Opnd1, Shrtn);
                } else if (Jj < 19)
                  Opnd1->Ptype = Opnd1->Ptype + Ptypech[Jj];
              }
              Opnd1->Xtra = Inhead;
            }
            Inhead = Next;
          }
          Pop(&Tmphead, &Opnd2.S1, &Opnd2.D, &Opnd2.Xtra);
          if (Tmphead) {
            Printlist(*Head);
            Impabort();
          }
          if (!Condform) {
            if ((Mode & 7) == 1 && (Opnd2.Ptype & 7) == 2) Fault(25, 0, 0);
            if ((Opnd2.Ptype & 7) == 1 && (Mode & 7) == 2) Amend(&Opnd2, Ifloat);
            C = (unsigned)Mode >> 4 & 15;
            while (C < ((unsigned)Opnd2.Ptype >> 4 & 15)) Amend(&Opnd2, Shrtn);
            while (C > ((unsigned)Opnd2.Ptype >> 4 & 15)) Amend(&Opnd2, Lngthn);
          }
          if (Parm.DcompX != 0 && Parm.Z != 0) Printlist(*Head);
          while (Aslist[*Bot].Link) *Bot = Aslist[*Bot].Link;
          return;
          void Amend(Rd * Opnd, int Op) {
            Rd Rpop;
            if ((1 << Target & Emachine) == 0 && Op == Lngthn &&
                (Opnd->Ptype & 255) < Minapt) {
              Opnd->Ptype = Opnd->Ptype & 0xFF00 | Minapt;
              return;
            }
            Rpop = (Rd){0};
            Rpop.Flag = Op;
            if (Op == Ifloat && (Opnd->Ptype & 255) < Minapt)
              Opnd->Ptype = Minapt;
            Opnd->Ptype = Opnd->Ptype + Ptypech[Op];
            if ((1 << Target & Llrealavail) == 0 && Op == Ifloat &&
                (Opnd->Ptype & 255) == 0x72)
              Opnd->Ptype = Opnd->Ptype - 0x10;
            Insertafter(&Opnd->Xtra, Rpop.S1, Opnd->Ptype, 0);
            Nops++;
          }
          void Coercet(int Rules) {
            int Pt1;
            int Pt2;
            Rd Rpop;
            Rpop = (Rd){0};
            Rpop.Flag = 12;
            Pt1 = Opnd1->Ptype & 7;
            Pt2 = Opnd2.Ptype & 7;
            if (Pt2 == 7) Pt2 = 1;
            if (Rules == 4) Pt1 = Cell->S2 & 7;
            if (Pt1 == 7) Pt1 = 1;
            if ((Rules == 1 || Rules == 15 || Rules == 4) && Pt1 == 1 &&
                1 == Pt2)
              return;
            if (Rules == 1 || (Rules == 4 && Pt1 == 1)) {
              Fault(24, 0, 0);
              return;
            }
            if (Pt1 == 1) Amend(Opnd1, Ifloat);
            if (Pt2 == 1 && (Rules == 2 || Rules == 4 || Rules == 15))
              Amend(&Opnd2, Ifloat);
          }
          void Coercep(int Rules) {
            int Prec1;
            int Prec2;
            int Tprec;
            int Oper;
            Rd *Opnd;
            Rd Rpop;
            Rpop = (Rd){0};
            if (Rules == 6) {
              Coercep(4);
              Rules = 2;
            }
            Prec1 = (unsigned)Opnd1->Ptype >> 4 & 15;
            Prec2 = (unsigned)Opnd2.Ptype >> 4 & 15;
            if (Rules == 5 || Rules == 1) {
              Prec1 = (unsigned)Cell->S2 >> 4 & 15;
              if (Prec2 > Prec1) {
                do {
                  if (Rules == 1)
                    Oper = Shrtn;
                  else
                    Oper = Jamshrtn;
                  Amend(&Opnd2, Oper);
                  Prec2--;
                } while (Prec1 != Prec2);
                return;
              } else
                Rules = 1;
            }
            if (Prec1 < Minaprec) {
              Prec1 = Minaprec;
              Opnd1->Ptype = Opnd1->Ptype & 0xFF0F | (Minaprec << 4);
            }
            if (Prec2 < Minaprec) {
              Prec2 = Minaprec;
              Opnd2.Ptype = Opnd2.Ptype & 0xFF0F | (Minaprec << 4);
            }
            if (Rules == 7) {
              Rules = 4;
              if (Prec1 == 4) {
                Amend(Opnd1, Lngthn);
                Prec1 = 5;
              }
            }
            if (2 <= Rules && Rules <= 4) {
              if (Rules <= 2)
                Opnd = Opnd1;
              else
                Opnd = &Opnd2;
              if ((Opnd->Ptype & 0xFF) > Minapt) Amend(Opnd, Shrtn);
              return;
            }
            if (Prec1 < Prec2) {
              Tprec = Prec2;
              Opnd = Opnd1;
            } else {
              Tprec = Prec1;
              Opnd = &Opnd2;
            }
            Oper = Opnd->Ptype;
            while (((unsigned)Opnd->Ptype >> 4 & 15) < Tprec)
              Amend(Opnd, Lngthn);
          }
        }
      }
      int Ccond(int Cto, int Iu, int Farlab, int Jflags) {
        auto void Skipsc(int Reversed);
        auto void Skipcond(int Reversed);
        //auto int Ccomp(void);
        //auto void Jump(int Mask, int Lab, int Flags);
        //auto void Notejump(int Lab);
        //auto void Labunused(int Lab);
        //auto void Omitto(int Lab);
        int Pin;
        int Pp;
        int Ii;
        int L;
        int Cptr;
        int Cmax;
        int Ll;
        int Bitmask;
        int Lla;
#undef Cf
        typedef struct Cf {
          unsigned char Tf;
          unsigned char Cmp1;
          unsigned char Cmp2;
          unsigned char Labu;
          unsigned char Lvl;
          unsigned char Jmp;
          unsigned char Rev;
          unsigned char Jumped;
          int Labno;
          int Sp1;
          int Sp2;
          int Sp3;
        } Cf;
        Cf Clist[31 /*0:30*/];
        Cf *C1;
        Cf *C2;
        Pin = P;
        Cptr = 1;
        L = 3;
        C1 = &Clist[Cptr];
        *C1 = (Cf){0};
        Outsym('(');
        if (Iu == 2) {
          Skipsc(1);
          Skipcond(1);
        } else {
          Skipsc(0);
          Skipcond(0);
        }
        Outstring(_imp_str_literal(") "));
        return (0);
        void Skipsc(int Reversed) {
          static const _imp_string Cmp[11 /*0:10*/] = {
              _imp_str_literal(" ??? "), _imp_str_literal("=="),
              _imp_str_literal(">="),    _imp_str_literal(">"),
              _imp_str_literal("!="),    _imp_str_literal("<="),
              _imp_str_literal("<"),     _imp_str_literal("!="),
              _imp_str_literal("?->??"), _imp_str_literal("=="),
              _imp_str_literal("!=")};
          static const _imp_string Revcmp[11 /*0:10*/] = {
              _imp_str_literal(" ??? "),  _imp_str_literal("!="),
              _imp_str_literal("<"),      _imp_str_literal("<="),
              _imp_str_literal("=="),     _imp_str_literal(">"),
              _imp_str_literal(">="),     _imp_str_literal("=="),
              _imp_str_literal("!?->??"), _imp_str_literal("!="),
              _imp_str_literal("==")};
          static int Scalt_sw;
          static void *Scalt[4 /*1:4*/] = {
              &&Scalt_1,
              &&Scalt_2,
              &&Scalt_3,
              &&Scalt_4,
          };
          int Alt;
          int Te1;
          int Te2;
          int Precp;
          int Typep;
          int Finalp;
#undef Rexp
          int Rexp;
          Alt = A[P];
          P++;
          goto *Scalt[Scalt_sw = (Alt)-1];
        Scalt_1:;
          C1->Sp1 = P;
          Te1 = Tsexp(&Te2);
          Typep = Type;
          Precp = Prec;
          P = C1->Sp1;
          Skipexp();
          C1->Cmp1 = A[P];
          C1->Rev = 3 * Reversed;
          P++;
          C1->Sp2 = P;
          Skipexp();
          if (A[P] == 2)
            P++;
          else {
            C1->Cmp2 = A[P + 1];
            P += 2;
            C1->Sp3 = P;
            Skipexp();
          }
          Finalp = P;
          if (Typep == 5) {
            P = C1->Sp1;
            if (C1->Cmp1 == 8) {
              Outstring(_imp_str_literal("imp_resolve("));
              P += 5;
              Cname(2);
              Outsym(',');
              P = C1->Sp2;
              Cres(1);
              if (Reversed == 1) {
                Outstring(_imp_str_literal(")!=0"));
              } else
                Outstring(_imp_str_literal(")==0"));
              if (C1->Cmp2) Outstring(_imp_str_literal("untranslateable cond"));
            } else {
              if (C1->Cmp2) Outsym('(');
              Outstring(_imp_str_literal("strcmp("));
              Cstrexp(0);
              Outsym(',');
              P = C1->Sp2;
              Cstrexp(0);
              Outsym(')');
              if (Reversed == 1) {
                Outstring(Revcmp[C1->Cmp1]);
              } else
                Outstring(Cmp[C1->Cmp1]);
              Outsym('0');
              if (C1->Cmp2) {
                if (Reversed == 1) {
                  Outstring(_imp_str_literal(") || ("));
                } else
                  Outstring(_imp_str_literal(") && ("));
                P = C1->Sp2;
                Cstrexp(0);
                Outsym(',');
                P = C1->Sp3;
                Cstrexp(0);
                Outsym(')');
              }
            }
          } else {
            if (C1->Cmp2) Outsym('(');
            P = C1->Sp1;
            Rexp = 2 - A[P + 1 + Fromar2(P + 1)];
            if (Rexp) Outsym('(');
            if (C1->Cmp1 > 8) {
              P += 5;
              Cname(4);
            } else
              Csexp(Precp << 4 | Typep | 256);
            if (Rexp) Outsym(')');
            if (Reversed == 1) {
              Outstring(Revcmp[C1->Cmp1]);
            } else
              Outstring(Cmp[C1->Cmp1]);
            P = C1->Sp2;
            Rexp = 2 - A[P + 1 + Fromar2(P + 1)];
            if (Rexp) Outsym('(');
            if (C1->Cmp1 > 8) {
              P += 5;
              Cname(4);
            } else
              Csexp(Precp << 4 | Typep | 256);
            if (Rexp) Outsym(')');
            if (C1->Cmp2) {
              if (Reversed == 1)
                Outstring(_imp_str_literal(") || ("));
              else
                Outstring(_imp_str_literal(") && ("));
              if (Rexp) Outsym('(');
              P = C1->Sp2;
              Csexp(Precp << 4 | Typep);
              if (Rexp) Outsym(')');
              if (Reversed == 1) {
                Outstring(Revcmp[C1->Cmp1]);
              } else
                Outstring(Cmp[C1->Cmp2]);
              P = C1->Sp3;
              Rexp = 2 - A[P + 1 + Fromar2(P + 1)];
              if (Rexp) Outsym('(');
              Csexp(Precp << 4 | Typep);
              if (Rexp) Outsym(')');
              Outsym(')');
            }
          }
          P = Finalp;
          return;
        Scalt_2:;
          Outsym('(');
          L++;
          Skipsc(Reversed);
          Skipcond(Reversed);
          L--;
          Outsym(')');
          return;
        Scalt_3:;
          Skipsc(Reversed ^ 1);
          return;
        Scalt_4:;
          if (Reversed == 1)
            Outstring(
                _imp_str_literal("/* what is a pseudo-boolean? - is the "
                                 "conditio accidentally inverted? */"));
          Csexp(0x51);
        }
        void Skipcond(int Reversed) {
          int Alt;
          int Altp;
          Alt = A[P];
          P++;
          if (Alt != 3) do {
              C1->Lvl = L;
              C1->Tf = Alt;
              C1->Tf = C1->Tf ^ (3 * Reversed);
              if (Reversed == 1)
                if (Alt == 1)
                  Outstring(_imp_str_literal(" || "));
                else
                  Outstring(_imp_str_literal(" && "));
              else if (Alt == 1)
                Outstring(_imp_str_literal(" && "));
              else
                Outstring(_imp_str_literal(" || "));
              Cptr++;
              C1 = &Clist[Cptr];
              *C1 = (Cf){0};
              Skipsc(Reversed);
              Altp = A[P];
              P++;
            } while (Altp != 2);
        }
      }
      int Reverse(int Mask) {
        if (Mask == 0 || Mask == 15) return (Mask ^ 15);
        return (Mask ^ 0x8F);
      }
      int Enterlab(int Lab, int Flags) { return (0); }
      void Enterjump(int Tfmask, int Lab, int Flags) {}
      void Removelab(int Lab) {}
      int Createah(int Mode, Rd *Eopnd, Rd *Nopnd) {
        int Jj;
        Jj = Brectrip(Ahadj, Aheadpt, 0, Eopnd, Nopnd);
        Triples[Jj].X1 = Ptype << 4 | Mode;
        return (Jj);
      }
      void Csname(int Z) {
        //auto int Optmap(void);
        static int Adhoc_sw;
        static void *Adhoc[68 /*0:67*/] = {
            &&Adhoc_0,       &&Adhoc_1,       &&Adhoc_2,       &&Adhoc_3,
            &&Adhoc_4,       &&Adhoc_default, &&Adhoc_6,       &&Adhoc_7,
            &&Adhoc_8,       &&Adhoc_9,       &&Adhoc_10,      &&Adhoc_default,
            &&Adhoc_12,      &&Adhoc_13,      &&Adhoc_14,      &&Adhoc_15,
            &&Adhoc_16,      &&Adhoc_17,      &&Adhoc_default, &&Adhoc_19,
            &&Adhoc_20,      &&Adhoc_21,      &&Adhoc_22,      &&Adhoc_23,
            &&Adhoc_24,      &&Adhoc_25,      &&Adhoc_26,      &&Adhoc_27,
            &&Adhoc_28,      &&Adhoc_29,      &&Adhoc_30,      &&Adhoc_default,
            &&Adhoc_32,      &&Adhoc_default, &&Adhoc_default, &&Adhoc_default,
            &&Adhoc_36,      &&Adhoc_37,      &&Adhoc_38,      &&Adhoc_39,
            &&Adhoc_40,      &&Adhoc_41,      &&Adhoc_42,      &&Adhoc_default,
            &&Adhoc_default, &&Adhoc_45,      &&Adhoc_46,      &&Adhoc_47,
            &&Adhoc_48,      &&Adhoc_49,      &&Adhoc_default, &&Adhoc_51,
            &&Adhoc_52,      &&Adhoc_default, &&Adhoc_54,      &&Adhoc_55,
            &&Adhoc_default, &&Adhoc_default, &&Adhoc_default, &&Adhoc_default,
            &&Adhoc_default, &&Adhoc_61,      &&Adhoc_default, &&Adhoc_default,
            &&Adhoc_64,      &&Adhoc_65,      &&Adhoc_66,      &&Adhoc_67,
        };
        static const _imp_string Smdetails[68 /*0:67*/] = {
            _imp_str_literal("%routine SELECT INPUT(%integer STREAM)"),
            _imp_str_literal("%routine SELECT OUTPUT(%integer STREAM)"),
            _imp_str_literal("%routine NEWLINE"),
            _imp_str_literal("%routine SPACE"),
            _imp_str_literal("%routine SKIP SYMBOL"),
            _imp_str_literal("%routine READ STRING(%stringname S)"),
            _imp_str_literal("%routine NEWLINES(%integer N)"),
            _imp_str_literal("%routine SPACES(%integer N)"),
            _imp_str_literal("%integerfn NEXT SYMBOL"),
            _imp_str_literal("%routine PRINT SYMBOL(%integer SYMBOL)"),
            _imp_str_literal("%routine READ SYMBOL(%name SYMBOL)"),
            _imp_str_literal("%routine READ(%name NUMBER)"),
            _imp_str_literal("%routine WRITE(%integer VALUE,PLACES)"),
            _imp_str_literal("%routine NEWPAGE"),
            _imp_str_literal("%integerfn ADDR(%name VARIABLE)"),
            _imp_str_literal("%longrealfn ARCSIN(%longreal X)"),
            _imp_str_literal("%integerfn INT(%longreal X)"),
            _imp_str_literal("%integerfn INTPT(%lonrgreal X)"),
            _imp_str_literal("%longrealfn FRACPT(%longreal X)"),
            _imp_str_literal(
                "%routine PRINT(%longreal NUMBER,%integer BEFORE,AFTER)"),
            _imp_str_literal(
                "%routine PRINTFL(%longreal NUMBER,%integer PLACES)"),
            _imp_str_literal("%realmap REAL(%integer VAR ADDR)"),
            _imp_str_literal("%integermap INTEGER(%integer VAR ADDR)"),
            _imp_str_literal("%longrealfn MOD(%longreal X)"),
            _imp_str_literal("%longrealfn ARCCOS(%longreal X)"),
            _imp_str_literal("%longrealfn SQRT(%longreal X)"),
            _imp_str_literal("%longrealfn LOG(%longreal X)"),
            _imp_str_literal("%longrealfn SIN(%longreal X)"),
            _imp_str_literal("%longrealfn COS(%longreal X)"),
            _imp_str_literal("%longrealfn TAN(%longreal X)"),
            _imp_str_literal("%longrealfn EXP(%longreal X)"),
            _imp_str_literal("%routine CLOSE STREAM(%integer STREAM)"),
            _imp_str_literal("%byteintegermap BYTE INTEGER(%integer VAR ADDR)"),
            _imp_str_literal("%integerfn EVENTINF"),
            _imp_str_literal("%longrealfn RADIUS(%longreal X,Y)"),
            _imp_str_literal("%longrealfn ARCTAN(%longreal X,Y)"),
            _imp_str_literal("%byteintegermap LENGTH(%stringname  S)"),
            _imp_str_literal("%routine PRINT STRING(%string(255)"),
            _imp_str_literal("%integerfn NL"),
            _imp_str_literal("%longrealmap LONG REAL(%integer VAR ADDR)"),
            _imp_str_literal("%routine PRINT CH(%integer CHARACTER)"),
            _imp_str_literal("%routine READ CH(%name CHARACTER)"),
            _imp_str_literal("%stringmap STRING(%integer VAR ADDR)"),
            _imp_str_literal("%routine READ ITEM(%stringname ITEM)"),
            _imp_str_literal("%string(1)"),
            _imp_str_literal(
                "%byteintegermap CHARNO(%stringname STR,%integer CHARREQD)"),
            _imp_str_literal("%string(1)"),
            _imp_str_literal("%string(255)"),
            _imp_str_literal("%recordmap RECORD(%integer REC ADDR)"),
            _imp_str_literal(
                "%arraymap ARRAY(%integer A1ADDR,%arrayname FORMAT)"),
            _imp_str_literal("%integerfn SIZEOF(%name X)"),
            _imp_str_literal("%integerfn IMOD(%integer VALUE)"),
            _imp_str_literal("%longrealfn PI"),
            _imp_str_literal("%integerfn EVENTLINE"),
            _imp_str_literal("%longintegermap LONGINTEGER(%integer ADR)"),
            _imp_str_literal("%longlongrealmap LONGLONGREAL(%integer ADR)"),
            _imp_str_literal("%longintgerefn LENGTHENI(%integer VAL)"),
            _imp_str_literal("%longlongrealfn LENGTHENR(%longreal VAL)"),
            _imp_str_literal("%integerfn SHORTENI(%longinteger VAL)"),
            _imp_str_literal("%longrealfn SHORTENR(%longlongreal VAL)"),
            _imp_str_literal("%integerfn NEXTCH"),
            _imp_str_literal("%halfintegermap HALFINTEGER(%integer ADDR)"),
            _imp_str_literal("%routine PPROFILE"),
            _imp_str_literal("%longrealfn FLOAT(%integer VALUE)"),
            _imp_str_literal("%longintegerfn LINT(%longlongreal X)"),
            _imp_str_literal("%longintegerfn LINTPT(%longlongreal X)"),
            _imp_str_literal("%shortintegermap SHORTINTEGER(%integer N)"),
            _imp_str_literal("%integerfn TRUNC(%longreal X)")};
        static const int Sninfo[68 /*0:67*/] = {0x41080001,
                                                0x41090001,
                                                0x408A0001,
                                                0x40A00001,
                                                0x40010001,
                                                0x800D0000,
                                                0x11010001,
                                                0x11010001,
                                                0x10020024,
                                                0x41030001,
                                                0x19030001,
                                                0x80130001,
                                                0x80170014,
                                                0x408C0001,
                                                0x19050024,
                                                0x80010002,
                                                0x11040024,
                                                0x11040024,
                                                0x80010005,
                                                0x80090006,
                                                0x80060007,
                                                0x2100003E,
                                                0x2100003E,
                                                0x11060024,
                                                0x80010008,
                                                0x80010009,
                                                0x8001000A,
                                                0x8001000B,
                                                0x8001000C,
                                                0x8001000D,
                                                0x8001000E,
                                                0x8015000F,
                                                0x2100003E,
                                                0x100D0024,
                                                0x80030010,
                                                0x80030011,
                                                0x1907003E,
                                                0x41070001,
                                                0x10080024,
                                                0x2100003E,
                                                0x41050001,
                                                0x19030001,
                                                0x2100003E,
                                                0x19030001,
                                                0x10020024,
                                                0x1A07003E,
                                                0x11090024,
                                                0x800F0012,
                                                0x110A0018,
                                                0x120B1000,
                                                0x80130013,
                                                0x11060024,
                                                0x100C0024,
                                                0x100D0024,
                                                [54 ... 55] = 0x2100003E,
                                                [56 ... 59] = 0x110E0024,
                                                0x10020024,
                                                0x2100003E,
                                                0x100F0001,
                                                0x11100024,
                                                0x11110024,
                                                0x11110024,
                                                0x2100003E,
                                                0x11040024};
        static const _imp_string Snxrefs[21 /*0:20*/] = {
            _imp_str_literal("s#readstring"),
            _imp_str_literal("s#read"),
            _imp_str_literal("s#iarcsin"),
            _imp_str_literal("s#int"),
            _imp_str_literal("s#intpt"),
            _imp_str_literal("s#fracpt"),
            _imp_str_literal("s#print"),
            _imp_str_literal("s#printfl"),
            _imp_str_literal("s#iarccos"),
            _imp_str_literal("sqrt"),
            _imp_str_literal("log"),
            _imp_str_literal("sin"),
            _imp_str_literal("cos"),
            _imp_str_literal("tan"),
            _imp_str_literal("exp"),
            _imp_str_literal("s#closestream"),
            _imp_str_literal("s#iradius"),
            _imp_str_literal("atan2"),
            _imp_str_literal("imp_substring"),
            _imp_str_literal("s#sizeof"),
            _imp_str_literal("s#write")};
#if (Paramsbwards == Yes)
          static const int Snparams[26 /*0:25*/] = {
              0,      524289,  0x62,    1048578, 524386, 0x62,   786434,
              786530, 262225,  1048579, 524386,  262225, 0x51,   524289,
              0x435,  1048579, 525365,  262225,  0x51,   524289, 0x400,
              262145, 0x51,    524290,  262225,  0x51};
#else
          static const int Snparams[26 /*0:25*/] = {
              0,      524289,  0x62,    1048578, 0x62,   524386, 786434,
              0x62,   524369,  1048579, 0x62,    524369, 786513, 524289,
              0x435,  1048579, 0x435,   524369,  786513, 524289, 0x400,
              262145, 0x51,    524290,  0x51,    262225};
#endif
        static const unsigned char Wrongz[16 /*0:15*/] = {27,
                                                          29,
                                                          23,
                                                          29,
                                                          29,
                                                          23,
                                                          82,
                                                          [7 ... 11] = 109,
                                                          23,
                                                          27,
                                                          [14 ... 15] = 109};
        auto void Rtos(void);
        auto int Ciocp(int N, Rd *Param);
        Listf *Lcell;
        Listf Pcell;
        Rd Opnd;
        Rd Operator;
        Tripf *Currt;
        _imp_string Snxref;
        int Errno;
        int Flag;
        int Pointer;
        int Pin;
        int Snno;
        int Snname;
        int Naps;
        int Snptype;
        int Jj;
        int Xtra;
        int Iocpep;
        int B;
        int D;
        int Sninf;
        int P0;
        int Ophead;
        int Errval;
        int Exphead;
        int Expbot;
        int Formatname;
        int Nops;
        Snname = Fromar2(P);
        Snno = K;
        Testapp(&Naps);
        Pin = P;
        P += 2;
        Snptype = Acc;
        Sninf = Sninfo[Snno];
        Xtra = Sninf & 0xFFFF;
        Pointer = ((unsigned)Sninf >> 16) & 255;
        Flag = (unsigned)Sninf >> 24;
        if ((Snptype & 255) == 0x61 && (1 << Target & Lintavail) == 0) {
          Errno = 99;
          goto Errexit;
        }
        goto *Adhoc[Adhoc_sw = Snno];
      Adhoc_47:;
        Outstring(_imp_str_literal("imp_substring("));
        P++;
        Cstrexp(0);
        Outsym(',');
        P++;
        Csexp(0x51);
        Outsym(',');
        P++;
        Csexp(0x51);
        Outsym(')');
        P++;
        goto Okexit;
      Adhoc_24:;
      Adhoc_25:;
      Adhoc_26:;
      Adhoc_27:;
      Adhoc_28:;
      Adhoc_29:;
      Adhoc_30:;
        Snxref = Snxrefs[Xtra];
        P0 = Snparams[Pointer];
        if (Target == Perq || Target == Accent) {
          Jj = Addr(Snxref);
          D = *Length(Snxref);
          Movebytes(D + 1, Jj, 0, Addr(A[0]), Worka.Artop);
          Jj = Addr(A[Worka.Artop]) - Addr(A[Worka.Dictbase]);
          Worka.Artop = (Worka.Artop + D + 4) & (-4);
        } else
          Cxref(Snxref, 3 * Parm.Dynamic, P0 << 16 | (unsigned)P0 >> 16, &Jj);
        Ophead = 0;
        K = Ophead;
        D = 1;
        while (D <= (P0 & 15)) {
          B = Snparams[Pointer + D];
          Ptype = B & 0xFFFF;
          Unpack();
          if (!Nam)
            Acc = Bytes[Prec];
          else
            Acc = 8;
          if (Ptype == 0x35) Acc = 256;
          Pcell = (Listf){0};
          Pcell.Ptype = Ptype;
          Pcell.Sndisp = (unsigned)B >> 16;
          Pcell.Acc = Acc;
#if (Paramsbwards == Yes)
            Push(Ophead, Pcell.S1, Pcell.S2, 0);
#else
            Insertatend(&Ophead, Pcell.S1, Pcell.S2, 0);
#endif
          D++;
        }
        if (P0 > 0) Aslist[Ophead].S3 = P0;
        Lcell = &Aslist[Tags[Snname]];
        Lcell->Ptype = Snptype;
        Lcell->Uioj = 1 << 4 | 14;
        Lcell->Sndisp = Jj;
        Lcell->Acc = Bytes[(unsigned)Snptype >> 4 & 15];
        Lcell->Slink = Ophead;
        Lcell->Kform = 0;
        P = Pin;
        Cname(Z);
        P--;
        return;
      Adhoc_6:
      Adhoc_7:;
        if (!Parm.Arr) {
          if (Snno == 6)
            Outstring(_imp_str_literal("_imp_newlines("));
          else
            Outstring(_imp_str_literal("_imp_spaces("));
          P++;
          Csexp(0x51);
          Outsym(')');
          P++;
          goto Okexit;
        }
        P++;
        if (Tsexp(&Jj) > 0 && Jj > 0) {
          Outstring(_imp_str_literal("fprintf(out_file, "));
          Outsym('"');
          for (Xtra = 1; Xtra <= Jj; Xtra++)
            if (Snno == 6)
              Outstring(_imp_str_literal("\\n"));
            else
              Outstring(_imp_str_literal(" "));
          Outsym('"');
          Outsym(')');
        } else {
          P = Pin + 3;
          Outstring(_imp_str_literal("{ for (_imptempint=1; _imptempint<="));
          Csexp(0x51);
          Outstring(_imp_str_literal("; _imptempint++) fprintf(out_file, "));
          Outsym('"');
          if (Snno == 6)
            Outstring(_imp_str_literal("\\n"));
          else
            Outstring(_imp_str_literal(" "));
          Outsym('"');
          Outstring(_imp_str_literal(");}"));
        }
        P++;
        goto Okexit;
      Adhoc_37:;
        if (!Parm.Arr)
          Outstring(_imp_str_literal("_imp_printstring("));
        else {
          Outstring(_imp_str_literal("fprintf(out_file, "));
          Outsym('"');
          Outstring(_imp_str_literal("%s"));
          Outsym('"');
          Outstring(_imp_str_literal(", "));
        }
        P++;
        Cstrexp(0);
        Outstring(_imp_str_literal(")"));
        P++;
        goto Okexit;
      Adhoc_2:;
        if (!Parm.Arr)
          Outstring(_imp_str_literal("_imp_newlines(1)"));
        else {
          Outstring(_imp_str_literal("fprintf(out_file, "));
          Outsym('"');
          Outstring(_imp_str_literal("%s"));
          Outsym('"');
          Outstring(_imp_str_literal(", "));
          Outsym('"');
          Outsym('\\');
          Outsym('n');
          Outsym('"');
          Outsym(')');
        }
        P++;
        goto Okexit;
      Adhoc_3:;
        if (!Parm.Arr)
          Outstring(_imp_str_literal("_imp_spaces(1)"));
        else {
          Outstring(_imp_str_literal("fprintf(out_file, "));
          Outsym('"');
          Outstring(_imp_str_literal("%s"));
          Outsym('"');
          Outstring(_imp_str_literal(", "));
          Outsym('"');
          Outsym(' ');
          Outsym('"');
          Outsym(')');
        }
        P++;
        goto Okexit;
      Adhoc_21:;
      Adhoc_22:;
      Adhoc_61:;
      Adhoc_66:;
      Adhoc_39:;
      Adhoc_32:;
      Adhoc_54:
      Adhoc_55:;
        Outstring(_imp_str_literal("(*("));
        Outtype(Snptype & 255, 0);
        Outstring(_imp_str_literal(" *)("));
        P++;
        Csexp(0x51);
        Outstring(_imp_str_literal("))"));
        P++;
        goto Okexit;
      Adhoc_42:;
        Outstring(_imp_str_literal("((char *)"));
        P++;
        Csexp(0x51);
        Outstring(_imp_str_literal(")"));
        P++;
        goto Okexit;
      Adhoc_45:;
        if (Z != 2) Warn(10, 0);
        P++;
        Cstrexp(0);
        Outsym('[');
        P++;
        Csexp(0x51);
        Outstring(_imp_str_literal("-1]"));
        P++;
        goto Okexit;
      Adhoc_36:;
        if (Z != 2) Warn(10, 0);
        Outstring(_imp_str_literal("strlen("));
        P++;
        Cstrexp(0);
        Outstring(_imp_str_literal(")"));
        P++;
        goto Okexit;
      Adhoc_46:;
        Outstring(_imp_str_literal("imp_tostring("));
        P++;
        Csexp(0x51);
        Outstring(_imp_str_literal(")"));
        P++;
        goto Okexit;
      Adhoc_9:
      Adhoc_40:;
        if (!Parm.Arr)
          Outstring(_imp_str_literal("_imp_printsymbol("));
        else {
          Outstring(_imp_str_literal("fprintf(out_file, "));
          Outsym('"');
          Outstring(_imp_str_literal("%c"));
          Outsym('"');
          Outstring(_imp_str_literal(", "));
        }
        P++;
        Csexp(0x51);
        Outstring(_imp_str_literal(")"));
        P++;
        goto Okexit;
      Adhoc_12:;
        if (!Parm.Arr) {
          Outstring(_imp_str_literal("_imp_write("));
          P++;
          Csexp(0x51);
          Outsym(',');
          P++;
          Csexp(0x51);
          Outsym(')');
          P++;
          goto Okexit;
        }
        P++;
        Skipexp();
        P++;
        Jj = Tsexp(&Xtra);
        P = Pin + 2;
        if (Jj) {
          Outstring(_imp_str_literal("fprintf(out_file, "));
          Outsym('"');
          Outstring(_imp_str_literal("%"));
          Outint(Imod(Xtra) + 1);
          Outstring(_imp_str_literal("d"));
          Outsym('"');
          Outstring(_imp_str_literal(","));
        } else {
          Outstring(_imp_str_literal("fprintf(out_file, "));
          Outsym('"');
          Outstring(_imp_str_literal(" %d"));
          Outsym('"');
          Outstring(_imp_str_literal(","));
        }
        P++;
        Csexp(0x51);
        Outstring(_imp_str_literal(")"));
        P = Pin + 2;
        Skipapp();
        P--;
        goto Okexit;
      Adhoc_19:;
        if (!Parm.Arr) {
          Outstring(_imp_str_literal("_imp_print("));
          P++;
          Csexp(0x62);
          Outsym(',');
          P++;
          Csexp(0x51);
          Outsym(',');
          P++;
          Csexp(0x51);
          Outsym(')');
        } else {
          Outstring(_imp_str_literal("fprintf(out_file, "));
          Outsym('"');
          Outstring(_imp_str_literal(" %f"));
          Outsym('"');
          Outstring(_imp_str_literal(","));
          P++;
          Csexp(0x62);
          Outstring(_imp_str_literal(")"));
        }
        P = Pin + 2;
        Skipapp();
        P--;
        goto Okexit;
      Adhoc_20:;
        if (!Parm.Arr) {
          Outstring(_imp_str_literal("_imp_printf("));
          P++;
          Csexp(0x62);
          Outsym(',');
          P++;
          Csexp(0x51);
          Outsym(')');
        } else {
          Outstring(_imp_str_literal("fprintf(out_file, "));
          Outsym('"');
          Outstring(_imp_str_literal(" %e"));
          Outsym('"');
          Outstring(_imp_str_literal(","));
          P++;
          Csexp(0x62);
          Outstring(_imp_str_literal(")"));
        }
        P = Pin + 2;
        Skipapp();
        P--;
        goto Okexit;
      Adhoc_0:;
        if (!Parm.Arr) {
          Outstring(_imp_str_literal("_imp_selectinput("));
          P++;
          Csexp(0x51);
          Outsym(')');
          P++;
          goto Okexit;
        }
        Outstring(_imp_str_literal("selectinput("));
        P++;
        Csexp(0x51);
        Outstring(_imp_str_literal(")"));
        P++;
        goto Okexit;
      Adhoc_1:;
        if (!Parm.Arr) {
          Outstring(_imp_str_literal("_imp_selectoutput("));
          P++;
          Csexp(0x51);
          Outsym(')');
          P++;
          goto Okexit;
        }
        Outstring(_imp_str_literal("selectoutput("));
        P++;
        Csexp(0x51);
        Outstring(_imp_str_literal(")"));
        P++;
        goto Okexit;
      Adhoc_64:
      Adhoc_65:;
        if ((Typeflag[10] & 255) != 0x61 || (Typeflag[12] & 255) < 0x62) {
          Errno = 99;
          goto Errexit;
        }
        Outstring(_imp_str_literal("((long int) floor("));
        P++;
        Csexp(Typeflag[12] & 255);
        if (Snno == 64) Outstring(_imp_str_literal("+0.5"));
        Outstring(_imp_str_literal("))"));
        P++;
        P0 = 0x61;
        goto Okexit;
      Adhoc_16:
      Adhoc_17:;
        Outstring(_imp_str_literal("((int) floor("));
        P++;
        Csexp(Lrlpt);
        if (Snno == 16) Outstring(_imp_str_literal("+0.5"));
        Outstring(_imp_str_literal("))"));
        P++;
        goto Okexit;
      Adhoc_67:;
        Outstring(_imp_str_literal("((int)("));
        P++;
        Csexp(Lrlpt);
        Outstring(_imp_str_literal("))"));
        P++;
        goto Okexit;
      Adhoc_4:;
        Outstring(_imp_str_literal("(void)fgetc(in_file)"));
        P += 2;
        goto Okexit;
      Adhoc_8:;
        P += 6;
        Cname(1);
        Outstring(_imp_str_literal("ungetc(fgetc(in_file), in_file)"));
        P += 2;
        goto Okexit;
      Adhoc_10:;
      Adhoc_41:;
        P += 6;
        Cname(1);
        Outstring(_imp_str_literal(" = fgetc(in_file)"));
        P += 2;
        goto Okexit;
      Adhoc_14:;
        P += 6;
        Cname(4);
        P += 2;
        goto Okexit;
      Adhoc_23:;
        Outstring(_imp_str_literal("fabs("));
        P++;
        Csexp(0x62);
        Outstring(_imp_str_literal(")"));
        P++;
        goto Okexit;
      Adhoc_51:;
        Outstring(_imp_str_literal("abs("));
        P++;
        Csexp(0x51);
        Outstring(_imp_str_literal(")"));
        P++;
        goto Okexit;
      Adhoc_52:;
      Adhoc_38:;
        P++;
        goto Okexit;
      Adhoc_48:;
        P++;
        if (Tsexp(&Jj) == 1 && Jj == 0)
          Outstring(_imp_str_literal("NULL"));
        else {
          if (Z != 4) {
            Outsym('(');
          }
          P = Pin + 3;
          Csexp(0x51);
          P++;
          Outsym(')');
        }
        Disp = 0;
        Base = 0;
        Access = 3;
        Oldi = 0;
        Acc = 0xFFFF;
        Snptype += 0x1C00;
        Ptype = Snptype;
        Unpack();
        return;
      Adhoc_49:;
        P++;
        Skipexp();
        Errno = 22;
        Errval = 2;
        if (A[P + 4] != 4 || A[P + 5] != 1) goto Errexit;
        P += 6;
        Formatname = Fromar2(P);
        Copytag(Formatname, No);
        P += 4;
        if (A[P] != 2) goto Errexit;
        Xtra = P + 2;
        Outstring(_imp_str_literal("(("));
        Outtype(Ptype & 255, Lhformatname);
        Outstring(_imp_str_literal("*)("));
        P = Pin + 3;
        Csexp(0x51);
        Outstring(_imp_str_literal("))"));
        Copytag(Formatname, No);
        P = Xtra;
        return;
      Adhoc_13:;
        D = Currinf->Oninf;
        if (!D) Fault(16, 0, Snname);
        if (Snno != 33) D += 4;
        Base = Rbase;
        Access = 0;
        Disp = D;
        Snptype += 0x1C00;
        goto Okexit;
        D = (Snno & 3) * 8;
        Jj = (unsigned)0x62517261 >> D & 255;
        if ((1 << Target & Llrealavail) == 0 && Jj == 0x72) Jj = 0x62;
        if ((1 << Target & Lintavail) == 0 && Jj == 0x61) Jj = 0x51;
        Csexp(Jj);
        P++;
        Nameopnd = Expopnd;
        goto Okexit;
      Adhoc_15:;
        if (Parm.Prof) Jj = Uconsttrip(Pprof, 0x51, 0, Profaad);
        goto Okexit;
        Csexp(Lrlpt);
        Nameopnd = Expopnd;
        P++;
        goto Okexit;
      Adhoc_default:;
        Outstring(_imp_str_literal("/* Call to "));
        Outstring(Smdetails[Snno]);
        Outstring(_imp_str_literal(" - please modify pass2.i to handle it */"));
        Skipapp();
        P--;
        goto Okexit;
      Okexit:;
        Ptype = Snptype;
        Unpack();
        Acc = Bytes[Prec];
        return;
      Errexit:;
        Fault(Errno, Errval, Snname);
        Nameopnd = (Rd){0};
        Nameopnd.Ptype = 0x51;
        Base = 0;
        Disp = 0;
        Access = 0;
        Area = 0;
        Ptype = Snptype;
        Unpack();
        P = Pin + 2;
        Skipapp();
        P--;
        return;
        int Ciocp(int Ep, Rd *Param) {
          Rd Opnd;
          Opnd.Ptype = Minapt;
          Opnd.Flag = Sconst;
          Opnd.D = Ep;
          return (Brectrip(Iocpc, Minapt, Dontopt, &Opnd, Param));
        }
        void Rtos(void) {
          int Kk;
          int Jj;
          if (Expopnd.Flag <= 1) {
            Kk = Itos1;
            Ctop(&Kk, &Jj, 0, &Expopnd, &Nameopnd);
            if (!Kk) {
              Nameopnd = Expopnd;
              return;
            }
          }
          Jj = Urectrip(Itos1, 0x35, 0, &Expopnd);
          Nameopnd.Ptype = 0x35;
          Nameopnd.Flag = Reftrip;
          Nameopnd.D = Jj;
        }
      }
      void Caname(int Z, int Arrp, Rd *Hdopnd) {
        int Head1;
        int Bot1;
        int Nops;
        int Elsize;
        int Ptypep;
        int Jj;
        int Soldi;
        int Kk;
        int Pp;
        int Typep;
        int Lb;
        int Arrname;
        int Q;
        int Precp;
        int Naminf;
        int Dvd;
        int Dvdp;
        int Privops;
        Rd Vmyop;
        Rd Rpop;
        Tagf *Lcell;
        int Heads[13 /*0:12*/];
        int Bots[13 /*0:12*/];
        Nops = 0;
        Head1 = 0;
        Bot1 = 0;
        Pp = P;
        Typep = Type;
        Jj = J;
        Ptypep = Ptype;
        Precp = Prec;
        Soldi = Oldi;
        if (Type <= 2)
          Elsize = Bytes[Precp];
        else
          Elsize = Acc;
        if (Elsize > 4095 || (Type == 5 && Nam != 0)) Elsize = 0;
        Dvd = Sndisp;
        Vmyop.Flag = 0;
        Vmyop.Xb = 0;
        Arrname = Fromar2(P);
        Naminf = Tags[Arrname];
        if (Arr == 3) Fault(87, 0, Arrname);
        if (Dvd > 0) {
          Vmyop.Ptype = 0x51;
          Vmyop.D = Dvd;
        } else
          Vmyop = *Hdopnd;
        Testapp(&Q);
        if (!Jj) {
          Lcell = (Tagf *)&Aslist[Tcell];   /*gt: Tagf vs Listf*/
          Lcell->Uioj = Lcell->Uioj | Q;
          Jj = Q;
        }
        if (Jj == Q && Q != 0) {
          P = Pp + 3;
          for (Kk = 1; Kk <= Jj; Kk++) {
            Heads[Kk] = P;
            Skipexp();
            P++;
          }
          Pp = P;
          Outstring(_imp_str_literal(" ["));
          Dvdp = Dvd + 3 * Jj;
          for (Kk = Jj; Kk >= 1; Kk--) {
            P = Heads[Kk];
            Csexp(0x51);
            Lb = Ctable[Dvdp];
            if (Dvd)
              if (Lb == 0x80000000)
                ;
              else if (Lb > 0)
                ;
              else if (!Lb)
                ;
              else if (Lb < 0)
                ;
              else
                Warn(13, 0);
            if (Kk != 1) Outstring(_imp_str_literal("] ["));
            Dvdp -= 3;
          }
          P = Pp;
          Outsym(']');
        } else {
          Rpop = (Rd){0};
          Rpop.Flag = Sconst;
          Binsert(&Head1, &Bot1, Rpop.S1, 0, 0);
          if (Jj > Q)
            Fault(20, Jj - Q, Arrname);
          else
            Fault(21, Q - Jj, Arrname);
          P += 2;
          Skipapp();
        }
        Soldi = Oldi;
        Access = 3;
        Acc = Elsize;
        Ptype = Ptypep;
        Unpack();
        J = Jj;
        if (Type == 5 && Nam > 0) Mlopnd = *Hdopnd;
        Oldi = Soldi;
        return;
      }
      void Namepreamble(int Z, int Fname) {
        int Typep;
        int Qq;
        int Subs;
        int Pp;
        Typep = Type;
        Pp = P;
        if (Typep == 3) {
          Qq = Copyrecordtag(&Subs);
          P = Pp;
        }
        if (Z == 3 && Type != 5 && (Nam == 0 || Arr != 0)) Outsym('&');
        if (Z == 4 && Type != 5 && (Nam == 0 || Arr != 0))
          Outstring(_imp_str_literal("(int)&"));
        if (Z == 4 && (Type == 5 || (Nam != 0 && Arr == 0)))
          Outstring(_imp_str_literal("(int)"));
        if ((Z == 1 || Z == 2) &&
            ((Nam != 0 && Arr == 0 && 0 == Rout) || (Nam >= 2 && Rout == 1)) &&
            Type != 5 && (Typep != 3 || Qq != 0))
          Outsym('*');
        if (Z == 7 && Typep == 3 && Qq == 0 && Nam != 0 && Arr == 0)
          Outsym('*');
        Outname(Fname);
        if (Typep == 3) Copytag(Fname, No);
      }
      void Cname(int Z) {
        int Jj;
        int Kk;
        int Levelp;
        int Dispp;
        int Namep;
        int Pp;
        int Savesl;
        int Fname;
        Rd Topnd;
        static int S_sw;
        static void *S[3 /*11:13*/] = {
            &&S_11,
            &&S_12,
            &&S_default,
        };
        static int Funny_sw;
        static void *Funny[3 /*11:13*/] = {
            &&Funny_11,
            &&Funny_12,
            &&Funny_13,
        };
        static int Sw_sw;
        static void *Sw[9 /*0:8*/] = {
            &&Sw_0, &&Sw_1, &&Sw_2, &&Sw_3,       &&Sw_4,
            &&Sw_5, &&Sw_6, &&Sw_7, &&Sw_default,
        };
        Pp = P;
        Fname = (A[P] << 8) + A[P + 1];
        if (Z == 1 || Z == 6) Stname = Fname;
        Copytag(Fname, Yes);
        Savesl = Acc;
        Jj = J;
        if (Jj == 15) Jj = 0;
        Namep = Fname;
        Levelp = I;
        Dispp = K;
        if (Litl == 1 && Rout == 0 && 0 == Nam &&
            (Z == 1 || Z == 3 || (Z == 4 && Arr == 0)))
          Fault(43, 0, Fname);
        if (Type == 7) goto Notset;
        if ((Z == 0 && (Rout != 1 || 0 != Type && Type != 6)) ||
            (Z == 13 && Rout == 0)) {
          Fault(27, 0, Fname);
          goto Notset;
        }
        if (Z >= 10) goto *Funny[Funny_sw = (Z)-11];
        if (Rout == 1) goto Rtcall;
        Namepreamble(Z, Fname);
        goto *Sw[Sw_sw = Type];
      Sw_6:;
        Fault(5, 0, Fname);
        goto Notset;
      Sw_4:;
        Fault(87, 0, Fname);
      Notset:;
        Namepreamble(Z, Fname);
      Sw_7:;
        Base = I;
        Disp = K;
        Access = 0;
        Nameopnd = (Rd){0};
        Nameopnd.Ptype = 0x51;
        Ptype = 0x51;
        Unpack();
        P += 2;
        if (A[P] == 1) {
          Jj = '(';
          Outsym(Jj);
          P++;
          Csexp(0x51);
          while (A[P] == 1) {
            Outsym(',');
            P++;
            Csexp(0x51);
          }
          Outsym(Jj + 1 + ((unsigned)Jj >> 6));
        }
        P++;
        goto Chken;
      Funny_11:;
      Funny_12:;
        if (Ptype == Snpt) {
          Csname(12);
          goto Chken;
        }
        Namepreamble(Z, Fname);
        if (Type == 3 && (Arr == 0 || A[P + 2] == 1)) goto *Sw[Sw_sw = 3];
        if (A[P + 2] == 2)
          P += 3;
        else
          Noapp();
        Nameopnd.Flag = Dname;
        Nameopnd.D = Fname;
        Nameopnd.Xtra = 0;
      S_12:;
      S_11:;
        Nameopnd.Ptype = Aheadpt;
        goto Chken;
      Funny_13:;
        if (Ptype == Snpt) {
          Csname(Z);
          P++;
          goto Chken;
        }
        Namepreamble(Z, Fname);
        Jj = Unametrip(Rtfp, Rtparampt, 0, Fname);
        Nameopnd.Ptype = Rtparampt;
        Nameopnd.Flag = Reftrip;
        Nameopnd.D = Jj;
        Nameopnd.Xtra = 0;
        if (A[P + 2] == 2)
          P += 3;
        else
          Noapp();
        goto Chken;
      Rfun:;
        Expopnd = Nameopnd;
      Rmap:;
        Copytag(Namep, No);
        P -= 3;
        Namep = -1;
        Crname(Z, 3, 0, 0, &Namep);
        goto Rback;
      Sw_3:;
        Crname(Z, 2 * Nam, I, K, &Namep);
      Rback:;
        if (Z >= 10) goto *S[S_sw = (Z)-11];
        if (Type == 5 && Z != 6) goto Strinrec;
        if (Type == 7) goto Notset;
        Nameop(Z, Bytes[Prec], Namep);
        if (Z == 1 || Z == 6) Stname = Namep;
        goto Chken;
      Sw_5:;
        if (Z == 6) goto *Sw[Sw_sw = 1];
        if (Arr >= 1) goto Strarr;
        if (A[P + 2] == 2)
          P += 3;
        else
          Noapp();
        Base = I;
        Access = 2 * Nam;
        Disp = K;
      Smap:
        Mlopnd = (Rd){0};
        if (Nam != 1) {
          Mlopnd.Ptype = 0x51;
          Mlopnd.D = Savesl - 1;
        } else {
          Mlopnd.Ptype = 0x61;
          Mlopnd.Flag = Localir;
          Mlopnd.D = I << 16 | K;
        }
        Nameop(Z, 4, Namep);
        goto Chken;
      Strarr:;
        Topnd = (Rd){0};
        Topnd.Ptype = Aheadpt;
        Topnd.Flag = Dname;
        Topnd.D = Fname;
        Caname(Z, Arr, &Topnd);
        if (Z != 3 || Nam == 0) goto Smap;
        Nameop(3, 4, Namep);
        goto Chken;
      Strinrec:;
        Savesl = Acc;
        if (Z != 3 || Nam == 0 || Arr == 0) goto Smap;
        Nameop(3, 4, Namep);
        goto Chken;
      Rtcall:;
        if (Type == 0 && Z != 0) {
          Fault(23, 0, Fname);
          goto Notset;
        }
        if (Ptype == Snpt) {
          Csname(Z);
          if (Rout == 1 && Nam > 1 && Z != 0) goto Bim;
          goto Chken;
        }
        Namepreamble(Z, Fname);
        Crcall(Fname);
        P++;
        if (!(Ptype & 15)) goto Chken;
        if (Nam > 1) goto Udm;
        if (Z != 2 && Z != 5 && (Z != 3 || 3 != Type)) {
          Fault(29, 0, Fname);
          Base = 0;
          Access = 0;
          Disp = 0;
        }
        if (Type == 3) goto Rfun;
        goto Chken;
      Udm:;
        Disp = 0;
        Access = 3;
        Base = 0;
        Expopnd = Nameopnd;
        if (Type == 3) goto Rmap;
      Bim:;
        Namep = -1;
        Stname = -1;
        if (Type == 5) {
          Savesl = 256;
          goto Smap;
        }
        Kk = Z;
        if (Z == 5) Kk = 2;
        Nameop(Z, Bytes[Prec], Namep);
        goto Chken;
      Sw_0:;
        if (3 > Z || Z > 4) {
          Fault(90, 0, Fname);
          Type = 1;
        }
      Sw_1:;
      Sw_2:;
        if (Arr == 0 || (Z == 6 && A[P + 2] == 2)) {
          Base = I;
          Access = 2 * Nam;
          Disp = K;
          if (A[P + 2] == 2)
            P += 3;
          else
            Noapp();
        } else {
          Topnd = (Rd){0};
          Topnd.Ptype = Aheadpt;
          Topnd.Flag = Dname;
          Topnd.D = Fname;
          Caname(Z, Arr, &Topnd);
          Nam = 0;
        }
        Nameop(Z, Bytes[Prec], Namep);
        goto Chken;
      Chken:
        while (A[P] == 1) {
          Fault(69, Fromar2(P + 1), Fname);
          Outsym('_');
          Outname(Fromar2(P + 1));
          P += 3;
          Skipapp();
        }
        P++;
        goto Sw_skip;
      Sw_default:
        fprintf(stderr, "\nSwitch label 'Sw(%d):' not set in %s\n", Sw_sw,
                __PRETTY_FUNCTION__);
        fflush(stderr);
        abort();
      Sw_skip:;
        goto S_skip;
      S_default:
        fprintf(stderr, "\nSwitch label 'S(%d):' not set in %s\n", S_sw + 11,
                __PRETTY_FUNCTION__);
        fflush(stderr);
        abort();
      S_skip:;
      }
      void Nameop(int Z, int Size, int Namep) {}
      void Crcall(int Rtname) {
        int Ii;
        int Iii;
        int Qqq;
        int Jj;
        int Jjj;
        int Nparms;
        int Pt;
        int Lp;
        int Psize;
        int Twsp;
        int Parmno;
        int Errno;
        int Fptr;
        int Typep;
        int Precp;
        int Namp;
        int Tl;
        int Clink;
        int Pspeced;
        int Outp;
        int Pptype;
        int Dvd;
        int Dvdp;
        int Lb;
        int Kk;
        Rd Opnd;
        Rd Opnd1;
        Rd Opnd2;
        Listf *Lcell;
        Pt = Ptype;
        Jjj = J;
        Tl = Oldi;
        Twsp = 0;
        Fptr = 0;
        Lp = I;
        Clink = K;
        Typep = Type;
        Precp = Prec;
        Namp = Nam;
        if (!Clink)
          Pspeced = 0;
        else
          Pspeced = Aslist[Clink].S3 & 255;
        {
          int Arp[Pspeced + 1];
          static int Fpd_sw;
          static void *Fpd[4 /*0:3*/] = {
              &&Fpd_0,
              &&Fpd_1,
              &&Fpd_2,
              &&Fpd_3,
          };
          P += 2;
          Nparms = 0;
          while (A[P] == 1) {
            P++;
            if (Nparms < Pspeced) {
#if (Paramsbwards == Yes)
                Arp[Pspeced - Nparms] = P;
#else
                Arp[Nparms + 1] = P;
#endif
            }
            Nparms++;
            Skipexp();
          }
          Outp = P;
          if (Pspeced != Nparms) {
            if (!Pspeced)
              Errno = 17;
            else if (Nparms < Pspeced)
              Errno = 18;
            else
              Errno = 19;
            Fault(Errno, Imod(Pspeced - Nparms), Rtname);
            Skipapp();
            P--;
            Nameopnd = (Rd){0};
            Nameopnd.Ptype = 0x51;
            goto Over;
          }
          Ii = Unametrip(Precl, Pt & 255, 0, Rtname);
          Parmno = 0;
          Outsym('(');
          goto Firstparm;
        Badparm:;
#if (Paramsbwards == Yes)
            Ii = Pspeced - Parmno + 1;
#else
            Ii = Parmno;
#endif
          Fault(22, Ii, Rtname);
        Nextparm:
          Clink = Lcell->Link;
          if (Clink) Outsym(',');
        Firstparm:
          if (!Clink) goto Entryseq;
          Lcell = &Aslist[Clink];
          Psize = Lcell->Acc & 0xFFFF;
          Parmno++;
          P = Arp[Parmno];
          Ptype = Lcell->Ptype;
          Unpack();
          Ii = Type;
          Iii = Prec;
          Jj = (Nam << 1 | Arr) & 3;
          if ((Jj != 0 || Rout != 0) && Jj != 2 &&
              (A[P + 3] != 4 || A[P + 4] != 1 ||
               A[P + Fromar2(P + 1) + 1] != 2))
            goto Badparm;
          Opnd.Ptype = Ptype;
          Opnd.Flag = Dname;
          Opnd.D = Rtname;
          Opnd.Xtra = Parmno << 24 | Clink;
          if (Rout == 1) {
            Ii = Ptype;
            P += 5;
            Cname(13);
            if ((Ii & 255) != (Ptype & 255)) goto Badparm;
            P++;
            Fptr += Rtparamsize;
            goto Nextparm;
          }
          goto *Fpd[Fpd_sw = Jj];
        Fpd_0:;
          if (Type == 3) {
            Ii = Tsexp(&Iii);
            if (Ii == 1 && Iii == 0)
              goto Badparm;
            else {
              P = Arp[Parmno];
              if (A[P + 3] != 4 || A[P + 4] != 1 ||
                  A[P + Fromar2(P + 1) + 1] != 2)
                goto Badparm;
              P += 5;
              Cname(6);
              P++;
              Jj = 1;
              Expopnd = Nameopnd;
              if (Acc != Psize) goto Badparm;
            }
            Fptr += Psize;
            if (Target == Emas) Fptr += 8;
          } else if (Type == 5)
            if (Strvalinwa == Yes) {
              Cstrexp(0);
              Push(&Twsp, Value, 0, 0);
              Fptr += Ptrsize[0x35];
              Pptype = 0x51;
              if (Ptrsize[0x35] > 4) Pptype = 0x61;
              Opnd1 = (Rd){0};
              Opnd2 = (Rd){0};
              Opnd2.Flag = Sconst;
              Opnd2.Ptype = 0x51;
              Opnd2.D = Lcell->Acc - 1;
              Opnd1.Flag = Localir;
              Opnd1.Ptype = 0x35;
              Opnd1.D = Rbase << 16 | Value;
              Opnd1.Flag = Reftrip;
              Opnd1.Ptype = Pptype;
              goto Nextparm;
            } else {
              Cstrexp(0);
              Fptr += Acc;
            }
          else {
            Csexp(Iii << 4 | Ii);
            Fptr += Bytes[Iii];
          }
          Fptr = (Fptr + Minparamsize - 1) & (-Minparamsize);
          goto Nextparm;
        Fpd_2:;
          Pptype = 0x51;
          if (Ptrsize[Ptype & 255] > 4) Pptype = 0x61;
          if (Ii) {
            Qqq = 0;
            if (A[P + 3] == 4 && A[P + 4] == 1 &&
                A[P + Fromar2(P + 1) + 1] == 2) {
              P += 5;
              Reducetag(Yes);
              if (Ii == Type && Iii == Prec && (Litl != 1 || Nam != 0) &&
                  (Rout == 0 || Nam == 2))
                Qqq = 1;
              else
                P -= 5;
            }
            if (Qqq)
              Cname(3);
            else {
              if (Jjj != 14 && Lp != 0) goto Badparm;
              if (Ii == 3) goto Badparm;
              if (Ii == 5) {
                Cstrexp(0);
                Push(&Twsp, Value, 0, 0);
                Qqq = Value;
                Opnd2.D = 255;
              } else {
                Getwsp(&Qqq, (unsigned)Bytes[Iii] >> 2);
                Csexp(Lcell->Ptype & 255);
                Opnd2.D = Bytes[Iii];
              }
              Opnd2.Flag = Sconst;
              Opnd2.Ptype = 0x51;
              Opnd1.Flag = Localir;
              Opnd1.Ptype = Lcell->Ptype & 255;
              Opnd1.D = Rbase << 16 | Qqq;
              Opnd1.Xtra = 268;
              if (Ii != 5) Nameopnd.Flag = Reftrip;
              Nameopnd.Ptype = Pptype;
              Nameopnd.D = Qqq;
            }
            Jj = Ptrsize[Iii << 4 | Ii];
            Fptr += Jj;
          } else {
            if (A[P + 3] != 4 || A[P + 4] != 1 ||
                A[P + 1 + Fromar2(P + 1)] != 2)
              goto Badparm;
            P += 5;
            Fname = Fromar2(P);
            Reducetag(No);
            Opnd2.Ptype = 0x51;
            Opnd2.Flag = Sconst;
            Opnd2.D = Acc << 16 | Ptype;
            Opnd2.Xtra = 0;
            if (!Type) {
              Nameopnd.Ptype = Ptype;
              Nameopnd.Flag = Dname;
              Nameopnd.D = Fname;
              Nameopnd.Xtra = 0x80000000;
            } else if (Nam != 0 && Type == 5)
              Cname(3);
            else
              Cname(4);
            Expopnd.Ptype = 0x61;
            Expopnd.Flag = Reftrip;
            Expopnd.Xtra = 0;
            Fptr += Ptrsize[0];
          }
          P++;
          goto Nextparm;
        Fpd_1:;
        Fpd_3:;
          P += 5;
          Reducetag(No);
          Dvd = Sndisp;
          if (Dvd) Outsym('&');
          Cname(12);
          P++;
          if (1 > Arr || Arr > 2 || Ii != Type || Iii != Prec) goto Badparm;
          Qqq = Aslist[Tcell].Uioj & 15;
          Jj = Lcell->Uioj & 15;
          if (!Jj) {
            Jj = Qqq;
            Lcell->Uioj = Lcell->Uioj | Jj;
          }
          if (!Qqq) {
            Qqq = Jj;
            Aslist[Tcell].Uioj = Aslist[Tcell].Uioj | Jj;
          }
          if (Jj != Qqq) goto Badparm;
          if (Dvd) {
            Dvdp = Dvd + 3 * Jj;
            for (Kk = Jj; Kk >= 1; Kk--) {
              Lb = Ctable[Dvdp];
              Outsym('[');
              if (Lb == 0x80000000) {
                Outstring(_imp_str_literal("-("));
                P = Ctable[Dvdp + 1];
                Csexp(0x51);
                Outsym(')');
              } else if (Lb > 0) {
                Outsym('-');
                Outint(Lb);
              } else if (Lb <= 0)
                Outint(-Lb);
              Outstring(_imp_str_literal("] "));
              Dvdp -= 3;
            }
          }
          Fptr += Aheadsize;
          goto Nextparm;
        Entryseq:;
          Outsym(')');
          while (Twsp > 0) {
            Pop(&Twsp, &Qqq, &Jj, &Iii);
            Returnwsp(Qqq, 268);
          }
          if (Strresinwa == Yes && Namp <= 1 && (Typep == 3 || Typep == 5)) {
            Getwsp(&Qqq, 268);
            Opnd2.Ptype = Pt;
            Opnd2.Flag = Localir;
            Opnd2.D = Rbase << 16 | Qqq;
            Opnd2.Xtra = 268;
            Opnd.Ptype = Pt;
            Opnd.Flag = Dname;
            Opnd.D = Rtname;
            Opnd.Xtra = (Pspeced + 1) << 24;
            Fptr += Ptrsize[0x35];
          }
          Ii = Unametrip(Rcall, Pt & 255, 0, Rtname);
          Triples[Ii].Opnd1.Xtra = Fptr;
          Currinf->Nmdecs = Currinf->Nmdecs | 2;
          Rout = 1;
          Type = Typep;
          Nam = Namp;
          Prec = Precp;
          Ptype = Pt;
          if (Pt & 255) {
            if (Nam >= 2)
              Ii = Rcrmr;
            else
              Ii = Rcrfr;
            Ii = Unametrip(Ii, Pt & 255, 0, Rtname);
            if (Strresinwa == Yes) Triples[Ii].Opnd1.Xtra = Qqq;
            Nameopnd.Ptype = Pt & 255;
            Nameopnd.Flag = Reftrip;
            Nameopnd.D = Ii;
            Nameopnd.Xtra = 0;
          }
        Over:
          P = Outp;
        }
      }
      int Tsexp(int *Value) {
        static int Sw_sw;
        static void *Sw[3 /*1:3*/] = {
            &&Sw_1,
            &&Sw_2,
            &&Sw_3,
        };
        int Pp;
        int Kk;
        int Sign;
        int Ct;
        Type = 1;
        Pp = P;
        P += 3;
        Sign = A[P];
        if (Sign != 4 && A[P + 1] != 2) goto Typed;
        goto *Sw[Sw_sw = (A[P + 1]) - 1];
      Sw_1:;
        P += 2;
        Reducetag(No);
        if ((Ptype & 0xff0f) == 0x4001)
          if (A[P + 2] == 2 && A[P + 3] == 2 && A[P + 4] == 2) {
            *Value = Midcell;
            P += 5;
            if (Sign != 2) return (2);
            *Value = -*Value;
            return (-2);
          }
        goto Typed;
      Sw_2:;
        Ct = A[P + 2];
        Type = Ct & 7;
        if (Ct != 0x41 || Sign == 3) goto Typed;
        Kk = Fromar2(P + 3);
        if (A[P + 5] != 2) goto Typed;
        *Value = Kk;
        P += 6;
        if (Sign != 2) return (1);
        *Value = -*Value;
        return (-1);
      Sw_3:;
      Typed:
        P = Pp;
        return (0);
      }
      int Tsc(void) {
        int Value;
        int Res;
        int Pp;
        static int Sw_sw;
        static void *Sw[4 /*1:4*/] = {
            &&Sw_1,
            &&Sw_2,
            &&Sw_3,
            &&Sw_4,
        };
        Pp = P;
        goto *Sw[Sw_sw = (A[P]) - 1];
      Sw_1:;
        P++;
        Res = Tsexp(&Value);
        if (!Res) return (0);
        P++;
        Res = Tsexp(&Value);
        if (!Res) return (0);
        P++;
        if (A[P - 1] == 1) return (0);
        return (1);
      Sw_2:;
        P++;
        Res = Tcond();
        return (Res);
      Sw_3:;
        P++;
        return (Tsc());
      Sw_4:;
        return (Tsexp(&Value));
      }
      int Tcond(void) {
        int Value;
        int Res;
        int Pp;
        Pp = P;
        Res = Tsc();
        if (!Res) return (0);
        if (A[P] == 3) {
          P++;
          return (1);
        }
        do {
          P++;
          Res = Tsc();
          if (!Res) return (0);
        } while (A[P] != 2);
        P++;
        return (1);
      }
      void Skipexp(void) {
        int Optype;
        int Pin;
        int J;
        int Precp;
        Pin = P;
        P += 3;
        for (;;) {
          Optype = A[P + 1];
          P += 2;
          if (Optype == 0 || Optype > 3) Impabort();
          if (Optype == 3) Skipexp();
          if (Optype == 2) {
            J = A[P] & 7;
            if (J == 5)
              P = P + A[P + 1] + 2;
            else {
              Precp = (unsigned)A[P] >> 4;
              if (Precp == 3) Precp = 4;
              P = P + 1 + Bytes[Precp];
            }
          }
          if (Optype == 1) {
            P--;
            do {
              P += 3;
              Skipapp();
            } while (A[P] != 2);
            P++;
          }
          P++;
          if (A[P - 1] == 2) break;
        }
      }
      void Skipapp(void) {
        int Pin;
        Pin = P;
        while (A[P] == 1) {
          P++;
          Skipexp();
        }
        P++;
      }
      void Noapp(void) {
        P += 2;
        if (A[P] == 1) {
          Fault(17, 0, Fromar2(P - 2));
          Outsym('[');
          while (A[P] == 1) {
            P++;
            Csexp(0x51);
            if (A[P] == 1) Outsym(',');
          }
          P++;
          Outsym(']');
        } else
          P++;
      }
      void Testapp(int *Num) {
        int Pp;
        int Q;
        Q = 0;
        Pp = P;
        P += 2;
        while (A[P] == 1) {
          P++;
          Q++;
          Skipexp();
        }
        P = Pp;
        *Num = Q;
      }
      void Setline(void) {
        int I;
        int Offset;
        if (!Rlevel) return;
        Offset = Currinf->Diaginf + 2;
        if (Target == Orn || (1 << Target & Riskmc) != 0) Offset += 2;
        I = Uconsttrip(Sline, 0x41, 0, Line << 16 | Offset);
        if (Parm.Prof) I = Profaad + 4 + 4 * Line;
      }
      void Storetag(int Kk, int Level, int Rbase, int J, int Sndisp, int Acc,
                    int Slink, int Kform) {
        int Q;
        int I;
        int Tcell;
        Tagf *Lcell;
        Tcell = Tags[Kk];
        Q = Level << 8 | Rbase << 4 | J;
        if ((unsigned)(Kform | Acc) >> 16) Impabort();
        Lcell = (Tagf *)&Aslist[Tcell];   /*gt: Tagf vs Listf */
        if (((unsigned)Lcell->Uioj >> 8 & 63) == Level ||
            Kk == Currinf->M - 1) {
          Lcell->Uioj = Lcell->Uioj & 0xC000 | Q;
        } else {
          I = Asl;
          if (!I) I = Morespace();
          Lcell = (Tagf *)&Aslist[I];   /*gt: Tagf vs Listf */
          Asl = Lcell->Link;
          Lcell->Link = Tcell | Currinf->Names << 18;
          Lcell->Uioj = Q;
          Tags[Kk] = I;
          Currinf->Names = Kk;
        }
        Lcell->Ptype = Ptype;
        Lcell->Acc = Acc;
        Lcell->Sndisp = Sndisp;
        Lcell->Kform = Kform;
        Lcell->Slink = Slink;
      }
      void Copytag(int Tname, int Declare) {
        Tagf *Lcell;
        Tcell = Tags[Tname];
        if (!Tcell) {
          Type = 7;
          Ptype = 0x57;
          Prec = 5;
          if (Declare == Yes) {
            Fault(16, 0, Tname);
            Storetag(Tname, Level, Rbase, 0, 0, 4, N, 0);
            N += 4;
            Copytag(Tname, No);
            return;
          }
          Rout = 0;
          Nam = 0;
          Arr = 0;
          Litl = 0;
          Acc = 4;
          I = -1;
          J = -1;
          K = -1;
          Oldi = -1;
          Kform = -1;
        } else {
          Lcell = (Tagf *)&Aslist[Tcell];   /*gt: Tagf vs Listf */
          Ptype = Lcell->Ptype & 0xFFFF;
          Usebits = (unsigned)Lcell->Uioj >> 14 & 3;
          Oldi = (unsigned)Lcell->Uioj >> 8 & 63;
          I = (unsigned)Lcell->Uioj >> 4 & 15;
          J = Lcell->Uioj & 15;
          Lcell->Uioj = Lcell->Uioj | 0x8000;
          Midcell = Lcell->S2;
          Sndisp = Lcell->Sndisp & 0xFFFF;
          Acc = Lcell->Acc & 0xFFFF;
          K = Lcell->Slink & 0xFFFF;
          Kform = Lcell->Kform;
          Litl = (unsigned)Ptype >> 14 & 3;
          Rout = (unsigned)Ptype >> 12 & 3;
          Nam = (unsigned)Ptype >> 10 & 3;
          Arr = (unsigned)Ptype >> 8 & 3;
          Prec = (unsigned)Ptype >> 4 & 15;
          Type = Ptype & 15;
        }
      }
      void Reducetag(int Declare) {
        int Subs;
        int Qq;
        int Pp;
        Copytag(Fromar2(P), Declare);
        if (Ptype == Snpt) {
          Ptype = Acc;
          Unpack();
          if (K == 42)
            Acc = 256;
          else if (K == 48)
            Acc = 0x7fff;
          else
            Acc = Bytes[Prec];
        }
        if (Type == 3) {
          Pp = P;
          Qq = Copyrecordtag(&Subs);
          P = Pp;
        }
      }
      void Unpack(void) {
        Litl = (unsigned)Ptype >> 14;
        Rout = (unsigned)Ptype >> 12 & 3;
        Nam = (unsigned)Ptype >> 10 & 3;
        Arr = (unsigned)Ptype >> 8 & 3;
        Prec = (unsigned)Ptype >> 4 & 15;
        Type = Ptype & 15;
      }
      void Pack(int *Ptype) {
        *Ptype = (((((Litl & 3) << 2 | Rout & 3) << 2 | Nam & 3) << 2 | Arr & 3)
                      << 4 |
                  Prec & 15)
                     << 4 |
                 Type & 15;
      }
    }
    int Newtrip(void) {
      Tripf *Currt;
      int I;
      Currt = &Triples[Nexttrip];
      I = Nexttrip;
      if (I >= Worka.Lasttrip) I = 1;
      Nexttrip = I + 1;
      *Currt = (Tripf){0};
      Currt->Blink = Triples[0].Blink;
      Triples[0].Blink = I;
      Triples[Currt->Blink].Flink = I;
      return (I);
    }
    int Uconsttrip(int Opern, int Optype, int Flags, int Const) {
      Tripf *Currt;
      int Cell;
      Cell = Newtrip();
      Currt = &Triples[Cell];
      Currt->Opern = Opern;
      Currt->Optype = Optype;
      Currt->Flags = Flags;
      Currt->Opnd1.Ptype = 0x51;
      Currt->Opnd1.D = Const;
      return (Cell);
    }
    int Ulconsttrip(int Opern, int Optype, int Flags, int Const1, int Const2) {
      Tripf *Currt;
      int Cell;
      Cell = Newtrip();
      Currt = &Triples[Cell];
      Currt->Opern = Opern;
      Currt->Optype = Optype;
      Currt->Flags = Flags;
      Currt->Opnd1.Ptype = 0x61;
      Currt->Opnd1.D = Const1;
      Currt->Opnd1.Xtra = Const2;
      return (Cell);
    }
    int Unametrip(int Opern, int Optype, int Flags, int Name) {
      Tagf *Taginf;
      Tripf *Currt;
      int Cell;
      Taginf = (Tagf *)&Aslist[Tags[Name]];  /*gt: Tagf vs Listf */
      Cell = Newtrip();
      Currt = &Triples[Cell];
      Currt->Opern = Opern;
      Currt->Optype = Optype;
      Currt->Flags = Flags;
      Currt->Opnd1.Ptype = Taginf->Ptype;
      Currt->Opnd1.Flag = Dname;
      Currt->Opnd1.D = Name;
      Currt->Opnd1.Xtra = 0;
      return (Cell);
    }
    int Utemptrip(int Opern, int Optype, int Flags, int Temp) {
      int Cell;
      Tripf *Currt;
      Cell = Newtrip();
      Currt = &Triples[Cell];
      Currt->Opern = Opern;
      Currt->Optype = Optype;
      Currt->Flags = Flags;
      Currt->Opnd1.Ptype = Optype;
      Currt->Opnd1.Flag = Localir;
      Currt->Opnd1.D = Temp;
      return (Cell);
    }
    void Keepusecount(Rd * Opnd) {
      Tripf *Reft;
      Reft = &Triples[Opnd->D];
      if (!Reft->Cnt) Reft->Puse = Triples[0].Blink;
      Reft->Cnt = Reft->Cnt + 1;
    }
    int Urectrip(int Opern, int Optype, int Flags, Rd *Opnd1) {
      int Cell;
      Tripf *Currt;
      Cell = Newtrip();
      Currt = &Triples[Cell];
      Currt->Opern = Opern;
      Currt->Optype = Optype;
      Currt->Flags = Flags;
      Currt->Opnd1 = *Opnd1;
      if (1 << Opnd1->Flag & Btrefmask) Keepusecount(Opnd1);
      return (Cell);
    }
    int Brectrip(int Opern, int Optype, int Flags, Rd *Opnd1, Rd *Opnd2) {
      int Cell;
      Tripf *Currt;
      Cell = Newtrip();
      Currt = &Triples[Cell];
      Currt->Opern = Opern;
      Currt->Optype = Optype;
      Currt->Flags = Flags;
      Currt->Opnd1 = *Opnd1;
      Currt->Opnd2 = *Opnd2;
      if (1 << Opnd1->Flag & Btrefmask) Keepusecount(Opnd1);
      if (1 << Opnd2->Flag & Btrefmask) Keepusecount(Opnd2);
      return (Cell);
    }
    void Getwsp(int *Place, int Size) {
      int J;
      int K;
      int L;
      int F;
      F = (unsigned)Size >> 31;
      Size = (unsigned)Size << 1 >> 1;
      if (Size > 4) Size = 0;
      Pop(Currinf->Avlwsp, &J, &K, &L);
      if (K <= 0) {
        if (Size == 4)
          L = Rnding[128 + 0x72];
        else if (Size == 2)
          L = Rnding[128 + 0x62];
        else
          L = 3;
        N = (N + L) & (~L);
        K = N;
        if (!Size)
          N += 268;
        else
          N += Size << 2;
      }
      *Place = K;
      if (!F) Push(&Twsphead, K, Size, 0);
    }
    void Returnwsp(int Place, int Size) {
      int Cell;
      if (Place > N || (Place & 1) != 0) Impabort();
      if (Size > 4) Size = 0;
      Cell = Currinf->Avlwsp[Size];
      while (Cell > 0) {
        if (Aslist[Cell].S2 == Place) Impabort();
        Cell = Aslist[Cell].Link;
      }
      if (Place < 511)
        Push(Currinf->Avlwsp, 0, Place, 0);
      else
        Insertatend(Currinf->Avlwsp, 0, Place, 0);
    }
    void Reusetemps(void) {
      int Jj;
      int Kk;
      int Qq;
      while (Twsphead) {
        Pop(&Twsphead, &Jj, &Kk, &Qq);
        Returnwsp(Jj, Kk);
      }
    }
    int Fromar2(int Ptr) { return (A[Ptr] << 8 | A[Ptr + 1]); }
    int Fromar4(int Ptr) {
      int I;
      Movebytes(4, Addr(A[0]), Ptr, Addr(I), 0);
      return (I);
    }
  P2end:;
  }
}
