diff --git a/include/picrin.h b/include/picrin.h index 5246acee..4aedbb40 100644 --- a/include/picrin.h +++ b/include/picrin.h @@ -164,19 +164,6 @@ bool pic_interned_p(pic_state *, pic_sym); char *pic_strdup(pic_state *, const char *); char *pic_strndup(pic_state *, const char *, size_t); -pic_str *pic_str_new(pic_state *, const char * /* nullable */, size_t); -pic_str *pic_str_new_cstr(pic_state *, const char *); -char pic_str_ref(pic_state *, pic_str *, size_t); -pic_str *pic_strcat(pic_state *, pic_str *, pic_str *); -pic_str *pic_substr(pic_state *, pic_str *, size_t, size_t); - -pic_value pic_format(pic_state *, const char *, ...); -pic_value pic_vformat(pic_state *, const char *, va_list); -pic_value pic_vfformat(pic_state *, XFILE *, const char *, va_list); - -struct pic_vector *pic_vec_new(pic_state *, size_t); -struct pic_vector *pic_vec_new_from_list(pic_state *, pic_value); -void pic_vec_extend_ip(pic_state *, struct pic_vector *, size_t); int pic_parse_file(pic_state *, FILE *, pic_value *); int pic_parse_cstr(pic_state *, const char *, pic_value *); diff --git a/include/picrin/pair.h b/include/picrin/pair.h index 74399277..8f1a1dbb 100644 --- a/include/picrin/pair.h +++ b/include/picrin/pair.h @@ -9,6 +9,15 @@ extern "C" { #endif +struct pic_pair { + PIC_OBJECT_HEADER + pic_value car; + pic_value cdr; +}; + +#define pic_pair_p(v) (pic_type(v) == PIC_TT_PAIR) +#define pic_pair_ptr(o) ((struct pic_pair *)pic_ptr(o)) + pic_value pic_cons(pic_state *, pic_value, pic_value); pic_value pic_car(pic_state *, pic_value); pic_value pic_cdr(pic_state *, pic_value); diff --git a/include/picrin/string.h b/include/picrin/string.h new file mode 100644 index 00000000..14d0caa8 --- /dev/null +++ b/include/picrin/string.h @@ -0,0 +1,36 @@ +/** + * See Copyright Notice in picrin.h + */ + +#ifndef PICRIN_STRING_H__ +#define PICRIN_STRING_H__ + +#if defined(__cplusplus) +extern "C" { +#endif + +struct pic_string { + PIC_OBJECT_HEADER + char *str; + size_t len; +}; + +#define pic_str_p(v) (pic_type(v) == PIC_TT_STRING) +#define pic_str_ptr(o) ((struct pic_string *)pic_ptr(o)) + +pic_str *pic_str_new(pic_state *, const char * /* nullable */, size_t); +pic_str *pic_str_new_cstr(pic_state *, const char *); + +char pic_str_ref(pic_state *, pic_str *, size_t); +pic_str *pic_strcat(pic_state *, pic_str *, pic_str *); +pic_str *pic_substr(pic_state *, pic_str *, size_t, size_t); + +pic_value pic_format(pic_state *, const char *, ...); +pic_value pic_vformat(pic_state *, const char *, va_list); +pic_value pic_vfformat(pic_state *, XFILE *, const char *, va_list); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/include/picrin/value.h b/include/picrin/value.h index 5bda9c06..d5428305 100644 --- a/include/picrin/value.h +++ b/include/picrin/value.h @@ -113,37 +113,25 @@ struct pic_object { PIC_OBJECT_HEADER }; -typedef struct pic_pair { - PIC_OBJECT_HEADER - pic_value car; - pic_value cdr; -} pic_pair; - -typedef struct pic_string { - PIC_OBJECT_HEADER - char *str; - size_t len; -} pic_str; - -typedef struct pic_vector { - PIC_OBJECT_HEADER - pic_value *data; - size_t len; -} pic_vec; +struct pic_pair; +struct pic_string; +struct pic_vector; struct pic_proc; struct pic_port; struct pic_blob; +/* set aliases to basic types */ +typedef struct pic_pair pic_pair; +typedef struct pic_string pic_str; +typedef struct pic_vector pic_vec; + #define pic_float(v) ((v).u.f) #define pic_int(v) ((v).u.i) #define pic_sym(v) ((v).u.sym) #define pic_char(v) ((v).u.c) #define pic_obj_ptr(o) ((struct pic_object *)pic_ptr(o)) -#define pic_pair_ptr(o) ((struct pic_pair *)pic_ptr(o)) -#define pic_str_ptr(o) ((struct pic_string *)pic_ptr(o)) -#define pic_vec_ptr(o) ((struct pic_vector *)pic_ptr(o)) #define pic_nil_p(v) (pic_vtype(v) == PIC_VTYPE_NIL) #define pic_true_p(v) (pic_vtype(v) == PIC_VTYPE_TRUE) @@ -153,9 +141,6 @@ struct pic_blob; #define pic_int_p(v) (pic_vtype(v) == PIC_VTYPE_INT) #define pic_sym_p(v) (pic_vtype(v) == PIC_VTYPE_SYMBOL) #define pic_char_p(v) (pic_vtype(v) == PIC_VTYPE_CHAR) -#define pic_pair_p(v) (pic_type(v) == PIC_TT_PAIR) -#define pic_str_p(v) (pic_type(v) == PIC_TT_STRING) -#define pic_vec_p(v) (pic_type(v) == PIC_TT_VECTOR) #define pic_test(v) (! pic_false_p(v)) diff --git a/include/picrin/vector.h b/include/picrin/vector.h new file mode 100644 index 00000000..80a4cb73 --- /dev/null +++ b/include/picrin/vector.h @@ -0,0 +1,29 @@ +/** + * See Copyright Notice in picrin.h + */ + +#ifndef PICRIN_VECTOR_H__ +#define PICRIN_VECTOR_H__ + +#if defined(__cplusplus) +extern "C" { +#endif + +struct pic_vector { + PIC_OBJECT_HEADER + pic_value *data; + size_t len; +}; + +#define pic_vec_p(v) (pic_type(v) == PIC_TT_VECTOR) +#define pic_vec_ptr(o) ((struct pic_vector *)pic_ptr(o)) + +struct pic_vector *pic_vec_new(pic_state *, size_t); +struct pic_vector *pic_vec_new_from_list(pic_state *, pic_value); +void pic_vec_extend_ip(pic_state *, struct pic_vector *, size_t); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/src/error.c b/src/error.c index de6167dc..8faa359f 100644 --- a/src/error.c +++ b/src/error.c @@ -8,6 +8,7 @@ #include "picrin.h" #include "picrin/pair.h" +#include "picrin/string.h" #include "picrin/error.h" const char * @@ -30,7 +31,7 @@ raise(pic_state *pic, struct pic_error *e) } NORETURN static void -error(pic_state *pic, struct pic_string *msg, pic_value irrs) +error(pic_state *pic, pic_str *msg, pic_value irrs) { struct pic_error *e; diff --git a/src/gc.c b/src/gc.c index 36227a44..c3347cdf 100644 --- a/src/gc.c +++ b/src/gc.c @@ -6,6 +6,9 @@ #include "picrin.h" #include "picrin/gc.h" +#include "picrin/pair.h" +#include "picrin/string.h" +#include "picrin/vector.h" #include "picrin/irep.h" #include "picrin/proc.h" #include "picrin/port.h" diff --git a/src/macro.c b/src/macro.c index 6fe9f596..3b0642ea 100644 --- a/src/macro.c +++ b/src/macro.c @@ -4,6 +4,7 @@ #include "picrin.h" #include "picrin/pair.h" +#include "picrin/string.h" #include "picrin/proc.h" #include "picrin/macro.h" #include "picrin/lib.h" diff --git a/src/parse.y b/src/parse.y index 6072acf1..7374b51b 100644 --- a/src/parse.y +++ b/src/parse.y @@ -8,6 +8,8 @@ #include "picrin.h" #include "picrin/pair.h" +#include "picrin/string.h" +#include "picrin/vector.h" #include "picrin/blob.h" #include "picrin/parse.h" diff --git a/src/port.c b/src/port.c index 719f51d3..0295ff24 100644 --- a/src/port.c +++ b/src/port.c @@ -8,6 +8,7 @@ #include "picrin.h" #include "picrin/proc.h" #include "picrin/port.h" +#include "picrin/string.h" #include "picrin/blob.h" pic_value diff --git a/src/string.c b/src/string.c index a491e4c8..58e3c69c 100644 --- a/src/string.c +++ b/src/string.c @@ -5,6 +5,7 @@ #include #include "picrin.h" +#include "picrin/string.h" #include "picrin/pair.h" #include "picrin/port.h" diff --git a/src/symbol.c b/src/symbol.c index 0012672e..a4159b32 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -7,6 +7,7 @@ #include #include "picrin.h" +#include "picrin/string.h" pic_sym pic_intern_cstr(pic_state *pic, const char *str) diff --git a/src/system.c b/src/system.c index c8d2ac7b..be814089 100644 --- a/src/system.c +++ b/src/system.c @@ -5,6 +5,7 @@ #include #include "picrin.h" +#include "picrin/string.h" #include "picrin/pair.h" static pic_value diff --git a/src/vector.c b/src/vector.c index b9586976..917f0878 100644 --- a/src/vector.c +++ b/src/vector.c @@ -3,6 +3,7 @@ */ #include "picrin.h" +#include "picrin/vector.h" #include "picrin/pair.h" struct pic_vector * diff --git a/src/vm.c b/src/vm.c index 58360f41..2bd8f27e 100644 --- a/src/vm.c +++ b/src/vm.c @@ -9,6 +9,8 @@ #include "picrin.h" #include "picrin/pair.h" +#include "picrin/string.h" +#include "picrin/vector.h" #include "picrin/proc.h" #include "picrin/port.h" #include "picrin/irep.h" diff --git a/src/write.c b/src/write.c index 5f7f08a7..80756369 100644 --- a/src/write.c +++ b/src/write.c @@ -5,6 +5,8 @@ #include "picrin.h" #include "picrin/port.h" #include "picrin/pair.h" +#include "picrin/string.h" +#include "picrin/vector.h" #include "picrin/blob.h" #include "picrin/macro.h"