- Change help version to 5.4DEV
[nedit.git] / source / interpret.h
blob378928f6c5cc73d5a3ddb892df57d0921eeee510
1 /* $Id: interpret.h,v 1.11 2002/10/15 11:00:41 ajhood Exp $ */
3 #ifndef NEDIT_INTERPRET_H_INCLUDED
4 #define NEDIT_INTERPRET_H_INCLUDED
6 #include "nedit.h"
7 #include "rbTree.h"
9 #define MAX_ARGS 9 /* Maximum number of subroutine arguments */
10 #define STACK_SIZE 1024 /* Maximum stack size */
11 #define MAX_SYM_LEN 100 /* Max. symbol name length */
12 #define MACRO_EVENT_MARKER 2 /* Special value for the send_event field of
13 events passed to action routines. Tells
14 them that they were called from a macro */
16 enum symTypes {CONST_SYM, GLOBAL_SYM, LOCAL_SYM, ARG_SYM, PROC_VALUE_SYM,
17 C_FUNCTION_SYM, MACRO_FUNCTION_SYM, ACTION_ROUTINE_SYM};
18 #define N_OPS 40
19 enum operations {OP_RETURN_NO_VAL, OP_RETURN, OP_PUSH_SYM, OP_DUP, OP_ADD,
20 OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_NEGATE, OP_INCR, OP_DECR, OP_GT, OP_LT,
21 OP_GE, OP_LE, OP_EQ, OP_NE, OP_BIT_AND, OP_BIT_OR, OP_AND, OP_OR, OP_NOT,
22 OP_POWER, OP_CONCAT, OP_ASSIGN, OP_SUBR_CALL, OP_FETCH_RET_VAL, OP_BRANCH,
23 OP_BRANCH_TRUE, OP_BRANCH_FALSE, OP_BRANCH_NEVER, OP_ARRAY_REF,
24 OP_ARRAY_ASSIGN, OP_BEGIN_ARRAY_ITER, OP_ARRAY_ITER, OP_IN_ARRAY,
25 OP_ARRAY_DELETE, OP_PUSH_ARRAY_SYM, OP_ARRAY_REF_ASSIGN_SETUP};
27 enum typeTags {NO_TAG, INT_TAG, STRING_TAG, ARRAY_TAG};
29 enum execReturnCodes {MACRO_TIME_LIMIT, MACRO_PREEMPT, MACRO_DONE, MACRO_ERROR};
31 #define ARRAY_DIM_SEP "\034"
33 struct DataValueTag;
34 struct ProgramTag;
36 typedef int (*Inst)(void);
38 typedef int (*BuiltInSubr)(WindowInfo *window, struct DataValueTag *argList,
39 int nArgs, struct DataValueTag *result, char **errMsg);
41 typedef struct DataValueTag {
42 char tag;
43 union {
44 int n;
45 char *str;
46 BuiltInSubr subr;
47 struct ProgramTag* prog;
48 XtActionProc xtproc;
49 Inst* inst;
50 struct DataValueTag* dataval;
51 struct SparseArrayEntry *arrayPtr;
52 } val;
53 } DataValue;
55 typedef struct {
56 rbTreeNode nodePtrs; /* MUST BE FIRST ENTRY */
57 char *key;
58 DataValue value;
59 } SparseArrayEntry;
61 /* symbol table entry */
62 typedef struct SymbolRec {
63 char *name;
64 char type;
65 DataValue value;
66 struct SymbolRec *next; /* to link to another */
67 } Symbol;
69 typedef struct ProgramTag {
70 Symbol *localSymList;
71 Inst *code;
72 } Program;
74 /* Information needed to re-start a preempted macro */
75 typedef struct {
76 DataValue *stack;
77 DataValue *stackP;
78 DataValue *frameP;
79 Inst *pc;
80 WindowInfo *runWindow;
81 WindowInfo *focusWindow;
82 } RestartData;
84 void InitMacroGlobals(void);
86 SparseArrayEntry *arrayIterateFirst(DataValue *theArray);
87 SparseArrayEntry *arrayIterateNext(SparseArrayEntry *iterator);
88 struct SparseArrayEntry *ArrayNew(void);
89 int ArrayInsert(DataValue *theArray, char *keyStr, DataValue *theValue);
90 void ArrayDelete(DataValue *theArray, char *keyStr);
91 void ArrayDeleteAll(DataValue *theArray);
92 int ArraySize(DataValue *theArray);
93 int ArrayGet(DataValue *theArray, char *keyStr, DataValue *theValue);
94 int ArrayCopy(DataValue *dstArray, DataValue *srcArray);
96 /* Routines for creating a program, (accumulated beginning with
97 BeginCreatingProgram and returned via FinishCreatingProgram) */
98 void BeginCreatingProgram(void);
99 int AddOp(int op, char **msg);
100 int AddSym(Symbol *sym, char **msg);
101 int AddImmediate(void *value, char **msg);
102 int AddBranchOffset(Inst *to, char **msg);
103 Inst *GetPC(void);
104 Symbol *InstallIteratorSymbol();
105 Symbol *LookupStringConstSymbol(const char *value);
106 Symbol *LookupSymbol(const char *name);
107 Symbol *InstallSymbol(const char *name, int type, DataValue value);
108 Program *FinishCreatingProgram(void);
109 void SwapCode(Inst *start, Inst *boundary, Inst *end);
110 void StartLoopAddrList(void);
111 int AddBreakAddr(Inst *addr);
112 int AddContinueAddr(Inst *addr);
113 void FillLoopAddrs(Inst *breakAddr, Inst *continueAddr);
115 /* Routines for executing programs */
116 int ExecuteMacro(WindowInfo *window, Program *prog, int nArgs, DataValue *args,
117 DataValue *result, RestartData **continuation, char **msg);
118 int ContinueMacro(RestartData *continuation, DataValue *result, char **msg);
119 void RunMacroAsSubrCall(Program *prog);
120 void PreemptMacro(void);
121 char *AllocString(int length);
122 char *AllocStringNCpy(const char *s, int length);
123 char *AllocStringCpy(const char *s);
124 void GarbageCollectStrings(void);
125 void FreeRestartData(RestartData *context);
126 Symbol *PromoteToGlobal(Symbol *sym);
127 void FreeProgram(Program *prog);
128 void ModifyReturnedValue(RestartData *context, DataValue dv);
129 WindowInfo *MacroRunWindow(void);
130 WindowInfo *MacroFocusWindow(void);
131 void SetMacroFocusWindow(WindowInfo *window);
133 #endif /* NEDIT_INTERPRET_H_INCLUDED */