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
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki