Skip to content

Commit d65cfae

Browse files
make tokenizer_variable_name return the variable length that it iterated, so we dont need to separately call strlen for it later
1 parent 780d8e7 commit d65cfae

File tree

12 files changed

+64
-47
lines changed

12 files changed

+64
-47
lines changed

include/basic/defines.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@
100100
[[maybe_unused]] char* oldptr = 0; \
101101
[[maybe_unused]] char const* oldnextptr = NULL; \
102102
[[maybe_unused]] int gotone = 0; \
103-
[[maybe_unused]] int bracket_depth = 0; \
103+
[[maybe_unused]] int bracket_depth = 0; \
104+
[[maybe_unused]] size_t strlength; \
104105
[[maybe_unused]] char const* item_begin = ctx->ptr;
105106

106107
/**
@@ -140,8 +141,8 @@
140141
strval = (char*)str_expr(ctx); \
141142
} else if (itemtype == BIP_DOUBLE) { \
142143
double_expr(ctx, &doubleval); \
143-
} else if (itemtype == BIP_VARIABLE) { \
144-
strval = (char*)tokenizer_variable_name(ctx); \
144+
} else if (itemtype == BIP_VARIABLE) { \
145+
strval = (char*)tokenizer_variable_name(ctx, &strlength); \
145146
} else { \
146147
intval = expr(ctx); \
147148
} \

include/basic/tokenizer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,9 +248,10 @@ void tokenizer_fnum(struct basic_ctx* ctx, enum token_t token, double* f);
248248
* (do not advance the pointer)
249249
*
250250
* @param ctx context
251+
* @param count Upon return contains the string length of the variable name
251252
* @return const char* variable name
252253
*/
253-
const char* tokenizer_variable_name(struct basic_ctx* ctx);
254+
const char* tokenizer_variable_name(struct basic_ctx* ctx, size_t* count);
254255

