t->val[t->len] = '\0';
}
+/* escapes a char based on its type
+ * returns \0 if invalid char is passed */
+char l_lsl_escape_char(char c) {
+ switch (c) {
+ case 'a':
+ return '\a';
+ case 'b':
+ return '\b';
+ case 'f':
+ return '\f';
+ case 'n':
+ return '\n';
+ case 'r':
+ return '\r';
+ case 'v':
+ return 'v';
+ case '\\':
+ return '\\';
+ case '\'':
+ return '\'';
+ case '\"':
+ return '\"';
+ case '?':
+ return '\?';
+ /* TODO: allow \xhh and \nnn */
+ default:
+ return '\0';
+ }
+}
+
char tokbuf[L_LSL_TOK_MAX];
struct l_lsl_token l_lsl_next_token(struct l_lsl_vm *v, struct l_lsl_lex *lex) {
char c = 0;
c = l_lsl_lex_advance(v, lex);
while (c && c != string_term) {
- /* TODO: allow escaping */
+ /* escape */
+ if (c == '\\') {
+ c = l_lsl_lex_advance(v, lex);
+ c = l_lsl_escape_char(c);
+ }
l_lsl_lex_write_token(v, lex, &t, c);
c = l_lsl_lex_advance(v, lex);
}
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,
+ ("Unexpected str value. Expected '%s' got '%s'\n", expected->data.str_val,
actual->data.str_val));
return 0;
l_lsl_vm_free(&v);
- T_ASSERT(res != LRTS_NULL, ("Invalid result value\n"))
T_ASSERT(err == expect_err, ("Unexpected error code %d\n", err));
+ if (expect_err != L_LSL_ERR_OK) {
+ return 0;
+ }
+ T_ASSERT(res != LRTS_NULL, ("Invalid result value\n"))
T_ASSERT(res->type == expect_value.type, ("Unexpected return value\n"));
if (assert_val(&expect_value, res) != 0) {
v.data.str_val = "hello world";
T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/strliteral.lsl",
t_lsl_vlue_assert_str);
+
+ /* unterminated str value */
+ v.type = L_LSL_TYPE_STRING;
+ v.data.str_val = "hello world";
+ T_LSL_ASSERT(v, L_LSL_ERR_LEX, "./src/tests/lsl/strliteral-noterm.lsl",
+ t_lsl_vlue_assert_str);
+
+ /* simple str value with escape sequence */
+ v.type = L_LSL_TYPE_STRING;
+ v.data.str_val = "hello\nworld";
+ T_LSL_ASSERT(v, L_LSL_ERR_OK, "./src/tests/lsl/strliteral-esc.lsl",
+ t_lsl_vlue_assert_str);
return 0;
}