Libprimis
Imprimis' 3D destroyable world engine
Loading...
Searching...
No Matches
command.h
Go to the documentation of this file.
1
9#ifndef COMMAND_H_
10#define COMMAND_H_
11
12enum
13{
14 Value_Null = 0,
15 Value_Integer,
16 Value_Float,
17 Value_String,
18 Value_Any,
19 Value_Code,
20 Value_Macro,
21 Value_Ident,
22 Value_CString,
23 Value_CAny,
24 Value_Word,
25 Value_Pop,
26 Value_Cond,
27};
28
29enum
30{
31 Id_Var, //0
32 Id_FloatVar,
33 Id_StringVar,
34 Id_Command,
35 Id_Alias,
36 Id_Local, //5
37 Id_Do,
38 Id_DoArgs,
39 Id_If,
40 Id_Result,
41 Id_Not, //10
42 Id_And,
43 Id_Or, //12
44};
45
46enum
47{
48 Idf_Persist = 1<<0,
49 Idf_Override = 1<<1,
50 Idf_Hex = 1<<2,
51 Idf_ReadOnly = 1<<3,
52 Idf_Overridden = 1<<4,
53 Idf_Unknown = 1<<5,
54 Idf_Arg = 1<<6,
55};
56
57struct ident;
58
60{
61 union
62 {
63 int i; // Id_Var, ValueInteger
64 float f; // Id_FloatVar, ValueFloat
65 char *s; // Id_StringVar, ValueString
66 const uint *code; // ValueCode
67 ident *id; // ValueIdent
68 const char *cstr; // ValueCString
69 };
70};
71
73{
74 int type;
75
76 void setint(int val);
77 void setfloat(float val);
78 void setnumber(double val);
79 void setstr(char *val);
80 void setnull();
81 void setcode(const uint *val);
82 void setmacro(const uint *val);
83 void setcstr(const char *val);
84 void setident(ident *val);
85
86 const char *getstr() const;
87 int getint() const;
88 float getfloat() const;
89 double getnumber() const;
90 bool getbool() const;
91 void getval(tagval &r) const;
92
93 void cleanup();
94};
95
97{
98 identval val;
99 int valtype;
100 identstack *next;
101};
102
103typedef void (__cdecl *identfun)(ident *id);
104
113struct ident
114{
115 //this pointer will point to different types depending upon the type of variable
117 {
118 void *p;
119 int *i;
120 float *f;
121 char **s;
122 };
123
124 uchar type;
125 union
126 {
127 uchar valtype;
128 uchar numargs;
129 };
130 ushort flags;
131 int index;
132 const char *name;
133 union
134 {
135 struct // Id_Var, Id_FloatVar, Id_StringVar
136 {
137 union //number var range union type
138 {
139 struct
140 {
141 int minval,
143 }; // Id_Var
144 struct
145 {
146 float minvalf,
148 }; // Id_FloatVar
149 };
150 identvalptr storage;
151 identval overrideval;
152 };
153 struct // Id_Alias
154 {
155 uint *code;
156 identval val;
157 identstack *stack;
158 };
159 struct // Id_Command
160 {
161 const char *args;
162 uint argmask;
163 };
164 };
165 identfun fun;
167 ident() {}
171 ident(int t, const char *n, int m, int x, int *s, void *f = nullptr, int flags = 0)
172 : type(t), flags(flags | (m > x ? Idf_ReadOnly : 0)), name(n), minval(m), maxval(x), fun((identfun)f)
173 { storage.i = s; }
174
178 ident(int t, const char *n, float m, float x, float *s, void *f = nullptr, int flags = 0)
179 : type(t), flags(flags | (m > x ? Idf_ReadOnly : 0)), name(n), minvalf(m), maxvalf(x), fun((identfun)f)
180 { storage.f = s; }
181
185 ident(int t, const char *n, char **s, void *f = nullptr, int flags = 0)
186 : type(t), flags(flags), name(n), fun((identfun)f)
187 { storage.s = s; }
188
189 // Id_Alias
190 ident(int t, const char *n, char *a, int flags)
191 : type(t), valtype(Value_String), flags(flags), name(n), code(nullptr), stack(nullptr)
192 { val.s = a; }
193
194 ident(int t, const char *n, int a, int flags)
195 : type(t), valtype(Value_Integer), flags(flags), name(n), code(nullptr), stack(nullptr)
196 { val.i = a; }
197
198 ident(int t, const char *n, float a, int flags)
199 : type(t), valtype(Value_Float), flags(flags), name(n), code(nullptr), stack(nullptr)
200 { val.f = a; }
201
202 ident(int t, const char *n, int flags)
203 : type(t), valtype(Value_Null), flags(flags), name(n), code(nullptr), stack(nullptr)
204 {}
205 ident(int t, const char *n, const tagval &v, int flags)
206 : type(t), valtype(v.type), flags(flags), name(n), code(nullptr), stack(nullptr)
207 { val = v; }
208
212 ident(int t, const char *n, const char *args, uint argmask, int numargs, void *f = nullptr, int flags = 0)
213 : type(t), numargs(numargs), flags(flags), name(n), args(args), argmask(argmask), fun((identfun)f)
214 {}
215
222 void changed()
223 {
224 if(fun)
225 {
226 fun(this);
227 }
228 }
229
238 void setval(const tagval &v)
239 {
240 valtype = v.type;
241 val = v;
242 }
243
252 void setval(const identstack &v)
253 {
254 valtype = v.valtype;
255 val = v.val;
256 }
257
264 {
265 if(valtype==Value_String)
266 {
267 delete[] val.s;
268 }
269 valtype = Value_Null;
270 }
271
279 float getfloat() const;
280
286 int getint() const;
287
295 double getnumber() const;
296 const char *getstr() const;
297 void getval(tagval &r) const;
298 void getcstr(tagval &v) const;
299 void getcval(tagval &v) const;
300};
301
310extern void intret(int v);
311
312extern const char *floatstr(float v);
313
322extern void floatret(float v);
323
332extern void stringret(char *s);
333
342extern void result(const char *s);
343
354inline int parseint(const char *s)
355{
356 return static_cast<int>(std::strtoul(s, nullptr, 0));
357}
358
372extern int variable(const char *name, int min, int cur, int max, int *storage, identfun fun, int flags);
373
390extern float fvariable(const char *name, float min, float cur, float max, float *storage, identfun fun, int flags);
391
403extern char *svariable(const char *name, const char *cur, char **storage, identfun fun, int flags);
404
413extern void setvar(const char *name, int i, bool dofunc = true, bool doclamp = true);
414
423extern void setfvar(const char *name, float f, bool dofunc = true, bool doclamp = true);
424
432extern void setsvar(const char *name, const char *str, bool dofunc = true);
433
445extern bool addcommand(const char *name, identfun fun, const char *narg = "", int type = Id_Command);
446
447extern std::queue<ident *> triggerqueue;
456extern ident *getident(const char *name);
457extern int execute(const uint *code);
458
468extern int execute(const char *p);
469
480extern int execident(const char *name, int noid = 0, bool lookup = false);
481extern bool executebool(const uint *code);
482
492extern bool execfile(const char *cfgfile, bool msg = true);
493
503extern const char *escapestring(const char *s);
504
513extern void printvar(const ident *id, int i);
514
530extern int clampvar(bool hex, std::string name, int i, int minval, int maxval);
531extern void loopiter(ident *id, identstack &stack, int i);
532extern void loopend(ident *id, identstack &stack);
533
544const char *escapeid(const char *s);
545
554extern void writecfg(const char *savedconfig, const char *autoexec = nullptr, const char *defaultconfig = nullptr, const char *name = nullptr);
555
565extern void checksleep(int millis);
566
576extern bool initidents();
577
578extern int identflags;
587extern void clear_command();
588
589// nasty macros for registering script functions, abuses globals to avoid excessive infrastructure
590
591//* note: many of the VARF comments are very repetitive, because the code itself is nearly duplicated too *//
592
593/* how command registration works:
594 * In C++, all global variables must be initiated before main() is called
595 * Each of these macro kludges (which are placed at the global scope level) initializes some kind of global variable
596 * Because the macro kludges are the definition of global variables, at program initializiation, they must be run first
597 * The values of the variables themselves don't matter because they only exist to cheat and run before main()
598 * The macro kludges themselves register commands or values within some vector<>-s which keeps track of all cmds/vars
599 */
600
601/*
602 * Parameter Flags (exhaustive list, not exhaustive descriptions)
603 * i an integer parameter
604 * b a boolean parameter
605 * f a float parameter (sets to 0 if over parameter limit)
606 * F a float parameter (sets to value of previous parameter if over parameter limit)
607 * s a string parameter (sets to new allocated string "" if over parameter limit)
608 * S a string paremter (sets current string to "" if over parameter limit)
609 * t sets to null if over parameter limit
610 * T same as "t"
611 * e a code block parameter
612 * E a code block paremter (null)
613 * r an ident parameter
614 * $ an ident parameter
615 * N a number parameter
616 * D a bind parameter (e.g. player movement), adds a release action for the command
617 * C an ident parameter, ComC
618 * V a series of variadic parameter(s) (open ended series of values)
619 * 1 repeat one arg
620 * 2 repeat two args
621 * 3 repeat three args
622 * 4 repeat four args
623 */
624
625//integer var macros
626//VAR_, _VARF, VARM_ are templates for "normal" macros that do not execute an inline function
627#define VAR_(name, global, min, cur, max, persist) int global = variable(#name, min, cur, max, &global, nullptr, persist)
628#define VARN(name, global, min, cur, max) VAR_(name, global, min, cur, max, 0)
629#define VARNP(name, global, min, cur, max) VAR_(name, global, min, cur, max, Idf_Persist)
630#define VARNR(name, global, min, cur, max) VAR_(name, global, min, cur, max, Idf_Override)
631#define VAR(name, min, cur, max) VAR_(name, name, min, cur, max, 0)
632#define VARP(name, min, cur, max) VAR_(name, name, min, cur, max, Idf_Persist)
633#define VARR(name, min, cur, max) VAR_(name, name, min, cur, max, Idf_Override)
634
635//variable with inline function to be executed on change (VARiable with Function = VARF)
636#define VARF_(name, global, min, cur, max, body, persist) \
637 int global = variable(#name, min, cur, max, &global, [] (ident *) { body; }, persist); /* assign variable, needs fxn prototype declared above */
638
639#define VARFN(name, global, min, cur, max, body) VARF_(name, global, min, cur, max, body, 0)
640#define VARF(name, min, cur, max, body) VARF_(name, name, min, cur, max, body, 0)
641#define VARFP(name, min, cur, max, body) VARF_(name, name, min, cur, max, body, Idf_Persist)
642#define VARFR(name, min, cur, max, body) VARF_(name, name, min, cur, max, body, Idf_Override)
643#define VARFNP(name, global, min, cur, max, body) VARF_(name, global, min, cur, max, body, Idf_Persist)
644
645//hexadecimal var macros
646#define HVAR_(name, global, min, cur, max, persist) int global = variable(#name, min, cur, max, &global, nullptr, persist | Idf_Hex)
647#define HVARP(name, min, cur, max) HVAR_(name, name, min, cur, max, Idf_Persist)
648
649//hex variable with function to be executed on change (Hexadecimal VARiable with Function = HVARF)
650//the CVAR series of macros borrows the HVARF macro as it deals with hex colors
651#define HVARF_(name, global, min, cur, max, body, persist) \
652 int global = variable(#name, min, cur, max, &global, [] (ident *) { body; }, persist | Idf_Hex); /* assign variable, needs fxn prototype declared above */
653
654//color var macros
655#define CVAR_(name, cur, init, body, persist) bvec name = bvec::hexcolor(cur); HVARF_(name, _##name, 0, cur, 0xFFFFFF, { init; name = bvec::hexcolor(_##name); body; }, persist)
656#define CVARP(name, cur) CVAR_(name, cur, , , Idf_Persist)
657#define CVARR(name, cur) CVAR_(name, cur, , , Idf_Override)
658#define CVARFP(name, cur, body) CVAR_(name, cur, , body, Idf_Persist)
659#define CVAR0_(name, cur, body, persist) CVAR_(name, cur, { if(!_##name) _##name = cur; }, body, persist)
660#define CVAR0R(name, cur) CVAR0_(name, cur, , Idf_Override)
661#define CVAR1_(name, cur, body, persist) CVAR_(name, cur, { if(_##name <= 255) _##name |= (_##name<<8) | (_##name<<16); }, body, persist)
662#define CVAR1R(name, cur) CVAR1_(name, cur, , Idf_Override)
663#define CVAR1FR(name, cur, body) CVAR1_(name, cur, body, Idf_Override)
664
665//float var macros
666#define FVAR_(name, global, min, cur, max, persist) float global = fvariable(#name, min, cur, max, &global, nullptr, persist)
667#define FVARNP(name, global, min, cur, max) FVAR_(name, global, min, cur, max, Idf_Persist)
668#define FVAR(name, min, cur, max) FVAR_(name, name, min, cur, max, 0)
669#define FVARP(name, min, cur, max) FVAR_(name, name, min, cur, max, Idf_Persist)
670#define FVARR(name, min, cur, max) FVAR_(name, name, min, cur, max, Idf_Override)
671
672//float variable with function to be executed on change (Float VARiable with Function = FVARF)
673#define FVARF_(name, global, min, cur, max, body, persist) \
674 float global = fvariable(#name, min, cur, max, &global, [] (ident *) { body; }, persist); /* assign variable, needs fxn prototype declared above */ \
675
676#define FVARF(name, min, cur, max, body) FVARF_(name, name, min, cur, max, body, 0)
677#define FVARFP(name, min, cur, max, body) FVARF_(name, name, min, cur, max, body, Idf_Persist)
678#define FVARFR(name, min, cur, max, body) FVARF_(name, name, min, cur, max, body, Idf_Override)
679
680//string var macros
681#define SVAR_(name, global, cur, persist) char *global = svariable(#name, cur, &global, nullptr, persist)
682#define SVAR(name, cur) SVAR_(name, name, cur, 0)
683#define SVARP(name, cur) SVAR_(name, name, cur, Idf_Persist)
684#define SVARR(name, cur) SVAR_(name, name, cur, Idf_Override)
685
686//string variable with function to be executed on change (Float VARiable with Function = FVARF)
687#define SVARF_(name, global, cur, body, persist) \
688 char *global = svariable(#name, cur, &global, [] (ident *) { body; }, persist); /* assign variable, needs fxn prototype declared above */
689
690#define SVARF(name, cur, body) SVARF_(name, name, cur, body, 0)
691#define SVARFR(name, cur, body) SVARF_(name, name, cur, body, Idf_Override)
692
693#endif /* COMMAND_H_ */
void stringret(char *s)
Returns a string value from a Cubescript command.
void result(const char *s)
Returns an alias' name from a Cubescript command.
const char * escapestring(const char *s)
Replaces C style excape characters with Cubescript ones.
void intret(int v)
Returns an integer value from a Cubescript command.
int variable(const char *name, int min, int cur, int max, int *storage, identfun fun, int flags)
Registers an int variable in the Cubescript ident table.
const char * escapeid(const char *s)
Escapes a string unless it is null.
void floatret(float v)
Returns a float value from a Cubescript command.
void setfvar(const char *name, float f, bool dofunc=true, bool doclamp=true)
Sets a Cubescript float value to the given value.
void setsvar(const char *name, const char *str, bool dofunc=true)
Sets a Cubescript string value to the given value.
void setvar(const char *name, int i, bool dofunc=true, bool doclamp=true)
Sets a Cubescript integer value to the given value.
bool execfile(const char *cfgfile, bool msg=true)
Executes the contents of the referenced file.
int parseint(const char *s)
Returns the string passed as an integer.
Definition command.h:354
bool initidents()
Initializes the CubeScript preset argument idents.
bool addcommand(const char *name, identfun fun, const char *narg="", int type=Id_Command)
Registers a command in the Cubescript ident table.
int clampvar(bool hex, std::string name, int i, int minval, int maxval)
Modifies the value passed to fall within the boundaries passed.
int execident(const char *name, int noid=0, bool lookup=false)
Executes the contents of an ident, searched by name.
void printvar(const ident *id, int i)
Prints out the formatted variable.
void writecfg(const char *savedconfig, const char *autoexec=nullptr, const char *defaultconfig=nullptr, const char *name=nullptr)
Writes out the state of the CubeScript idents to a file.
void clear_command()
Clears all aliases from the ident map.
char * svariable(const char *name, const char *cur, char **storage, identfun fun, int flags)
Registers a C string variable in the Cubescript ident table.
int identflags
float fvariable(const char *name, float min, float cur, float max, float *storage, identfun fun, int flags)
Registers a float variable in the Cubescript ident table.
ident * getident(const char *name)
Returns the pointer to the ident object with the given CS alias.
void checksleep(int millis)
Processes the cubescript sleep queue.
std::queue< ident * > triggerqueue
An object representing all Cubescript objects.
Definition command.h:114
double getnumber() const
Returns the saved value of the ident as a double.
ident(int t, const char *n, char **s, void *f=nullptr, int flags=0)
Constructor for an ident for a string variable.
Definition command.h:185
void forcenull()
Sets the value type of this ident to null.
Definition command.h:263
void changed()
Calls a change effect for this ident, if one exists.
Definition command.h:222
int minval
Definition command.h:141
void setval(const identstack &v)
Sets the value and type of value of this ident given an identstack.
Definition command.h:252
float getfloat() const
Returns the saved value of the ident as a float.
uchar valtype
Definition command.h:127
uchar numargs
Definition command.h:128
ident(int t, const char *n, int m, int x, int *s, void *f=nullptr, int flags=0)
Constructor for an ident for an int variable.
Definition command.h:171
int getint() const
Returns the saved value of the ident as an integer.
int maxval
Definition command.h:142
uchar type
Definition command.h:124
ident(int t, const char *n, const char *args, uint argmask, int numargs, void *f=nullptr, int flags=0)
Constructor for an ident for a C++ bound command.
Definition command.h:212
identfun fun
Definition command.h:165
float maxvalf
Definition command.h:147
void setval(const tagval &v)
Sets the value and type of value of this ident given a tagval.
Definition command.h:238
ident(int t, const char *n, float m, float x, float *s, void *f=nullptr, int flags=0)
Constructor for an ident for a float variable.
Definition command.h:178
float minvalf
Definition command.h:146
Definition command.h:97
Definition command.h:60
Definition command.h:73
Definition command.h:117
char ** s
Definition command.h:121
int * i
Definition command.h:119
float * f
Definition command.h:120
void * p
Definition command.h:118