@@ -80,10 +80,63 @@
80 80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SBSTT_STRING 4 /* ex: {...} */
81 81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SBSTT_INTEGER 5 /* Integer including option sign */
82 82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SBSTT_INCOMPLETE 6 /* Unterminated string token */
83 83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SBSTT_UNKNOWN 7 /* Unknown token */
84 84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SBSTT_EOF 8 /* End of input */
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Values are stored in the hash table as instances of the following
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** structure.
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct SbSValue SbSValue;
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct SbSValue {
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int flags; /* Bitmask of SBSVAL_* values */
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ union {
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct {
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int size; /* Number of bytes in string, not counting final zero */
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *z; /* Pointer to string content */
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } str; /* Value if SBSVAL_STR */
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct {
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xVerb)(Subscript*, void*); /* Function to do the work */
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void *pArg; /* 2nd parameter to xVerb */
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } verb; /* Value if SBSVAL_VERB */
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } u;
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SBSVAL_VERB 0x0001 /* Value stored in u.verb */
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SBSVAL_STR 0x0002 /* Value stored in u.str */
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SBSVAL_DYN 0x0004 /* u.str.z is dynamically allocated */
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SBSVAL_EXEC 0x0008 /* u.str.z is a script */
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** An entry in the hash table is an instance of this structure.
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct SbsHashEntry SbsHashEntry;
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct SbsHashEntry {
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SbsHashEntry *pNext; /* Next entry with the same hash on zKey */
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SbSValue val; /* The payload */
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nKey; /* Length of the key */
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zKey[0]; /* The key */
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A hash table is an instance of the following structure.
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct SbsHashTab SbsHashTab;
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct SbsHashTab {
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SbsHashEntry *aHash[SBSCONFIG_NHASH]; /* The hash table */
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** An instance of the Subscript interpreter
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Subscript {
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nStack; /* Number of entries on stack */
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SbsHashTab symTab; /* The symbol table */
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zErrMsg[SBSCONFIG_ERRSIZE]; /* Space to write an error message */
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SbSValue aStack[SBSCONFIG_NSTACK]; /* The stack */
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
85 138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
86 139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
87 140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Given an input string z of length n, identify the token that
88 141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** starts at z[0]. Write the token type into *pTokenType and
89 142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** return the length of the token.
@@ -149,33 +202,10 @@
149 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pTokenType = SBSTT_UNKNOWN;
150 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
151 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
152 205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
153 206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Values are stored in the hash table as instances of the following
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** structure.
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typedef struct SbSValue SbSValue;
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct SbSValue {
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int flags; /* Bitmask of SBSVAL_* values */
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- union {
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct {
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int size; /* Number of bytes in string, not counting final zero */
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *z; /* Pointer to string content */
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } str; /* Value if SBSVAL_STR */
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct {
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int (*xVerb)(Subscript*, void*); /* Function to do the work */
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void *pArg; /* 2nd parameter to xVerb */
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } verb; /* Value if SBSVAL_VERB */
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } u;
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SBSVAL_VERB 0x0001 /* Value stored in u.verb */
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SBSVAL_STR 0x0002 /* Value stored in u.str */
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SBSVAL_DYN 0x0004 /* u.str.z is dynamically allocated */
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SBSVAL_EXEC 0x0008 /* u.str.z is a script */
176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
177 207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
178 208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Release any memory allocated by a value.
179 209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
180 210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void sbs_value_reset(SbSValue *p){
181 211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->flags & SBSVAL_DYN ){
@@ -184,30 +214,10 @@
184 214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->u.str.z = "";
185 215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->u.str.size = 0;
186 216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
187 217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
188 218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** An entry in the hash table is an instance of this structure.
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typedef struct SbsHashEntry SbsHashEntry;
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct SbsHashEntry {
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SbsHashEntry *pNext; /* Next entry with the same hash on zKey */
196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SbSValue val; /* The payload */
197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nKey; /* Length of the key */
198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char zKey[0]; /* The key */
199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** A hash table is an instance of the following structure.
203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typedef struct SbsHashTab SbsHashTab;
205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct SbsHashTab {
206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SbsHashEntry *aHash[SBSCONFIG_NHASH]; /* The hash table */
207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
209 219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
210 220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Compute a hash on a string.
211 221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
212 222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int sbs_hash(const char *z, int n){
213 223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int h = 0;
@@ -292,20 +302,10 @@
292 302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
293 303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
294 304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(pHash, 0, sizeof(*pHash));
295 305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
296 306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** An instance of the Subscript interpreter
299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct Subscript {
301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nStack; /* Number of entries on stack */
302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SbsHashTab symTab; /* The symbol table */
303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char zErrMsg[SBSCONFIG_ERRSIZE]; /* Space to write an error message */
304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SbSValue aStack[SBSCONFIG_NSTACK]; /* The stack */
305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
307 307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
308 308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Push a value onto the stack of an interpreter
309 309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
310 310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int sbs_push(Subscript *p, SbSValue *pVal){
311 311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->nStack>=SBSCONFIG_NSTACK ){
@@ -313,10 +313,23 @@
313 313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SBS_ERROR;
314 314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
315 315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->aStack[p->nStack++] = *pVal;
316 316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SBS_OK;
317 317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Create a new subscript interpreter. Return a pointer to the
321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** new interpreter, or return NULL if malloc fails.
322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Subscript *SbS_Create(void){
324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Subscript *p;
325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = malloc( sizeof(*p) );
326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p ){
327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(p, 0, sizeof(*p));
328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return p;
330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
318 331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
319 332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
320 333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Destroy an subscript interpreter
321 334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
322 335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void SbS_Destroy(struct Subscript *p){
@@ -570,28 +583,49 @@
570 583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SBSOP_ADD: c = a+b; break;
571 584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SBSOP_SUB: c = a-b; break;
572 585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SBSOP_MUL: c = a*b; break;
573 586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SBSOP_DIV: c = b!=0 ? a/b : 0; break;
574 587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SBSOP_AND: c = a && b; break;
575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case SBSOP_OR: c = a || b; break;
588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SBSOP_OR: c = a || b; break;
576 589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SBSOP_MIN: c = a<b ? a : b; break;
577 590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SBSOP_MAX: c = a<b ? b : a; break;
578 591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
579 592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SbS_Pop(p, 2);
580 593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SbS_PushInt(p, c);
581 594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
582 595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Subscript command: STRING hascap INTEGER
599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return true if the user has all of the capabilities listed.
601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int hascapCmd(struct Subscript *p, void *pNotUsed){
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *z;
604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, n, a;
605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SbS_RequireStack(p, 1, "hascap") ) return 1;
606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ z = SbS_StackValue(p, 0, &n);
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a = login_has_capability(z, n);
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SbS_Pop(p, 1);
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SbS_PushInt(p, a);
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
583 611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
584 612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
585 613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Subscript command: STRING puts
586 614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
587 615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int putsCmd(struct Subscript *p, void *pNotUsed){
588 616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int size;
589 617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *z;
590 618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( SbS_RequireStack(p, 1, "puts") ) return 1;
591 619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
z = SbS_StackValue(p, 0, &size);
592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- printf("%.*s\n", size, z);
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.cgiPanic ){
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zCopy = mprintf("%.*s", size, z);
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cgi_printf("%h", zCopy);
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ free(zCopy);
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ printf("%.*s\n", size, z);
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
593 627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SbS_Pop(p, 1);
594 628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
595 629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
596 630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
597 631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -598,53 +632,38 @@
598 632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
599 633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A table of built-in commands
600 634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
601 635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const struct {
602 636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCmd;
603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nCmd;
604 637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*xCmd)(Subscript*,void*);
605 638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pArg;
606 639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} aBuiltin[] = {
607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "add", 3, bopCmd, (void*)SBSOP_AND },
608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "and", 3, bopCmd, (void*)SBSOP_AND },
609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "div", 3, bopCmd, (void*)SBSOP_DIV },
610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "max", 3, bopCmd, (void*)SBSOP_MAX },
611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "min", 3, bopCmd, (void*)SBSOP_MIN },
612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "mul", 3, bopCmd, (void*)SBSOP_MUL },
613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "not", 3, notCmd, 0 },
614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "or", 2, bopCmd, (void*)SBSOP_OR },
615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "puts", 4, putsCmd, 0 },
616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "set", 3, setCmd, 0 },
617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "sub", 3, bopCmd, (void*)SBSOP_SUB },
618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** A table of built-in string and integer values
622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const struct {
624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zVar;
625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nVar;
626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pI;
627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *z;
628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- } aVars[] = {
629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "okAdmin", 7, &g.okAdmin, 0 },
630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "okSetup", 7, &g.okSetup, 0 },
631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Create a new subscript interpreter
637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct Subscript *SbS_Create(void){
639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Subscript *p;
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p = malloc( sizeof(*p) );
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p ){
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(p, 0, sizeof(*p));
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return p;
640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "add", bopCmd, (void*)SBSOP_AND },
641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "and", bopCmd, (void*)SBSOP_AND },
642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "div", bopCmd, (void*)SBSOP_DIV },
643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "hascap", hascapCmd, 0 },
644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "max", bopCmd, (void*)SBSOP_MAX },
645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "min", bopCmd, (void*)SBSOP_MIN },
646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "mul", bopCmd, (void*)SBSOP_MUL },
647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "not", notCmd, 0 },
648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "or", bopCmd, (void*)SBSOP_OR },
649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "puts", putsCmd, 0 },
650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "set", setCmd, 0 },
651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "sub", bopCmd, (void*)SBSOP_SUB },
652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Compare a zero-terminated string zPattern against
657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an unterminated string zStr of length nStr.
658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int compare_cmd(const char *zPattern, const char *zStr, int nStr){
660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int c = strncmp(zPattern, zStr, nStr);
661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( c==0 && zPattern[nStr]!=0 ){
662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ c = -1;
663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return c;
646 665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
647 666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
648 667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
649 668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Evaluate the script given by the first nScript bytes of zScript[].
650 669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return 0 on success and non-zero for an error.
@@ -691,43 +710,20 @@
691 710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int upr = sizeof(aBuiltin)/sizeof(aBuiltin[0]) - 1;
692 711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int lwr = 0;
693 712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SBS_ERROR;
694 713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( upr>=lwr ){
695 714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i = (upr+lwr)/2;
696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int c = strncmp(zScript, aBuiltin[i].zCmd, n);
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int c = compare_cmd(aBuiltin[i].zCmd, zScript, n);
697 716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( c==0 ){
698 717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = aBuiltin[i].xCmd(p, aBuiltin[i].pArg);
699 718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
700 719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( c<0 ){
701 720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
upr = i-1;
702 721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
703 722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lwr = i+1;
704 723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
705 724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( upr<lwr ){
707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If it is not a built-in command, look for a built-in
708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** variable */
709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- upr = sizeof(aVars)/sizeof(aVars[0]) - 1;
710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lwr = 0;
711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( upr>=lwr ){
712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i = (upr+lwr)/2;
713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int c = strncmp(zScript, aVars[i].zVar, n);
714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( c==0 ){
715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aVars[i].pI ){
716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SbS_PushInt(p, *aVars[i].pI);
717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SbS_Push(p, aVars[i].z, -1, 0);
719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SBS_OK;
721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( c<0 ){
723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- upr = i-1;
724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- lwr = i+1;
726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
729 725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pVal->flags & SBSVAL_VERB ){
730 726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pVal->u.verb.xVerb(p, pVal->u.verb.pArg);
731 727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pVal->flags & SBSVAL_EXEC ){
732 728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SbS_Eval(p, pVal->u.str.z, pVal->u.str.size);
733 729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
734 730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!