255256
/**
256257
* @brief Get a string constant as the next token

src/basic/array.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -444,12 +444,13 @@ void basic_set_int_array_variable(const char* var, int64_t index, int64_t value,
444444
void dim_statement(struct basic_ctx* ctx)
445445
{
446446
accept_or_return(DIM, ctx);
447-
const char* array_name = tokenizer_variable_name(ctx);
447+
size_t var_length;
448+
const char* array_name = tokenizer_variable_name(ctx, &var_length);
448449
accept_or_return(VARIABLE, ctx);
449450
accept_or_return(COMMA, ctx);
450451
int64_t array_size = expr(ctx);
451452
accept_or_return(NEWLINE, ctx);
452-
char last = array_name[strlen(array_name) - 1];
453+
char last = array_name[var_length - 1];
453454
switch (last) {
454455
case '#':
455456
basic_dim_double_array(array_name, array_size, ctx);
@@ -465,12 +466,13 @@ void dim_statement(struct basic_ctx* ctx)
465466
void redim_statement(struct basic_ctx* ctx)
466467
{
467468
accept_or_return(REDIM, ctx);
468-
const char* array_name = tokenizer_variable_name(ctx);
469+
size_t var_length;
470+
const char* array_name = tokenizer_variable_name(ctx, &var_length);
469471
accept_or_return(VARIABLE, ctx);
470472
accept_or_return(COMMA, ctx);
471473
int64_t array_size = expr(ctx);
472474
accept_or_return(NEWLINE, ctx);
473-
char last = array_name[strlen(array_name) - 1];
475+
char last = array_name[var_length - 1];
474476
switch (last) {
475477
case '#':
476478
basic_redim_double_array(array_name, array_size, ctx);
@@ -667,12 +669,13 @@ bool basic_push_double_array(const char* var, int64_t push_pos, struct basic_ctx
667669
void push_statement(struct basic_ctx* ctx)
668670
{
669671
accept_or_return(PUSH, ctx);
670-
const char* array_name = tokenizer_variable_name(ctx);
672+
size_t var_length;
673+
const char* array_name = tokenizer_variable_name(ctx, &var_length);
671674
accept_or_return(VARIABLE, ctx);
672675
accept_or_return(COMMA, ctx);
673676
int64_t push_pos = expr(ctx);
674677
accept_or_return(NEWLINE, ctx);
675-
char last = array_name[strlen(array_name) - 1];
678+
char last = array_name[var_length - 1];
676679
switch (last) {
677680
case '#':
678681
basic_push_double_array(array_name, push_pos, ctx);
@@ -688,12 +691,13 @@ void push_statement(struct basic_ctx* ctx)
688691
void pop_statement(struct basic_ctx* ctx)
689692
{
690693
accept_or_return(POP, ctx);
691-
const char* array_name = tokenizer_variable_name(ctx);
694+
size_t var_length;
695+
const char* array_name = tokenizer_variable_name(ctx, &var_length);
692696
accept_or_return(VARIABLE, ctx);
693697
accept_or_return(COMMA, ctx);
694698
int64_t pop_pos = expr(ctx);
695699
accept_or_return(NEWLINE, ctx);
696-
char last = array_name[strlen(array_name) - 1];
700+
char last = array_name[var_length - 1];
697701
switch (last) {
698702
case '#':
699703
basic_pop_double_array(array_name, pop_pos, ctx);

src/basic/console.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ bool check_input_in_progress(process_t* proc, void* opaque)
9797
void input_statement(struct basic_ctx* ctx)
9898
{
9999
accept_or_return(INPUT, ctx);
100-
const char* var = tokenizer_variable_name(ctx);
100+
size_t var_length;
101+
const char* var = tokenizer_variable_name(ctx, &var_length);
101102
accept_or_return(VARIABLE, ctx);
102103

103104
process_t* proc = proc_cur(logical_cpu_id());
@@ -112,7 +113,7 @@ void input_statement(struct basic_ctx* ctx)
112113

113114
proc_set_idle(proc, NULL, NULL);
114115

115-
switch (var[strlen(var) - 1]) {
116+
switch (var[var_length - 1]) {
116117
case '$':
117118
basic_set_string_variable(var, kgetinput(), ctx, false, false);
118119
break;
@@ -329,7 +330,8 @@ bool check_key_waiting(process_t* proc, void* opaque)
329330
void kget_statement(struct basic_ctx* ctx)
330331
{
331332
accept_or_return(KGET, ctx);
332-
const char* var = tokenizer_variable_name(ctx);
333+
size_t var_length;
334+
const char* var = tokenizer_variable_name(ctx, &var_length);
333335
accept_or_return(VARIABLE, ctx);
334336

335337
process_t* proc = proc_cur(logical_cpu_id());
@@ -345,7 +347,7 @@ void kget_statement(struct basic_ctx* ctx)
345347

346348
unsigned char c = kgetc();
347349

348-
switch (var[strlen(var) - 1]) {
350+
switch (var[var_length - 1]) {
349351
case '$': {
350352
char str[2] = { c, '\0' };
351353
basic_set_string_variable(var, str, ctx, false, false);

src/basic/file_io.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,8 @@ void write_statement(struct basic_ctx* ctx)
279279
int fd = -1;
280280

281281
accept_or_return(WRITE, ctx);
282-
fd = basic_get_numeric_int_variable(tokenizer_variable_name(ctx), ctx);
282+
size_t var_length;
283+
fd = basic_get_numeric_int_variable(tokenizer_variable_name(ctx, &var_length), ctx);
283284
accept_or_return(VARIABLE, ctx);
284285
accept_or_return(COMMA, ctx);
285286
char* out = printable_syntax(ctx);

src/basic/flow_control.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ void next_statement(struct basic_ctx* ctx)
240240
void for_statement(struct basic_ctx* ctx)
241241
{
242242
accept_or_return(FOR, ctx);
243-
const char* for_variable = buddy_strdup(ctx->allocator, tokenizer_variable_name(ctx));
243+
size_t var_length;
244+
const char* for_variable = buddy_strdup(ctx->allocator, tokenizer_variable_name(ctx, &var_length));
244245
accept_or_return(VARIABLE, ctx);
245246
accept_or_return(EQUALS, ctx);
246247
if (strchr(for_variable, '#')) {

src/basic/function.c

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,6 @@ uint8_t extract_comma_list(struct ub_proc_fn_def* def, struct basic_ctx* ctx) {
178178
// next item
179179
// set local vars here
180180
// Set ctx to item_begin, call expr(), set ctx back again. Change expr to stop on comma.
181-
//
182-
// XXX We know wether to call expr or str_expr here based upon the type for the fn param
183-
// which we will read when this is implemented. We should probably check the fn exists
184-
// before we even GET here!
185181
char oldval = *ctx->ptr;
186182
char oldct = ctx->current_token;
187183
char* oldptr = (char*)ctx->ptr;

src/basic/graphics.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,8 @@ void flip_statement(struct basic_ctx* ctx)
9696
void loadsprite_statement(struct basic_ctx* ctx)
9797
{
9898
accept_or_return(SPRITELOAD, ctx);
99-
const char* variable = tokenizer_variable_name(ctx);
99+
size_t var_length;
100+
const char* variable = tokenizer_variable_name(ctx, &var_length);
100101
accept_or_return(VARIABLE, ctx);
101102
accept_or_return(COMMA, ctx);
102103
const char* filename = str_expr(ctx);
@@ -171,7 +172,8 @@ void loadsprite_statement(struct basic_ctx* ctx)
171172
void freesprite_statement(struct basic_ctx* ctx)
172173
{
173174
accept_or_return(SPRITEFREE, ctx);
174-
const char* variable = tokenizer_variable_name(ctx);
175+
size_t var_length;
176+
const char* variable = tokenizer_variable_name(ctx, &var_length);
175177
accept_or_return(VARIABLE, ctx);
176178
accept_or_return(NEWLINE, ctx);
177179
free_sprite(ctx, basic_get_int_variable(variable, ctx));
@@ -180,7 +182,8 @@ void freesprite_statement(struct basic_ctx* ctx)
180182
void plot_statement(struct basic_ctx* ctx)
181183
{
182184
accept_or_return(PLOT, ctx);
183-
const char* variable = tokenizer_variable_name(ctx);
185+
size_t var_length;
186+
const char* variable = tokenizer_variable_name(ctx, &var_length);
184187
accept_or_return(VARIABLE, ctx);
185188
accept_or_return(COMMA, ctx);
186189
int64_t x1 = expr(ctx);
@@ -688,7 +691,8 @@ static void plot_sprite_quad(struct basic_ctx* ctx, int64_t sprite_handle, int64
688691

689692
void plotquad_statement(struct basic_ctx* ctx) {
690693
accept_or_return(PLOTQUAD, ctx);
691-
const char* variable = tokenizer_variable_name(ctx);
694+
size_t var_length;
695+
const char* variable = tokenizer_variable_name(ctx, &var_length);
692696
accept_or_return(VARIABLE, ctx);
693697
accept_or_return(COMMA, ctx);
694698
int64_t x0 = expr(ctx);

src/basic/sockets.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,12 @@ void sockread_statement(struct basic_ctx* ctx)
4444

4545
accept_or_return(SOCKREAD, ctx);
4646

47-
int64_t fd = basic_get_numeric_int_variable(tokenizer_variable_name(ctx), ctx);
47+
size_t var_length;
48+
int64_t fd = basic_get_numeric_int_variable(tokenizer_variable_name(ctx, &var_length), ctx);
4849
accept_or_return(VARIABLE, ctx);
4950
accept_or_return(COMMA, ctx);
5051

51-
var = tokenizer_variable_name(ctx);
52+
var = tokenizer_variable_name(ctx, &var_length);
5253
accept_or_return(VARIABLE, ctx);
5354

5455
process_t* proc = proc_cur(logical_cpu_id());
@@ -99,10 +100,11 @@ void connect_statement(struct basic_ctx* ctx)
99100
{
100101
char input[MAX_STRINGLEN];
101102
const char* fd_var = NULL, *ip = NULL;
102-
int64_t port = 0;
103+
int64_t port;
104+
size_t var_length;
103105

104106
accept_or_return(CONNECT, ctx);
105-
fd_var = tokenizer_variable_name(ctx);
107+
fd_var = tokenizer_variable_name(ctx, &var_length);
106108
accept_or_return(VARIABLE, ctx);
107109
accept_or_return(COMMA, ctx);
108110
ip = str_expr(ctx);
@@ -113,7 +115,7 @@ void connect_statement(struct basic_ctx* ctx)
113115

114116
if (rv >= 0) {
115117
*(input + rv) = 0;
116-
switch (fd_var[strlen(fd_var) - 1]) {
118+
switch (fd_var[var_length - 1]) {
117119
case '$':
118120
tokenizer_error_print(ctx, "Can't store socket descriptor in STRING");
119121
break;
@@ -134,9 +136,10 @@ void connect_statement(struct basic_ctx* ctx)
134136
void sockclose_statement(struct basic_ctx* ctx)
135137
{
136138
const char* fd_var = NULL;
139+
size_t var_length;
137140

138141
accept_or_return(SOCKCLOSE, ctx);
139-
fd_var = tokenizer_variable_name(ctx);
142+
fd_var = tokenizer_variable_name(ctx, &var_length);
140143
accept_or_return(VARIABLE, ctx);
141144

142145
int rv = closesocket(basic_get_numeric_int_variable(fd_var, ctx));
@@ -270,7 +273,8 @@ char* basic_dns(struct basic_ctx* ctx) {
270273

271274
void sockwrite_statement(struct basic_ctx* ctx) {
272275
accept_or_return(SOCKWRITE, ctx);
273-
int fd = basic_get_numeric_int_variable(tokenizer_variable_name(ctx), ctx);
276+
size_t var_length;
277+
int fd = basic_get_numeric_int_variable(tokenizer_variable_name(ctx, &var_length), ctx);
274278
accept_or_return(VARIABLE, ctx);
275279
accept_or_return(COMMA, ctx);
276280
const char* out = printable_syntax(ctx);
@@ -424,8 +428,9 @@ static bool check_sockflush_ready(process_t* proc, void* ptr) {
424428

425429
void sockflush_statement(struct basic_ctx* ctx)
426430
{
431+
size_t var_length;
427432
accept_or_return(SOCKFLUSH, ctx);
428-
int64_t fd = basic_get_numeric_int_variable(tokenizer_variable_name(ctx), ctx);
433+
int64_t fd = basic_get_numeric_int_variable(tokenizer_variable_name(ctx, &var_length), ctx);
429434
accept_or_return(VARIABLE, ctx);
430435

431436
process_t* proc = proc_cur(logical_cpu_id());

src/basic/tokenizer.c

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -363,26 +363,27 @@ bool tokenizer_finished(struct basic_ctx* ctx)
363363
return *ctx->ptr == 0 || ctx->current_token == ENDOFINPUT;
364364
}
365365

366-
const char* tokenizer_variable_name(struct basic_ctx* ctx)
366+
const char* tokenizer_variable_name(struct basic_ctx* ctx, size_t* count)
367367
{
368368
char varname[MAX_VARNAME];
369-
int count = 0;
369+
*count = 0;
370370
while (
371371
(
372372
(*ctx->ptr >= 'a' && *ctx->ptr <= 'z') ||
373373
(*ctx->ptr >= 'A' && *ctx->ptr <= 'Z') ||
374-
(count > 0 && *ctx->ptr == '$') ||
375-
(count > 0 && *ctx->ptr == '#') ||
374+
(*count > 0 && *ctx->ptr == '$') ||
375+
(*count > 0 && *ctx->ptr == '#') ||
376376
(*ctx->ptr == '_') ||
377-
(count > 0 && isdigit(*ctx->ptr))
378-
) && count < MAX_VARNAME
377+
(*count > 0 && isdigit(*ctx->ptr))
378+
) && *count < MAX_VARNAME
379379
) {
380-
varname[count++] = *(ctx->ptr++);
380+
varname[(*count)++] = *(ctx->ptr++);
381381
}
382-
varname[count] = 0;
383-
for (int n = 0; n < count - 1; ++n) {
382+
varname[*count] = 0;
383+
for (size_t n = 0; n < *count - 1; ++n) {
384384
if (varname[n] == '$' || varname[n] == '#') {
385385
tokenizer_error_printf(ctx, "Invalid variable name '%s'", varname);
386+
*count = 0;
386387
return "";
387388
}
388389
}

0 commit comments

Comments
 (0)