46 lines
1.4 KiB
C
46 lines
1.4 KiB
C
|
|
#ifndef _CONTROL_H
|
||
|
|
#define _CONTROL_H
|
||
|
|
|
||
|
|
|
||
|
|
/* Stuff to do control structures. We keep a history (seperate from
|
||
|
|
* the cshpar history, for now at least) of commands and their event
|
||
|
|
* numbers, with a block considered as a statement. In a goto, the
|
||
|
|
* first word in co_text is where to go, likewise for label. For
|
||
|
|
* conditional controls, we have to call ft_getpnames and ft_evaluate
|
||
|
|
* each time, since the dvec pointers will change... Also we should do
|
||
|
|
* variable and backquote substitution each time... */
|
||
|
|
struct control {
|
||
|
|
int co_type; /* One of CO_* ... */
|
||
|
|
wordlist *co_cond; /* if, while, dowhile */
|
||
|
|
char *co_foreachvar; /* foreach */
|
||
|
|
int co_numtimes; /* repeat, break & continue levels */
|
||
|
|
wordlist *co_text; /* Ordinary text and foreach values. */
|
||
|
|
struct control *co_parent; /* If this is inside a block. */
|
||
|
|
struct control *co_children; /* The contents of this block. */
|
||
|
|
struct control *co_elseblock; /* For if-then-else. */
|
||
|
|
struct control *co_next;
|
||
|
|
struct control *co_prev;
|
||
|
|
} ;
|
||
|
|
|
||
|
|
enum co_command {
|
||
|
|
CO_UNFILLED,
|
||
|
|
CO_STATEMENT,
|
||
|
|
CO_WHILE,
|
||
|
|
CO_DOWHILE,
|
||
|
|
CO_IF,
|
||
|
|
CO_FOREACH,
|
||
|
|
CO_BREAK,
|
||
|
|
CO_CONTINUE,
|
||
|
|
CO_LABEL,
|
||
|
|
CO_GOTO,
|
||
|
|
CO_REPEAT
|
||
|
|
};
|
||
|
|
|
||
|
|
#define CONTROLSTACKSIZE 256 /* Better be enough. */
|
||
|
|
|
||
|
|
extern struct control *control[CONTROLSTACKSIZE];
|
||
|
|
extern struct control *cend[CONTROLSTACKSIZE];
|
||
|
|
extern int stackp;
|
||
|
|
|
||
|
|
#endif
|