} else if (c == '\'' || c == '\"') {
/* string literal */
/* consume initial term */
- c = l_lsl_lex_advance(v, lex);
+ t.type = L_LSL_TOK_STRING;
string_term = c;
+ c = l_lsl_lex_advance(v, lex);
+
while (c && c != string_term) {
+ /* TODO: allow escaping */
+ l_lsl_lex_write_token(v, lex, &t, c);
c = l_lsl_lex_advance(v, lex);
}
+
+ if (c != string_term) {
+ l_lsl_lex_err(v, lex, L_LSL_ERR_LEX, "unterminated string\n");
+ goto fail;
+ }
+
+ /* consume final term */
+ l_lsl_lex_advance(v, lex);
} else {
l_lsl_lex_err(v, lex, L_LSL_ERR_LEX, "unknown char: %c\n", c);
t.type = L_LSL_TOK_NONE;
l_lsl_lex_err(v, lex, L_LSL_ERR_LEX, "unexpected end of token\n", c);
t.type = L_LSL_TOK_NONE;
}
-
+
+ return t;
+fail:
+ t.type = L_LSL_TOK_NONE;
return t;
}
lrts_assert(v);
lrts_assert(val);
+ if (val->type == L_LSL_TYPE_STRING) {
+ v->free(val->data.str_val);
+ }
+
v->free(val);
}
val->type = L_LSL_TYPE_INT;
val->data.int_val = u_strtol(tok.val, LRTS_NULL, tok.base);
break;
+ case L_LSL_TOK_STRING:
+ val = l_lsl_value_alloc(v);
+ val->type = L_LSL_TYPE_STRING;
+ val->data.str_val = v->malloc(tok.len+1);
+ u_memcpy(val->data.str_val, tok.val, tok.len+1);
+ break;
default:
v->err = L_LSL_ERR_LEX;
}
return 0;
}
+int t_lsl_vlue_assert_str(struct l_lsl_value *expected,
+ struct l_lsl_value *actual) {
+ T_ASSERT(u_strncmp(expected->data.str_val, actual->data.str_val, 256) == 0,
+ ("Unexpected int value. Expected %s got %s\n", expected->data.str_val,
+ actual->data.str_val));
+
+ return 0;
+}
+
#define T_LSL_ASSERT(expected_value, expected_err, src_file, value_assert) \
if (t_lsl_assert(expected_value, expected_err, src_file, value_assert)) { \
return 1; \
l_lsl_vm_free(&v);
- T_ASSERT(res != LRTS_NULL, ("Invalid result value"))
+ T_ASSERT(res != LRTS_NULL, ("Invalid result value\n"))
T_ASSERT(err == expect_err, ("Unexpected error code %d\n", err));
T_ASSERT(res->type == expect_value.type, ("Unexpected return value\n"));
v.data.int_val = 0123;
T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/octliteral.lsl",
t_lsl_vlue_assert_int);
+
+ /* simple str value */
+ v.type = L_LSL_TYPE_STRING;
+ v.data.str_val = "hello world";
+ T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/strliteral.lsl",
+ t_lsl_vlue_assert_str);
return 0;
}