/* This file is part of the Project Athena Zephyr Notification System.
 * It is one of the source files comprising zwgc, the Zephyr WindowGram
 * client.
 *
 *      Created by:     Marc Horowitz <marc@athena.mit.edu>
 *
 *      $Id: node.h,v 1.4 2000/02/04 00:58:23 assar Exp $
 *
 *      Copyright (c) 1989 by the Massachusetts Institute of Technology.
 *      For copying and distribution information, see the file
 *      "mit-copyright.h".
 */


#include <zephyr/mit-copyright.h>

#ifndef node_MODULE
#define node_MODULE

#include "new_string.h"

#define  STRING_CONSTANT_OPCODE         0
#define  VARREF_OPCODE                  1
#define  VARNAME_OPCODE                 2

#define  NOT_OPCODE                     3

#define  PLUS_OPCODE                    4
#define  AND_OPCODE                     5
#define  OR_OPCODE                      6
#define  EQ_OPCODE                      7
#define  NEQ_OPCODE                     8
#define  REGEQ_OPCODE                   9
#define  REGNEQ_OPCODE                  10

#define  BUFFER_OPCODE                  11

#define  SUBSTITUTE_OPCODE              12
#define  PROTECT_OPCODE                 13
#define  VERBATIM_OPCODE                14
#define  STYLESTRIP_OPCODE              15
#define  GETENV_OPCODE                  16
#define  UPCASE_OPCODE                  17
#define  DOWNCASE_OPCODE                18
#define  ZVAR_OPCODE                    19
#define  GET_OPCODE                     20

#define  LANY_OPCODE                    21
#define  RANY_OPCODE                    22
#define  LBREAK_OPCODE                  23
#define  RBREAK_OPCODE                  24
#define  LSPAN_OPCODE                   25
#define  RSPAN_OPCODE                   26

#define  LAST_EXPR_OPCODE               26

#define  NOOP_OPCODE                    27
#define  SET_OPCODE                     28
#define  FIELDS_OPCODE                  29

#define  PRINT_OPCODE                   30
#define  CLEARBUF_OPCODE                31

#define  APPENDPORT_OPCODE              32
#define  EXECPORT_OPCODE                33
#define  INPUTPORT_OPCODE               34
#define  OUTPUTPORT_OPCODE              35
#define  PUT_OPCODE                     36
#define  CLOSEINPUT_OPCODE              37
#define  CLOSEOUTPUT_OPCODE             38
#define  CLOSEPORT_OPCODE               39

#define  EXEC_OPCODE                    40

#define  IF_STMT_OPCODE                 41
#define  CASE_OPCODE                    42
#define  WHILE_OPCODE                   43
#define  BREAK_OPCODE                   44
#define  EXIT_OPCODE                    45

#define  IF_OPCODE                      46
#define  ELSEIF_OPCODE                  47
#define  ELSE_OPCODE                    48
#define  MATCHLIST_OPCODE               49
#define  DEFAULT_OPCODE                 50

#define  NUMBER_OF_OPCODES              51

typedef struct _Node {
    int opcode;                              /* Read-only */
    struct _Node *next;
    union {
	string string_constant;
	struct {
	    struct _Node *first;
	    struct _Node *second;
	} nodes;
    } d;
} Node;

/* Function externs */

extern void node_DestroyAllNodes(void);

extern Node *node_create_string_constant(int opcode, string text);

extern Node *node_create_noary(int opcode);
extern Node *node_create_unary(int opcode, Node *arg);
extern Node *node_create_binary(int opcode, Node *first_arg, Node *second_arg);

/*
 *    Node *reverse_list_of_nodes(Node *list)
 *        Modifies: the nodes on the linked list list
 *        Effects: Reverses the linked list list and returns it.
 *                 This is done by modifing the next pointers of the
 *                 list elements to point to the previous node & returning
 *                 the address of the (previously) last node.
 */

extern Node *reverse_list_of_nodes(Node *);

#ifdef DEBUG
extern void node_display(Node *node);
#endif

#endif
