take care of escaped characters in string
This commit is contained in:
parent
8f4788ca27
commit
ba78a00d5c
|
@ -66,6 +66,7 @@ bool pic_eq_p(pic_state *, pic_value, pic_value);
|
||||||
|
|
||||||
pic_value pic_intern_cstr(pic_state *, const char *);
|
pic_value pic_intern_cstr(pic_state *, const char *);
|
||||||
|
|
||||||
|
pic_value pic_str_new(pic_state *, const char *, size_t);
|
||||||
pic_value pic_str_new_cstr(pic_state *, const char *);
|
pic_value pic_str_new_cstr(pic_state *, const char *);
|
||||||
|
|
||||||
bool pic_parse(pic_state *, const char *, pic_value *);
|
bool pic_parse(pic_state *, const char *, pic_value *);
|
||||||
|
|
19
src/port.c
19
src/port.c
|
@ -7,6 +7,7 @@
|
||||||
#include "picrin/string.h"
|
#include "picrin/string.h"
|
||||||
|
|
||||||
static void write_pair(pic_state *pic, struct pic_pair *pair);
|
static void write_pair(pic_state *pic, struct pic_pair *pair);
|
||||||
|
static void write_str(pic_state *pic, struct pic_string *str);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
write(pic_state *pic, pic_value obj)
|
write(pic_state *pic, pic_value obj)
|
||||||
|
@ -42,7 +43,9 @@ write(pic_state *pic, pic_value obj)
|
||||||
printf("#<port %p>", pic_port_ptr(obj));
|
printf("#<port %p>", pic_port_ptr(obj));
|
||||||
break;
|
break;
|
||||||
case PIC_TT_STRING:
|
case PIC_TT_STRING:
|
||||||
printf("\"%s\"", pic_str_ptr(obj)->str);
|
printf("\"");
|
||||||
|
write_str(pic, pic_str_ptr(obj));
|
||||||
|
printf("\"");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -64,6 +67,20 @@ write_pair(pic_state *pic, struct pic_pair *pair)
|
||||||
write(pic, pair->cdr);
|
write(pic, pair->cdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
write_str(pic_state *pic, struct pic_string *str)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
const char *cstr = str->str;
|
||||||
|
|
||||||
|
for (i = 0; i < str->len; ++i) {
|
||||||
|
if (cstr[i] == '"' || cstr[i] == '\\') {
|
||||||
|
putchar('\\');
|
||||||
|
}
|
||||||
|
putchar(cstr[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
pic_debug(pic_state *pic, pic_value obj)
|
pic_debug(pic_state *pic, pic_value obj)
|
||||||
{
|
{
|
||||||
|
|
19
src/scan.l
19
src/scan.l
|
@ -11,7 +11,7 @@ struct parser_control {
|
||||||
bool incomp;
|
bool incomp;
|
||||||
};
|
};
|
||||||
|
|
||||||
static pic_value escape_string(pic_state *, const char *);
|
static pic_value new_escaped_string(pic_state *, const char *);
|
||||||
|
|
||||||
#define YY_DECL int yylex (struct parser_control *p)
|
#define YY_DECL int yylex (struct parser_control *p)
|
||||||
%}
|
%}
|
||||||
|
@ -47,7 +47,7 @@ string_elem [^\"\\]|"\\\""|"\\\\"
|
||||||
{real} { yylval.datum = pic_float_value(atof(yytext)); return tNUMBER; }
|
{real} { yylval.datum = pic_float_value(atof(yytext)); return tNUMBER; }
|
||||||
{identifier} { yylval.datum = pic_intern_cstr(p->pic, yytext); return tSYMBOL; }
|
{identifier} { yylval.datum = pic_intern_cstr(p->pic, yytext); return tSYMBOL; }
|
||||||
{string} {
|
{string} {
|
||||||
yylval.datum = escape_string(p->pic, yytext);
|
yylval.datum = new_escaped_string(p->pic, yytext);
|
||||||
return tSTRING;
|
return tSTRING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,19 +60,24 @@ yywrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
escape_string(pic_state *pic, const char *str)
|
new_escaped_string(pic_state *pic, const char *str)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
char *new_str;
|
char *new_str;
|
||||||
int i;
|
int i,j;
|
||||||
pic_value v;
|
pic_value v;
|
||||||
|
|
||||||
len = strlen(str);
|
len = strlen(str);
|
||||||
new_str = (char *)pic_alloc(pic, len + 1);
|
new_str = (char *)pic_alloc(pic, len + 1);
|
||||||
for (i = 1; i < len - 1; ++i) {
|
for (j = 0, i = 1; i < len - 1; ++i, ++j) {
|
||||||
new_str[i-1] = str[i];
|
if (str[i] == '\\') {
|
||||||
|
++i;
|
||||||
|
new_str[j] = str[i];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
new_str[j] = str[i];
|
||||||
}
|
}
|
||||||
new_str[i] = '\0';
|
new_str[j] = '\0';
|
||||||
|
|
||||||
v = pic_str_new_cstr(pic, new_str);
|
v = pic_str_new_cstr(pic, new_str);
|
||||||
pic_free(pic, new_str);
|
pic_free(pic, new_str);
|
||||||
|
|
16
src/string.c
16
src/string.c
|
@ -4,15 +4,14 @@
|
||||||
#include "picrin/string.h"
|
#include "picrin/string.h"
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
pic_str_new_cstr(pic_state *pic, const char *cstr)
|
pic_str_new(pic_state *pic, const char *cstr, size_t len)
|
||||||
{
|
{
|
||||||
struct pic_string *str;
|
struct pic_string *str;
|
||||||
size_t len;
|
|
||||||
char *new_str;
|
char *new_str;
|
||||||
|
|
||||||
len = strlen(cstr);
|
|
||||||
new_str = (char *)pic_alloc(pic, len + 1);
|
new_str = (char *)pic_alloc(pic, len + 1);
|
||||||
strncpy(new_str, cstr, len + 1);
|
strncpy(new_str, cstr, len);
|
||||||
|
new_str[len] = '\0';
|
||||||
|
|
||||||
str = (struct pic_string *)pic_obj_alloc(pic, sizeof(struct pic_string), PIC_TT_STRING);
|
str = (struct pic_string *)pic_obj_alloc(pic, sizeof(struct pic_string), PIC_TT_STRING);
|
||||||
str->len = len;
|
str->len = len;
|
||||||
|
@ -20,3 +19,12 @@ pic_str_new_cstr(pic_state *pic, const char *cstr)
|
||||||
|
|
||||||
return pic_obj_value(str);
|
return pic_obj_value(str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pic_value
|
||||||
|
pic_str_new_cstr(pic_state *pic, const char *cstr)
|
||||||
|
{
|
||||||
|
size_t len;
|
||||||
|
|
||||||
|
len = strlen(cstr);
|
||||||
|
return pic_str_new(pic, cstr, len);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue