6 #include "carma/szaarrayutils/freelist.h"
7 #include "carma/szaarrayutils/list.h"
8 #include "carma/szaarrayutils/hash.h"
9 #include "carma/szaarrayutils/input.h"
10 #include "carma/szaarrayutils/output.h"
21 #define SC_HASH_SIZE 31
26 typedef struct Script Script;
41 #define SC_NEW_FN(fn) void *(fn)(Script *sc)
42 #define SC_CLR_FN(fn) int (fn)(Script *sc, void *data)
43 #define SC_DEL_FN(fn) void *(fn)(Script *sc, void *data)
49 Script *new_Script(
void *project, SC_NEW_FN(*new_fn), SC_CLR_FN(*clr_fn),
50 SC_DEL_FN(*del_fn), HashTable *signals);
51 Script *del_Script(Script *sc);
58 int compile_script(Script *sc,
char *name, InputStream *argstr,
59 InputStream *stream,
int restricted,
bool interactive);
61 int rewind_script(Script *sc);
62 int discard_script(Script *sc);
63 char *script_name(Script *sc);
64 int output_script_spec(OutputStream *out, Script *sc);
69 int run_interactive_command(Script *sc, OutputStream *log,
char *command);
74 int script_is_polling(Script *sc);
96 ScriptState step_script(Script *sc, OutputStream *log);
97 ScriptState exit_script(Script *sc,
char *reason);
98 ScriptState script_state(Script *sc);
107 typedef FreeList CommandMem;
108 CommandMem *new_CommandMem(Script *sc);
110 typedef FreeList FunctionMem;
111 FunctionMem *new_FunctionMem(Script *sc);
113 typedef FreeList ScOperatorMem;
114 ScOperatorMem *new_ScOperatorMem(Script *sc);
116 typedef FreeList DataTypeMem;
117 DataTypeMem *new_DataTypeMem(Script *sc);
119 typedef FreeList StatementMem;
120 StatementMem *new_StatementMem(Script *sc);
122 typedef FreeList ExprMem;
123 ExprMem *new_ExprMem(Script *sc);
125 typedef FreeList ExprOperMem;
126 ExprOperMem *new_ExprOperMem(Script *sc);
128 typedef FreeList LoopStateMem;
129 LoopStateMem *new_LoopStateMem(Script *sc);
131 typedef FreeList TypeSpecMem;
132 TypeSpecMem *new_TypeSpecMem(Script *sc);
134 typedef FreeList ExeFrameMem;
135 ExeFrameMem *new_ExeFrameMem(Script *sc);
137 typedef FreeList ListVariableMem;
138 ListVariableMem *new_ListVariableMem(Script *sc);
143 typedef List VariableList;
144 typedef List TypeSpecList;
145 typedef List StatementList;
146 typedef List ScopeStack;
147 typedef List CompStack;
148 typedef List ExprOperList;
149 typedef List LoopStateList;
150 typedef List ModifierList;
155 typedef struct Command Command;
156 typedef struct Function Function;
157 typedef struct ScOperator ScOperator;
158 typedef struct DataType DataType;
159 typedef struct Variable Variable;
160 typedef struct Statement Statement;
161 typedef struct Expr Expr;
162 typedef struct ExprOper ExprOper;
163 typedef struct LoopState LoopState;
164 typedef struct TypeSpec TypeSpec;
165 typedef struct ScriptObj ScriptObj;
166 typedef struct ExeFrame ExeFrame;
167 typedef struct StringPool StringPool;
186 void *new_ScriptObject(Script *sc, FreeList *fl,
size_t node_size);
195 FreeList *new_ScriptFreeList(Script *sc,
size_t node_size);
204 List *new_ScriptList(Script *sc);
223 std::string dataTypeName_;
224 std::string varName_;
229 CmdArg(std::string dataTypeName, std::string varName,
bool isOptional) {
230 dataTypeName_ = dataTypeName;
232 isOptional_ = isOptional;
235 CmdArg(CmdArg& arg) {
239 CmdArg(
const CmdArg& arg) {
243 void operator=(
const CmdArg& arg) {
244 *
this = (CmdArg&)arg;
247 void operator=(CmdArg& arg) {
248 dataTypeName_ = arg.dataTypeName_;
249 varName_ = arg.varName_;
250 isOptional_ = arg.isOptional_;
254 struct ScriptDataType {
255 sza::util::String name_;
261 ScriptDataType(std::string name, DataTypeId
id,
void* context=0) {
267 ScriptDataType(
const ScriptDataType& dataType) {
268 name_ = dataType.name_;
270 context_ = dataType.context_;
273 bool operator<(ScriptDataType& cmd) {
274 return name_ < cmd.name_;
277 bool operator==(ScriptDataType& dataType) {
278 return name_ == dataType.name_;
289 std::string declaration_;
290 std::string description_;
291 sza::util::String name_;
292 std::list<CmdArg> argList_;
298 ScriptCmd(std::string name) {
302 ScriptCmd(
const ScriptCmd& cmd) {
304 declaration_ = cmd.declaration_;
305 description_ = cmd.description_;
307 retType_ = cmd.retType_;
310 for(std::list<CmdArg>::const_iterator iArg=cmd.argList_.begin(); iArg != cmd.argList_.end(); iArg++)
311 argList_.insert(argList_.end(), *iArg);
314 bool operator<(ScriptCmd& cmd) {
315 return name_ < cmd.name_;
325 OutputStream *output;
331 HashMemory *hashtable;
334 FunctionMem *
function;
335 ScOperatorMem *scoperator;
336 DataTypeMem *datatype;
337 StatementMem *statement;
338 LoopStateMem *loopstate;
340 ExprOperMem *exproper;
341 TypeSpecMem *typespec;
342 ExeFrameMem *exeframe;
343 ListVariableMem *list_var;
356 DataType *wildcard_dt;
357 DataType *boolvar_dt;
361 DataType *integer_dt;
362 DataType *sexagesimal_dt;
364 DataType *input_file_dt;
375 StatementList *stmts;
380 CompStack *comp_stack;
382 StatementList *stmts;
398 std::list<ScriptCmd>* commands_;
399 std::list<ScriptCmd>* functions_;
400 std::list<ScriptCmd>* symbols_;
402 std::list<ScriptDataType>* dataTypes_;
405 void insert(
const ScriptDataType& dataType) {
406 if(!exists(dataType.name_))
407 dataTypes_->insert(dataTypes_->end(), dataType);
410 bool exists(
const sza::util::String& name) {
411 for(std::list<ScriptDataType>::iterator iDat=dataTypes_->begin();
412 iDat != dataTypes_->end(); iDat++)
413 if((*iDat).name_ == name)
423 void insert(ScriptCmd* cmd,
const CmdArg& cmdArg) {
424 if(!exists(cmdArg.dataTypeName_))
425 dataTypes_->insert(dataTypes_->end(),
426 ScriptDataType(cmdArg.dataTypeName_, DT_UNK));
428 cmd->argList_.insert(cmd->argList_.end(), cmdArg);
436 DataType *sc_Boolean_dt(Script *sc);
437 DataType *sc_String_dt(Script *sc);
438 DataType *sc_Symbol_dt(Script *sc);
439 DataType *sc_Double_dt(Script *sc);
440 DataType *sc_Integer_dt(Script *sc);
441 DataType *sc_Sexagesimal_dt(Script *sc);
442 DataType *sc_InputFile_dt(Script *sc);
443 DataType *sc_Signal_dt(Script *sc);
459 SYM_FUNCTION_KEYWORD,
483 StatementList *parse_StatementList(Script *sc, InputStream *stream,
int braces);
484 StatementList *parse_RestrictedStatementList(Script *sc, InputStream *stream);
490 Statement *parse_Statement(Script *sc, InputStream *stream,
int interactive);
503 TypeSpec *new_TypeSpec(Script *sc,
char *name, DataType *dt,
int is_list);
504 TypeSpec *append_TypeSpec(Script *sc, TypeSpecList *tl, TypeSpec *ts);
505 TypeSpec *parse_TypeSpec(Script *sc, InputStream *stream, Symbol *symbol);
506 TypeSpecList *new_TypeSpecList(Script *sc);
512 StatementList *stmts;
529 #define CMD_FN(fn) int (fn)(Script *sc, VariableList *args)
553 Command *add_UserCommand(Script *sc, InputStream *stream);
554 Command *add_BuiltinCommand(Script *sc,
char *declaration, CMD_FN(*cmd_fn));
555 Command *add_BuiltinCommand(Script *sc,
char *declaration, CMD_FN(*cmd_fn), std::string description);
583 #define FUNC_FN(fn) int (fn)(Script *sc, VariableList *args, Variable *result, \
591 #define LOOP_FN(fn) void (fn)(Script *sc, Variable *state, LoopOper oper)
604 Variable *get_loop_data(Script *sc, InputStream *stream, Function *func);
608 TypeSpec *return_type;
620 Function *add_UserFunction(Script *sc, InputStream *stream);
621 Function *add_BuiltinFunction(Script *sc,
char *declaration, FUNC_FN(*func_fn));
622 Function *add_BuiltinFunction(Script *sc,
char *declaration, FUNC_FN(*func_fn), std::string description);
623 Function *add_LoopStateFunction(Script *sc,
char *declaration,
624 FUNC_FN(*func_fn), LOOP_FN(*loop_fn),
630 #define OPER_FN(fn) int (fn)(Script *sc, VariableList *args, Variable *result)
634 TypeSpec *return_type;
637 ScOperator *new_ScOperator(Script *sc, DataType *return_dt,
int narg,
659 #define DT_PARSE(fn) int (fn)(Script *sc, DataType *dt, \
660 InputStream *stream, Expr *e)
675 #define DT_CONST(fn) int (fn)(Script *sc, DataType *dt, \
676 InputStream *stream, Expr *e)
682 #define DT_PRINT(fn) int (fn)(Script *sc, OutputStream *output, Variable *var)
691 #define DT_CHECK(fn) int (fn)(Script *sc, Variable *var, InputStream *stream)
716 #define DT_ITER(fn) int (fn)(Script *sc, Variable *first, Variable *last, \
717 Variable *step, int multiplier, Variable *value)
726 DT_ITER(sc_iterate_double);
734 DT_ITER(sc_iterate_int);
743 DT_ITER(sc_iterate_uint);
754 TypeSpecList *fields;
758 DataType *add_GroupDataType(Script *sc, InputStream *stream);
759 DataType *add_BuiltinGroupDataType(Script *sc,
char *declaration);
776 DataType *add_WildcardDataType(Script *sc);
783 DataType *add_BooleanDataType(Script *sc);
792 DataType *add_ChoiceDataType(Script *sc,
char *name, Enumerator *choices,
793 int nchoice,
bool allow_bit_mask=
false);
806 DataType *add_SetDataType(Script *sc,
char *name,
int allow_bit_mask,
807 Enumerator *members,
unsigned nmember, DT_ITER(*iter_fn),
char *incr_name);
818 DataType *add_StringDataType(Script *sc,
char *name,
int quoted,
819 DT_CHECK(*check_fn));
832 DataType *add_KeywordDataType(Script *sc,
char *name,
int fold,
833 DT_CHECK(*check_fn));
841 DataType *add_PathDataType(Script *sc,
char *name, DT_CHECK(*check_fn));
848 DataType *add_SymbolDataType(Script *sc);
871 #define DT_RELFN(fn) int (fn)(Variable *va, Variable *vb)
902 DataType *new_DataType(Script *sc,
char *name, TypeClass dataclass,
903 void *context,
size_t vsize,
904 DT_CHECK(*check_fn), DT_PARSE(*parse_fn),
905 DT_CONST(*const_fn), DT_PRINT(*print_fn),
906 DT_RELFN(*equal_fn), DT_RELFN(*gt_fn), DT_RELFN(*in_fn),
907 DT_ITER(*iter_fn),
char *incr_name,
908 DataTypeId
id = DT_UNK);
921 DataType *add_UintDataType(Script *sc,
char *name, DT_CHECK(*check_fn),
922 DT_ITER(*iter_fn),
char *incr_name);
926 DataType *add_IntDataType(Script *sc,
char *name, DT_CHECK(*check_fn),
927 DT_ITER(*iter_fn),
char *incr_name,
932 DataType *add_DoubleDataType(Script *sc,
char *name, DT_CHECK(*check_fn),
933 DT_ITER(*iter_fn),
char *incr_name,
943 DataType *add_SexagesimalDataType(Script *sc,
char *name, DT_CHECK(*check_fn),
944 DT_ITER(*iter_fn),
char *incr_name,
951 int parse_operand(Script *sc, DataType *dt,
int is_list,
952 InputStream *stream, Expr *e);
961 TypeSpec *parse_dollar_expr(Script *sc, DataType *dt,
int is_list,
962 InputStream *stream, Expr *e);
967 int parse_argument(Script *sc, TypeSpec *target, InputStream *stream, Expr *e);
972 int parse_procedure_arguments(Script *sc,
char *name,
int is_func, List *args,
973 ModifierList *mods, ListNode *opts,
974 InputStream *stream, Expr *e);
1006 Variable *new_Variable(Script *sc, TypeSpec *type);
1007 Variable *copy_Variable(Variable *dst, Variable *src);
1008 ListNode *append_Variable(Script *sc, VariableList *vl, Variable *var);
1009 int print_variable(Script *sc, OutputStream *output, Variable *var);
1010 int get_Arguments(VariableList *vl, ...);
1011 int print_ArgumentList(Script *sc, OutputStream *stream,
int expand,
1012 VariableList *args);
1013 Variable *add_BuiltinVariable(Script *sc,
char *declaration);
1015 VariableList *new_VariableList(Script *sc);
1023 #define OPTION_HAS_VALUE(arg) (~(arg)->flags & VAR_IS_NUL)
1033 #define LIST_VARIABLE(v) ((ListVariable *)(v))
1040 #define UINT_VARIABLE(v) ((UintVariable *)(v))
1042 DT_RELFN(sc_equal_uint);
1043 DT_RELFN(sc_gt_uint);
1051 #define SET_VARIABLE(v) ((SetVariable *)(v))
1058 #define CHOICE_VARIABLE(v) ((ChoiceVariable *)(v))
1066 #define BOOL_VARIABLE(v) ((BoolVariable *)(v))
1073 #define INT_VARIABLE(v) ((IntVariable *)(v))
1075 DT_RELFN(sc_equal_int);
1076 DT_RELFN(sc_gt_int);
1084 #define DOUBLE_VARIABLE(v) ((DoubleVariable *)(v))
1086 DT_RELFN(sc_equal_double);
1087 DT_RELFN(sc_gt_double);
1096 #define STRING_VARIABLE(v) ((StringVariable *)(v))
1098 DT_RELFN(sc_equal_string);
1099 DT_RELFN(sc_in_string);
1114 #define SYMBOL_VARIABLE(v) ((SymbolVariable *)(v))
1127 #define SIGNAL_VARIABLE(v) ((SignalVariable *)(v))
1129 DataType *add_SignalDataType(Script *sc,
char *name);
1133 Expr *new_Expr(Script *sc);
1137 ExprOper *add_LoadOper(Script *sc, Expr *e, Variable *var);
1138 ExprOper *add_FuncOper(Script *sc, Expr *e, Function *func, Variable *state);
1139 ExprOper *add_ListOper(Script *sc, Expr *e, DataType *dt,
unsigned n);
1140 ExprOper *add_GroupOper(Script *sc, Expr *e, DataType *dt);
1141 ExprOper *add_FieldOper(Script *sc, Expr *e,
unsigned field);
1142 ExprOper *add_CloneOper(Script *sc, Expr *e, TypeSpec *type);
1143 ExprOper *add_OpFnOper(Script *sc, Expr *e, ScOperator *oper);
1144 ExprOper *add_SkipOper(Script *sc, Expr *e);
1145 ExprOper *add_StoreOper(Script *sc, Expr *e, Variable *var);
1146 ExprOper *add_UnsetOper(Script *sc, Expr *e, Variable *var);
1147 ExprOper *add_SetBoolOper(Script *sc, Expr *e, Variable *var,
int state);
1148 ExprOper *add_SetStringOper(Script *sc, Expr *e, Variable *var,
char *
string);
1160 ListNode *get_ExprEnd(Expr *e);
1161 int remove_alias(Script *sc, Expr *e, ListNode *old_end);
1166 int exe_Expr(Script *sc, Expr *expr);
1172 VariableList *pop_ExprStackArgs(Script *sc, Expr *expr,
int narg);
1177 Variable *pop_ExprStack(Script *sc, Expr *expr);
1182 char *new_ScriptString(Script *sc,
char *
string);
1188 int push_Scope(Script *sc);
1189 int pop_Scope(Script *sc);
1195 Statement *push_CompStatement(Script *sc, Statement *stmt);
1196 Statement *pop_CompStatement(Script *sc);
1201 Symbol *add_ScriptSymbol(Script *sc,
char *name, SymbolType code,
void *data);
1202 Symbol *add_ScriptSymbol(Script *sc,
char *name, SymbolType code, std::string description);
1209 Symbol *find_ScriptSymbol(Script *sc, InputStream *stream,
char *name);
1214 DataType *find_DataType(Script *sc, InputStream *stream,
char *name);
1222 ExeFrame *push_ExeFrame(Script *sc, Statement *stmt, ListNode *next);
1223 Statement *pop_ExeFrame(Script *sc);
1228 StringPool *new_StringPool(
void);
1229 StringPool *del_StringPool(StringPool *sp);
1230 char *new_StringPool_string(StringPool *sp,
char *
string);
1231 int clr_StringPool(StringPool *sp);
1236 int add_script_signal(Script *sc,
char *name);
1237 Symbol *lookup_script_signal(Script *sc,
char *name);
1238 int signal_script(Script *sc, Symbol *sig);
1239 int clear_script_signal(Symbol *sig);
1240 int reset_script_signal(Symbol *sig);
1254 CatchState catch_script_events(Script *sc);
1263 Enumerator *choices;
1265 bool allow_bit_mask;
1275 Enumerator *members;
Tagged: Wed May 12 09:30:13 PDT 2004.