diff --git a/include/picrin/port.h b/include/picrin/port.h index 6ae638f2..914680f3 100644 --- a/include/picrin/port.h +++ b/include/picrin/port.h @@ -1,8 +1,6 @@ #ifndef PORT_H__ #define PORT_H__ -#include "picrin.h" - enum pic_port_flag { PIC_PORT_IN, PIC_PORT_OUT, diff --git a/include/picrin/string.h b/include/picrin/string.h new file mode 100644 index 00000000..ccef6efb --- /dev/null +++ b/include/picrin/string.h @@ -0,0 +1,14 @@ +#ifndef STRING_H__ +#define STRING_H__ + +struct pic_string { + PIC_OBJECT_HEADER + const char *str; + size_t len; +}; + +#define pic_str_ptr(v) ((struct pic_string *)v.u.data) + +pic_value pic_str_new_cstr(pic_state *, const char *); + +#endif diff --git a/include/picrin/value.h b/include/picrin/value.h index c6ade674..212466e0 100644 --- a/include/picrin/value.h +++ b/include/picrin/value.h @@ -28,7 +28,8 @@ enum pic_tt { PIC_TT_PAIR, PIC_TT_SYMBOL, PIC_TT_PROC, - PIC_TT_PORT + PIC_TT_PORT, + PIC_TT_STRING }; #define PIC_OBJECT_HEADER \ diff --git a/src/gc.c b/src/gc.c index 4884c3b3..b1530f62 100644 --- a/src/gc.c +++ b/src/gc.c @@ -4,6 +4,7 @@ #include "picrin/gc.h" #include "picrin/irep.h" #include "picrin/proc.h" +#include "picrin/string.h" #if GC_DEBUG # include @@ -148,7 +149,15 @@ gc_mark_object(pic_state *pic, struct pic_object *obj) case PIC_TT_PROC: { break; } - default: + case PIC_TT_PORT: { + break; + } + case PIC_TT_STRING: { + } + case PIC_TT_NIL: + case PIC_TT_BOOL: + case PIC_TT_FLOAT: + case PIC_TT_UNDEF: pic_abort(pic, "logic flaw"); } } @@ -233,16 +242,16 @@ gc_finalize_object(pic_state *pic, struct pic_object *obj) break; } case PIC_TT_PROC: { - struct pic_proc *proc; - - proc = (struct pic_proc *)obj; - - /* free irep */ - pic_free(pic, proc->u.irep->code); - pic_free(pic, proc->u.irep); break; } - default: + case PIC_TT_STRING: { + pic_free(pic, (void*)((struct pic_string *)obj)->str); + break; + } + case PIC_TT_NIL: + case PIC_TT_BOOL: + case PIC_TT_FLOAT: + case PIC_TT_UNDEF: pic_abort(pic, "logic flaw"); } } diff --git a/src/port.c b/src/port.c index bf502534..32dfd8fc 100644 --- a/src/port.c +++ b/src/port.c @@ -4,6 +4,7 @@ #include "picrin.h" #include "picrin/proc.h" #include "picrin/port.h" +#include "picrin/string.h" static void write_pair(pic_state *pic, struct pic_pair *pair); @@ -40,6 +41,9 @@ write(pic_state *pic, pic_value obj) case PIC_TT_PORT: printf("#", pic_port_ptr(obj)); break; + case PIC_TT_STRING: + printf("\"%s\"", pic_str_ptr(obj)->str); + break; } } diff --git a/src/string.c b/src/string.c new file mode 100644 index 00000000..14b6850c --- /dev/null +++ b/src/string.c @@ -0,0 +1,22 @@ +#include + +#include "picrin.h" +#include "picrin/string.h" + +pic_value +pic_str_new_cstr(pic_state *pic, const char *cstr) +{ + struct pic_string *str; + size_t len; + char *new_str; + + len = strlen(cstr); + new_str = (char *)pic_alloc(pic, len + 1); + strncpy(new_str, cstr, len + 1); + + str = (struct pic_string *)pic_obj_alloc(pic, sizeof(struct pic_string), PIC_TT_STRING); + str->len = len; + str->str = new_str; + + return pic_obj_value(str); +}