home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / perl / os2perl / cmd.h < prev    next >
C/C++ Source or Header  |  1991-06-11  |  5KB  |  170 lines

  1. /* $RCSfile: cmd.h,v $$Revision: 4.0.1.1 $$Date: 91/06/07 10:28:50 $
  2.  *
  3.  *    Copyright (c) 1991, Larry Wall
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  * $Log:    cmd.h,v $
  9.  * Revision 4.0.1.1  91/06/07  10:28:50  lwall
  10.  * patch4: new copyright notice
  11.  * patch4: length($`), length($&), length($') now optimized to avoid string copy
  12.  *
  13.  * Revision 4.0  91/03/20  01:04:34  lwall
  14.  * 4.0 baseline.
  15.  *
  16.  */
  17.  
  18. #define C_NULL 0
  19. #define C_IF 1
  20. #define C_ELSE 2
  21. #define C_WHILE 3
  22. #define C_BLOCK 4
  23. #define C_EXPR 5
  24. #define C_NEXT 6
  25. #define C_ELSIF 7    /* temporary--turns into an IF + ELSE */
  26. #define C_CSWITCH 8    /* created by switch optimization in block_head() */
  27. #define C_NSWITCH 9    /* likewise */
  28.  
  29. #ifdef DEBUGGING
  30. #ifndef DOINIT
  31. extern char *cmdname[];
  32. #else
  33. char *cmdname[] = {
  34.     "NULL",
  35.     "IF",
  36.     "ELSE",
  37.     "WHILE",
  38.     "BLOCK",
  39.     "EXPR",
  40.     "NEXT",
  41.     "ELSIF",
  42.     "CSWITCH",
  43.     "NSWITCH",
  44.     "10"
  45. };
  46. #endif
  47. #endif /* DEBUGGING */
  48.  
  49. #define CF_OPTIMIZE 077    /* type of optimization */
  50. #define CF_FIRSTNEG 0100/* conditional is ($register NE 'string') */
  51. #define CF_NESURE 0200    /* if short doesn't match we're sure */
  52. #define CF_EQSURE 0400    /* if short does match we're sure */
  53. #define CF_COND    01000    /* test c_expr as conditional first, if not null. */
  54.             /* Set for everything except do {} while currently */
  55. #define CF_LOOP 02000    /* loop on the c_expr conditional (loop modifiers) */
  56. #define CF_INVERT 04000    /* it's an "unless" or an "until" */
  57. #define CF_ONCE 010000    /* we've already pushed the label on the stack */
  58. #define CF_FLIP 020000    /* on a match do flipflop */
  59. #define CF_TERM 040000    /* value of this cmd might be returned */
  60. #define CF_DBSUB 0100000 /* this is an inserted cmd for debugging */
  61.  
  62. #define CFT_FALSE 0    /* c_expr is always false */
  63. #define CFT_TRUE 1    /* c_expr is always true */
  64. #define CFT_REG 2    /* c_expr is a simple register */
  65. #define CFT_ANCHOR 3    /* c_expr is an anchored search /^.../ */
  66. #define CFT_STROP 4    /* c_expr is a string comparison */
  67. #define CFT_SCAN 5    /* c_expr is an unanchored search /.../ */
  68. #define CFT_GETS 6    /* c_expr is <filehandle> */
  69. #define CFT_EVAL 7    /* c_expr is not optimized, so call eval() */
  70. #define CFT_UNFLIP 8    /* 2nd half of range not optimized */
  71. #define CFT_CHOP 9    /* c_expr is a chop on a register */
  72. #define CFT_ARRAY 10    /* this is a foreach loop */
  73. #define CFT_INDGETS 11    /* c_expr is <$variable> */
  74. #define CFT_NUMOP 12    /* c_expr is a numeric comparison */
  75. #define CFT_CCLASS 13    /* c_expr must start with one of these characters */
  76. #define CFT_D0 14    /* no special breakpoint at this line */
  77. #define CFT_D1 15    /* possible special breakpoint at this line */
  78.  
  79. #ifdef DEBUGGING
  80. #ifndef DOINIT
  81. extern char *cmdopt[];
  82. #else
  83. char *cmdopt[] = {
  84.     "FALSE",
  85.     "TRUE",
  86.     "REG",
  87.     "ANCHOR",
  88.     "STROP",
  89.     "SCAN",
  90.     "GETS",
  91.     "EVAL",
  92.     "UNFLIP",
  93.     "CHOP",
  94.     "ARRAY",
  95.     "INDGETS",
  96.     "NUMOP",
  97.     "CCLASS",
  98.     "14"
  99. };
  100. #endif
  101. #endif /* DEBUGGING */
  102.  
  103. struct acmd {
  104.     STAB    *ac_stab;    /* a symbol table entry */
  105.     ARG        *ac_expr;    /* any associated expression */
  106. };
  107.  
  108. struct ccmd {
  109.     CMD        *cc_true;    /* normal code to do on if and while */
  110.     CMD        *cc_alt;    /* else cmd ptr or continue code */
  111. };
  112.  
  113. struct scmd {
  114.     CMD        **sc_next;    /* array of pointers to commands */
  115.     short    sc_offset;    /* first value - 1 */
  116.     short    sc_max;        /* last value + 1 */
  117. };
  118.  
  119. struct cmd {
  120.     CMD        *c_next;    /* the next command at this level */
  121.     ARG        *c_expr;    /* conditional expression */
  122.     CMD        *c_head;    /* head of this command list */
  123.     STR        *c_short;    /* string to match as shortcut */
  124.     STAB    *c_stab;    /* a symbol table entry, mostly for fp */
  125.     SPAT    *c_spat;    /* pattern used by optimization */
  126.     char    *c_label;    /* label for this construct */
  127.     union ucmd {
  128.     struct acmd acmd;    /* normal command */
  129.     struct ccmd ccmd;    /* compound command */
  130.     struct scmd scmd;    /* switch command */
  131.     } ucmd;
  132.     short    c_slen;        /* len of c_short, if not null */
  133.     VOLATILE short c_flags;    /* optimization flags--see above */
  134.     HASH    *c_stash;    /* package line was compiled in */
  135.     STAB    *c_filestab;    /* file the following line # is from */
  136.     line_t      c_line;         /* line # of this command */
  137.     char    c_type;        /* what this command does */
  138. };
  139.  
  140. #define Nullcmd Null(CMD*)
  141. #define Nullcsv Null(CSV*)
  142.  
  143. EXT CMD * VOLATILE main_root INIT(Nullcmd);
  144. EXT CMD * VOLATILE eval_root INIT(Nullcmd);
  145.  
  146. EXT CMD compiling;
  147. EXT CMD * VOLATILE curcmd INIT(&compiling);
  148. EXT CSV * VOLATILE curcsv INIT(Nullcsv);
  149.  
  150. struct callsave {
  151.     SUBR *sub;
  152.     STAB *stab;
  153.     CSV *curcsv;
  154.     CMD *curcmd;
  155.     ARRAY *savearray;
  156.     ARRAY *argarray;
  157.     long depth;
  158.     int wantarray;
  159.     char hasargs;
  160. };
  161.  
  162. struct compcmd {
  163.     CMD *comp_true;
  164.     CMD *comp_alt;
  165. };
  166.  
  167. void opt_arg();
  168. ARG* evalstatic();
  169. int cmd_exec();
  170.