From 8dd423cdbc9c885d7fe86d4aa4c4195b87d27b39 Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Sun, 21 Feb 2016 01:13:16 +0900 Subject: [PATCH] add include/picrin/private dir --- contrib/10.callcc/callcc.c | 4 +- extlib/benz/blob.c | 2 +- extlib/benz/bool.c | 2 +- extlib/benz/cont.c | 4 +- extlib/benz/data.c | 2 +- extlib/benz/debug.c | 4 +- extlib/benz/dict.c | 2 +- extlib/benz/error.c | 4 +- extlib/benz/eval.c | 6 +- extlib/benz/file.c | 2 +- extlib/benz/gc.c | 4 +- extlib/benz/include/picrin/compat.h | 386 ------------------ .../benz/include/picrin/{ => private}/file.h | 0 extlib/benz/include/picrin/{ => private}/gc.h | 0 .../benz/include/picrin/{ => private}/irep.h | 0 .../benz/include/picrin/{ => private}/khash.h | 0 .../include/picrin/{ => private}/object.h | 2 +- .../include/picrin/{ => private}/opcode.h | 0 .../benz/include/picrin/{ => private}/read.h | 0 .../benz/include/picrin/{ => private}/state.h | 10 +- extlib/benz/include/picrin/setup.h | 372 ++++++++++++++++- extlib/benz/lib.c | 4 +- extlib/benz/macro.c | 4 +- extlib/benz/pair.c | 2 +- extlib/benz/port.c | 4 +- extlib/benz/proc.c | 6 +- extlib/benz/read.c | 4 +- extlib/benz/record.c | 2 +- extlib/benz/state.c | 4 +- extlib/benz/string.c | 2 +- extlib/benz/symbol.c | 4 +- extlib/benz/value.c | 2 +- extlib/benz/var.c | 4 +- extlib/benz/vector.c | 2 +- extlib/benz/weak.c | 2 +- extlib/benz/write.c | 4 +- 36 files changed, 420 insertions(+), 436 deletions(-) delete mode 100644 extlib/benz/include/picrin/compat.h rename extlib/benz/include/picrin/{ => private}/file.h (100%) rename extlib/benz/include/picrin/{ => private}/gc.h (100%) rename extlib/benz/include/picrin/{ => private}/irep.h (100%) rename extlib/benz/include/picrin/{ => private}/khash.h (100%) rename extlib/benz/include/picrin/{ => private}/object.h (99%) rename extlib/benz/include/picrin/{ => private}/opcode.h (100%) rename extlib/benz/include/picrin/{ => private}/read.h (100%) rename extlib/benz/include/picrin/{ => private}/state.h (92%) diff --git a/contrib/10.callcc/callcc.c b/contrib/10.callcc/callcc.c index cf1c310b..3f73cdd5 100644 --- a/contrib/10.callcc/callcc.c +++ b/contrib/10.callcc/callcc.c @@ -1,6 +1,6 @@ #include "picrin.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" struct pic_fullcont { jmp_buf jmp; diff --git a/extlib/benz/blob.c b/extlib/benz/blob.c index f1367b04..04befd71 100644 --- a/extlib/benz/blob.c +++ b/extlib/benz/blob.c @@ -4,7 +4,7 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" +#include "picrin/private/object.h" pic_value pic_blob_value(pic_state *pic, const unsigned char *buf, int len) diff --git a/extlib/benz/bool.c b/extlib/benz/bool.c index f01e65ac..7c6b2a54 100644 --- a/extlib/benz/bool.c +++ b/extlib/benz/bool.c @@ -3,7 +3,7 @@ */ #include "picrin.h" -#include "picrin/object.h" +#include "picrin/private/object.h" #if PIC_NAN_BOXING diff --git a/extlib/benz/cont.c b/extlib/benz/cont.c index 21ffde89..a3d9f223 100644 --- a/extlib/benz/cont.c +++ b/extlib/benz/cont.c @@ -3,8 +3,8 @@ */ #include "picrin.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" struct pic_cont { PIC_JMPBUF *jmp; diff --git a/extlib/benz/data.c b/extlib/benz/data.c index a1a84dfd..23e0baa5 100644 --- a/extlib/benz/data.c +++ b/extlib/benz/data.c @@ -1,5 +1,5 @@ #include "picrin.h" -#include "picrin/object.h" +#include "picrin/private/object.h" bool pic_data_p(pic_state *pic, pic_value obj, const pic_data_type *type) diff --git a/extlib/benz/debug.c b/extlib/benz/debug.c index db0ef8b2..225433c4 100644 --- a/extlib/benz/debug.c +++ b/extlib/benz/debug.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" pic_value pic_get_backtrace(pic_state *pic) diff --git a/extlib/benz/dict.c b/extlib/benz/dict.c index b8510034..2d468c09 100644 --- a/extlib/benz/dict.c +++ b/extlib/benz/dict.c @@ -4,7 +4,7 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" +#include "picrin/private/object.h" KHASH_DEFINE(dict, pic_sym *, pic_value, kh_ptr_hash_func, kh_ptr_hash_equal) diff --git a/extlib/benz/error.c b/extlib/benz/error.c index 541744ea..744b7dab 100644 --- a/extlib/benz/error.c +++ b/extlib/benz/error.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" void pic_panic(pic_state PIC_UNUSED(*pic), const char *msg) diff --git a/extlib/benz/eval.c b/extlib/benz/eval.c index 0b7976c2..c0aa5548 100644 --- a/extlib/benz/eval.c +++ b/extlib/benz/eval.c @@ -4,9 +4,9 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/opcode.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/opcode.h" +#include "picrin/private/state.h" static pic_value optimize_beta(pic_state *pic, pic_value expr) diff --git a/extlib/benz/file.c b/extlib/benz/file.c index bdb2e840..0fb6fc83 100644 --- a/extlib/benz/file.c +++ b/extlib/benz/file.c @@ -3,7 +3,7 @@ */ #include "picrin.h" -#include "picrin/state.h" +#include "picrin/private/state.h" #ifndef EOF # define EOF (-1) diff --git a/extlib/benz/gc.c b/extlib/benz/gc.c index a7fe6338..348f2ee9 100644 --- a/extlib/benz/gc.c +++ b/extlib/benz/gc.c @@ -3,8 +3,8 @@ */ #include "picrin.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" enum { WHITE = 0, diff --git a/extlib/benz/include/picrin/compat.h b/extlib/benz/include/picrin/compat.h deleted file mode 100644 index e367a6ce..00000000 --- a/extlib/benz/include/picrin/compat.h +++ /dev/null @@ -1,386 +0,0 @@ -/** - * See Copyright Notice in picrin.h - */ - -#ifndef PICRIN_COMPAT_H -#define PICRIN_COMPAT_H - -#if defined(__cplusplus) -extern "C" { -#endif - -#if __STDC_VERSION__ >= 199901L -# include -#else -# define bool char -# define true 1 -# define false 0 -#endif - -#if __STDC_VERSION__ >= 199901L -# include -#elif ! defined(offsetof) -# define offsetof(s,m) ((size_t)&(((s *)NULL)->m)) -#endif - -#if __STDC_VERSION__ >= 199901L -# include -#else -# if INT_MAX > 2147483640L /* borrowed from luaconf.h */ -typedef int int32_t; -typedef unsigned int uint32_t; -# else -typedef long int32_t; -typedef unsigned long uint32_t; -# endif -#endif - -#if __STDC_VERSION__ >= 201112L -# include -# define PIC_NORETURN noreturn -#elif __GNUC__ || __clang__ -# define PIC_NORETURN __attribute__((noreturn)) -#else -# define PIC_NORETURN -#endif - -#if __STDC_VERSION__ >= 199901L -# define PIC_INLINE static inline -#elif __GNUC__ || __clang__ -# define PIC_INLINE static __inline__ -#else -# define PIC_INLINE static -#endif - -#define PIC_FALLTHROUGH ((void)0) - -#if __GNUC__ || __clang__ -# define PIC_UNUSED(v) __attribute__((unused)) v -#else -# define PIC_UNUSED(v) v -#endif - -#define PIC_GENSYM2_(x,y) PIC_G##x##_##y##_ -#define PIC_GENSYM1_(x,y) PIC_GENSYM2_(x,y) -#if defined(__COUNTER__) -# define PIC_GENSYM(x) PIC_GENSYM1_(__COUNTER__,x) -#else -# define PIC_GENSYM(x) PIC_GENSYM1_(__LINE__,x) -#endif - -#if __GNUC__ -# define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) -#endif -#if GCC_VERSION >= 40500 || __clang__ -# define PIC_UNREACHABLE() (__builtin_unreachable()) -#else -# define PIC_UNREACHABLE() (assert(false)) -#endif -#if __GNUC__ -# undef GCC_VERSION -#endif - -#define PIC_SWAP(type,a,b) \ - PIC_SWAP_HELPER_(type, PIC_GENSYM(tmp), a, b) -#define PIC_SWAP_HELPER_(type,tmp,a,b) \ - do { \ - type tmp = (a); \ - (a) = (b); \ - (b) = tmp; \ - } while (0) - - -#if PIC_ENABLE_LIBC - -#include -#include -#include -#include - -#else - -# define assert(v) (void)0 - -PIC_INLINE int -isspace(int c) -{ - return c == ' ' || c == '\t' || c == '\r' || c == '\v' || c == '\f' || c == '\n'; -} - -PIC_INLINE int -tolower(int c) -{ - return ('A' <= c && c <= 'Z') ? c - 'A' + 'a' : c; -} - -PIC_INLINE int -isdigit(int c) -{ - return '0' <= c && c <= '9'; -} - -PIC_INLINE char * -strchr(const char *s, int c) -{ - do { - if (*s == c) - return (char *)s; - } while (*s++ != '\0'); - return NULL; -} - -PIC_INLINE size_t -strlen(const char *s) -{ - size_t l = 0; - - while (*s++) { - l++; - } - return l; -} - -PIC_INLINE int -strcmp(const char *s1, const char *s2) -{ - while (*s1 && *s1 == *s2) { - s1++; - s2++; - } - return (unsigned)*s1 - (unsigned)*s2; -} - -PIC_INLINE long -strtol(const char *nptr, char **endptr, int base) -{ - long l = 0; - char c; - int n; - - while (1) { - c = *nptr; - if ('0' <= c && c <= '9') - n = c - '0'; - else if ('a' <= c && c <= 'z') - n = c - 'a' + 10; - else if ('A' <= c && c <= 'Z') - n = c - 'A' + 10; - else - goto exit; - - if (base <= n) - goto exit; - - l = l * base + n; - nptr++; - } - exit: - if (endptr) - *endptr = (char *)nptr; - return l; -} - -PIC_INLINE void * -memset(void *s, int n, size_t c) -{ - char *p = s; - - while (c-- > 0) { - *p++ = n; - } - return s; -} - -PIC_INLINE void * -memcpy(void *dst, const void *src, size_t n) -{ - const char *s = src; - char *d = dst; - - while (n-- > 0) { - *d++ = *s++; - } - return d; -} - -PIC_INLINE void * -memmove(void *dst, const void *src, size_t n) -{ - const char *s = src; - char *d = dst; - - if (d <= s || d >= s + n) { - memcpy(dst, src, n); - } else { - s += n; - d += n; - while (n-- > 0) { - *--d = *--s; - } - } - return d; -} - -PIC_INLINE int -memcmp(const void *b1, const void *b2, size_t n) -{ - const char *s1 = b1, *s2 = b2; - - while (*s1 == *s2 && n-- > 0) { - s1++; - s2++; - } - return (unsigned)*s1 - (unsigned)*s2; -} - -PIC_INLINE char * -strcpy(char *dst, const char *src) -{ - char *d = dst; - - while ((*dst++ = *src++) != 0); - - return d; -} - -PIC_INLINE double -atof(const char *nptr) -{ - int c; - double f, g, h; - int exp, s, i, e; - unsigned u; - - /* note that picrin_read always assures that *nptr is a digit, never a '+' or '-' */ - /* in other words, the result of atof will always be positive */ - - /* mantissa */ - /* pre '.' */ - u = *nptr++ - '0'; - while (isdigit(c = *nptr)) { - u = u * 10 + (*nptr++ - '0'); - } - if (c == '.') { - nptr++; - /* after '.' */ - g = 0, e = 0; - while (isdigit(c = *nptr)) { - g = g * 10 + (*nptr++ - '0'); - e++; - } - h = 1.0; - while (e-- > 0) { - h /= 10; - } - f = u + g * h; - } - else { - f = u; - } - /* suffix, i.e., exponent */ - s = 0; - exp = 0; - c = *nptr; - - if (c == 'e' && c == 'E') { - nptr++; - switch ((c = *nptr++)) { - case '-': - s = 1; - case '+': - c = *nptr++; - default: - exp = c - '0'; - while (isdigit(c = *nptr)) { - exp = exp * 10 + (*nptr++ - '0'); - } - } - } - e = 10; - for (i = 0; exp; ++i) { - if ((exp & 1) != 0) { - f = s ? f / e : (f * e); - } - e *= e; - exp >>= 1; - } - return f; -} - -#endif - -#if PIC_ENABLE_STDIO -# include - -PIC_INLINE void -pic_dtoa(double dval, char *buf) -{ - sprintf(buf, "%g", dval); -} - -#else - -PIC_INLINE void -pic_dtoa(double dval, char *buf) -{ -# define fabs(x) ((x) >= 0 ? (x) : -(x)) - long lval, tlval; - int ival; - int scnt, ecnt, cnt = 0; - if (dval < 0) { - dval = -dval; - buf[cnt++] = '-'; - } - lval = tlval = (long)dval; - scnt = cnt; - do { - buf[cnt++] = '0' + (tlval % 10); - } while ((tlval /= 10) != 0); - ecnt = cnt; - while (scnt < ecnt) { - char c = buf[scnt]; - buf[scnt++] = buf[--ecnt]; - buf[ecnt] = c; - } - buf[cnt++] = '.'; - dval -= lval; - if ((ival = fabs(dval) * 1e4 + 0.5) == 0) { - buf[cnt++] = '0'; - buf[cnt++] = '0'; - buf[cnt++] = '0'; - buf[cnt++] = '0'; - } else { - if (ival < 1000) buf[cnt++] = '0'; - if (ival < 100) buf[cnt++] = '0'; - if (ival < 10) buf[cnt++] = '0'; - scnt = cnt; - do { - buf[cnt++] = '0' + (ival % 10); - } while ((ival /= 10) != 0); - ecnt = cnt; - while (scnt < ecnt) { - char c = buf[scnt]; - buf[scnt++] = buf[--ecnt]; - buf[ecnt] = c; - } - } - buf[cnt] = 0; -} - -#endif - -#ifndef PIC_DOUBLE_TO_CSTRING -#define PIC_DOUBLE_TO_CSTRING pic_dtoa -#endif -void PIC_DOUBLE_TO_CSTRING(double, char *); - -#ifndef PIC_CSTRING_TO_DOUBLE -#define PIC_CSTRING_TO_DOUBLE atof -#endif -double PIC_CSTRING_TO_DOUBLE(const char *); - -#if defined(__cplusplus) -} -#endif - -#endif diff --git a/extlib/benz/include/picrin/file.h b/extlib/benz/include/picrin/private/file.h similarity index 100% rename from extlib/benz/include/picrin/file.h rename to extlib/benz/include/picrin/private/file.h diff --git a/extlib/benz/include/picrin/gc.h b/extlib/benz/include/picrin/private/gc.h similarity index 100% rename from extlib/benz/include/picrin/gc.h rename to extlib/benz/include/picrin/private/gc.h diff --git a/extlib/benz/include/picrin/irep.h b/extlib/benz/include/picrin/private/irep.h similarity index 100% rename from extlib/benz/include/picrin/irep.h rename to extlib/benz/include/picrin/private/irep.h diff --git a/extlib/benz/include/picrin/khash.h b/extlib/benz/include/picrin/private/khash.h similarity index 100% rename from extlib/benz/include/picrin/khash.h rename to extlib/benz/include/picrin/private/khash.h diff --git a/extlib/benz/include/picrin/object.h b/extlib/benz/include/picrin/private/object.h similarity index 99% rename from extlib/benz/include/picrin/object.h rename to extlib/benz/include/picrin/private/object.h index 761d13f9..b3cc4b4a 100644 --- a/extlib/benz/include/picrin/object.h +++ b/extlib/benz/include/picrin/private/object.h @@ -9,7 +9,7 @@ extern "C" { #endif -#include "picrin/khash.h" +#include "picrin/private/khash.h" typedef struct pic_identifier pic_id; typedef pic_id pic_sym; diff --git a/extlib/benz/include/picrin/opcode.h b/extlib/benz/include/picrin/private/opcode.h similarity index 100% rename from extlib/benz/include/picrin/opcode.h rename to extlib/benz/include/picrin/private/opcode.h diff --git a/extlib/benz/include/picrin/read.h b/extlib/benz/include/picrin/private/read.h similarity index 100% rename from extlib/benz/include/picrin/read.h rename to extlib/benz/include/picrin/private/read.h diff --git a/extlib/benz/include/picrin/state.h b/extlib/benz/include/picrin/private/state.h similarity index 92% rename from extlib/benz/include/picrin/state.h rename to extlib/benz/include/picrin/private/state.h index eb224086..0c3e1970 100644 --- a/extlib/benz/include/picrin/state.h +++ b/extlib/benz/include/picrin/private/state.h @@ -9,12 +9,12 @@ extern "C" { #endif -#include "picrin/khash.h" -#include "picrin/file.h" +#include "picrin/private/khash.h" +#include "picrin/private/file.h" -#include "picrin/irep.h" -#include "picrin/read.h" -#include "picrin/gc.h" +#include "picrin/private/irep.h" +#include "picrin/private/read.h" +#include "picrin/private/gc.h" struct pic_lib { struct pic_string *name; diff --git a/extlib/benz/include/picrin/setup.h b/extlib/benz/include/picrin/setup.h index 2fa429a7..901daf1b 100644 --- a/extlib/benz/include/picrin/setup.h +++ b/extlib/benz/include/picrin/setup.h @@ -91,4 +91,374 @@ # define GC_DEBUG_DETAIL 0 #endif -#include "picrin/compat.h" +/* check compatibility */ + +#if __STDC_VERSION__ >= 199901L +# include +#else +# define bool char +# define true 1 +# define false 0 +#endif + +#if __STDC_VERSION__ >= 199901L +# include +#elif ! defined(offsetof) +# define offsetof(s,m) ((size_t)&(((s *)NULL)->m)) +#endif + +#if __STDC_VERSION__ >= 199901L +# include +#else +# if INT_MAX > 2147483640L /* borrowed from luaconf.h */ +typedef int int32_t; +typedef unsigned int uint32_t; +# else +typedef long int32_t; +typedef unsigned long uint32_t; +# endif +#endif + +#if __STDC_VERSION__ >= 201112L +# include +# define PIC_NORETURN noreturn +#elif __GNUC__ || __clang__ +# define PIC_NORETURN __attribute__((noreturn)) +#else +# define PIC_NORETURN +#endif + +#if __STDC_VERSION__ >= 199901L +# define PIC_INLINE static inline +#elif __GNUC__ || __clang__ +# define PIC_INLINE static __inline__ +#else +# define PIC_INLINE static +#endif + +#define PIC_FALLTHROUGH ((void)0) + +#if __GNUC__ || __clang__ +# define PIC_UNUSED(v) __attribute__((unused)) v +#else +# define PIC_UNUSED(v) v +#endif + +#define PIC_GENSYM2_(x,y) PIC_G##x##_##y##_ +#define PIC_GENSYM1_(x,y) PIC_GENSYM2_(x,y) +#if defined(__COUNTER__) +# define PIC_GENSYM(x) PIC_GENSYM1_(__COUNTER__,x) +#else +# define PIC_GENSYM(x) PIC_GENSYM1_(__LINE__,x) +#endif + +#if __GNUC__ +# define GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) +#endif +#if GCC_VERSION >= 40500 || __clang__ +# define PIC_UNREACHABLE() (__builtin_unreachable()) +#else +# define PIC_UNREACHABLE() (assert(false)) +#endif +#if __GNUC__ +# undef GCC_VERSION +#endif + +#define PIC_SWAP(type,a,b) \ + PIC_SWAP_HELPER_(type, PIC_GENSYM(tmp), a, b) +#define PIC_SWAP_HELPER_(type,tmp,a,b) \ + do { \ + type tmp = (a); \ + (a) = (b); \ + (b) = tmp; \ + } while (0) + + +#if PIC_ENABLE_LIBC + +#include +#include +#include +#include + +#else + +# define assert(v) (void)0 + +PIC_INLINE int +isspace(int c) +{ + return c == ' ' || c == '\t' || c == '\r' || c == '\v' || c == '\f' || c == '\n'; +} + +PIC_INLINE int +tolower(int c) +{ + return ('A' <= c && c <= 'Z') ? c - 'A' + 'a' : c; +} + +PIC_INLINE int +isdigit(int c) +{ + return '0' <= c && c <= '9'; +} + +PIC_INLINE char * +strchr(const char *s, int c) +{ + do { + if (*s == c) + return (char *)s; + } while (*s++ != '\0'); + return NULL; +} + +PIC_INLINE size_t +strlen(const char *s) +{ + size_t l = 0; + + while (*s++) { + l++; + } + return l; +} + +PIC_INLINE int +strcmp(const char *s1, const char *s2) +{ + while (*s1 && *s1 == *s2) { + s1++; + s2++; + } + return (unsigned)*s1 - (unsigned)*s2; +} + +PIC_INLINE long +strtol(const char *nptr, char **endptr, int base) +{ + long l = 0; + char c; + int n; + + while (1) { + c = *nptr; + if ('0' <= c && c <= '9') + n = c - '0'; + else if ('a' <= c && c <= 'z') + n = c - 'a' + 10; + else if ('A' <= c && c <= 'Z') + n = c - 'A' + 10; + else + goto exit; + + if (base <= n) + goto exit; + + l = l * base + n; + nptr++; + } + exit: + if (endptr) + *endptr = (char *)nptr; + return l; +} + +PIC_INLINE void * +memset(void *s, int n, size_t c) +{ + char *p = s; + + while (c-- > 0) { + *p++ = n; + } + return s; +} + +PIC_INLINE void * +memcpy(void *dst, const void *src, size_t n) +{ + const char *s = src; + char *d = dst; + + while (n-- > 0) { + *d++ = *s++; + } + return d; +} + +PIC_INLINE void * +memmove(void *dst, const void *src, size_t n) +{ + const char *s = src; + char *d = dst; + + if (d <= s || d >= s + n) { + memcpy(dst, src, n); + } else { + s += n; + d += n; + while (n-- > 0) { + *--d = *--s; + } + } + return d; +} + +PIC_INLINE int +memcmp(const void *b1, const void *b2, size_t n) +{ + const char *s1 = b1, *s2 = b2; + + while (*s1 == *s2 && n-- > 0) { + s1++; + s2++; + } + return (unsigned)*s1 - (unsigned)*s2; +} + +PIC_INLINE char * +strcpy(char *dst, const char *src) +{ + char *d = dst; + + while ((*dst++ = *src++) != 0); + + return d; +} + +PIC_INLINE double +atof(const char *nptr) +{ + int c; + double f, g, h; + int exp, s, i, e; + unsigned u; + + /* note that picrin_read always assures that *nptr is a digit, never a '+' or '-' */ + /* in other words, the result of atof will always be positive */ + + /* mantissa */ + /* pre '.' */ + u = *nptr++ - '0'; + while (isdigit(c = *nptr)) { + u = u * 10 + (*nptr++ - '0'); + } + if (c == '.') { + nptr++; + /* after '.' */ + g = 0, e = 0; + while (isdigit(c = *nptr)) { + g = g * 10 + (*nptr++ - '0'); + e++; + } + h = 1.0; + while (e-- > 0) { + h /= 10; + } + f = u + g * h; + } + else { + f = u; + } + /* suffix, i.e., exponent */ + s = 0; + exp = 0; + c = *nptr; + + if (c == 'e' && c == 'E') { + nptr++; + switch ((c = *nptr++)) { + case '-': + s = 1; + case '+': + c = *nptr++; + default: + exp = c - '0'; + while (isdigit(c = *nptr)) { + exp = exp * 10 + (*nptr++ - '0'); + } + } + } + e = 10; + for (i = 0; exp; ++i) { + if ((exp & 1) != 0) { + f = s ? f / e : (f * e); + } + e *= e; + exp >>= 1; + } + return f; +} + +#endif + +#if PIC_ENABLE_STDIO +# include + +PIC_INLINE void +pic_dtoa(double dval, char *buf) +{ + sprintf(buf, "%g", dval); +} + +#else + +PIC_INLINE void +pic_dtoa(double dval, char *buf) +{ +# define fabs(x) ((x) >= 0 ? (x) : -(x)) + long lval, tlval; + int ival; + int scnt, ecnt, cnt = 0; + if (dval < 0) { + dval = -dval; + buf[cnt++] = '-'; + } + lval = tlval = (long)dval; + scnt = cnt; + do { + buf[cnt++] = '0' + (tlval % 10); + } while ((tlval /= 10) != 0); + ecnt = cnt; + while (scnt < ecnt) { + char c = buf[scnt]; + buf[scnt++] = buf[--ecnt]; + buf[ecnt] = c; + } + buf[cnt++] = '.'; + dval -= lval; + if ((ival = fabs(dval) * 1e4 + 0.5) == 0) { + buf[cnt++] = '0'; + buf[cnt++] = '0'; + buf[cnt++] = '0'; + buf[cnt++] = '0'; + } else { + if (ival < 1000) buf[cnt++] = '0'; + if (ival < 100) buf[cnt++] = '0'; + if (ival < 10) buf[cnt++] = '0'; + scnt = cnt; + do { + buf[cnt++] = '0' + (ival % 10); + } while ((ival /= 10) != 0); + ecnt = cnt; + while (scnt < ecnt) { + char c = buf[scnt]; + buf[scnt++] = buf[--ecnt]; + buf[ecnt] = c; + } + } + buf[cnt] = 0; +} + +#endif + +#ifndef PIC_DOUBLE_TO_CSTRING +#define PIC_DOUBLE_TO_CSTRING pic_dtoa +#endif +void PIC_DOUBLE_TO_CSTRING(double, char *); + +#ifndef PIC_CSTRING_TO_DOUBLE +#define PIC_CSTRING_TO_DOUBLE atof +#endif +double PIC_CSTRING_TO_DOUBLE(const char *); diff --git a/extlib/benz/lib.c b/extlib/benz/lib.c index 7bcfbe50..f44505c9 100644 --- a/extlib/benz/lib.c +++ b/extlib/benz/lib.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" KHASH_DEFINE(ltable, const char *, struct pic_lib, kh_str_hash_func, kh_str_cmp_func) diff --git a/extlib/benz/macro.c b/extlib/benz/macro.c index 58f87f98..8a176081 100644 --- a/extlib/benz/macro.c +++ b/extlib/benz/macro.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" KHASH_DEFINE(env, pic_id *, pic_sym *, kh_ptr_hash_func, kh_ptr_hash_equal) diff --git a/extlib/benz/pair.c b/extlib/benz/pair.c index 9a418489..4fcfab40 100644 --- a/extlib/benz/pair.c +++ b/extlib/benz/pair.c @@ -4,7 +4,7 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" +#include "picrin/private/object.h" pic_value pic_cons(pic_state *pic, pic_value car, pic_value cdr) diff --git a/extlib/benz/port.c b/extlib/benz/port.c index 3b4decb6..0f102ff4 100644 --- a/extlib/benz/port.c +++ b/extlib/benz/port.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/file.h" +#include "picrin/private/object.h" +#include "picrin/private/file.h" #undef EOF #define EOF (-1) diff --git a/extlib/benz/proc.c b/extlib/benz/proc.c index 9b6e0010..bc4863eb 100644 --- a/extlib/benz/proc.c +++ b/extlib/benz/proc.c @@ -4,9 +4,9 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/opcode.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/opcode.h" +#include "picrin/private/state.h" #define MIN(x,y) ((x) < (y) ? (x) : (y)) diff --git a/extlib/benz/read.c b/extlib/benz/read.c index baa13123..573d8b4e 100644 --- a/extlib/benz/read.c +++ b/extlib/benz/read.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" #undef EOF #define EOF (-1) diff --git a/extlib/benz/record.c b/extlib/benz/record.c index dee14562..9d764b99 100644 --- a/extlib/benz/record.c +++ b/extlib/benz/record.c @@ -3,7 +3,7 @@ */ #include "picrin.h" -#include "picrin/object.h" +#include "picrin/private/object.h" pic_value pic_make_rec(pic_state *pic, pic_value type, pic_value datum) diff --git a/extlib/benz/state.c b/extlib/benz/state.c index 9557963a..8ddd9dec 100644 --- a/extlib/benz/state.c +++ b/extlib/benz/state.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" static void pic_init_features(pic_state *pic) diff --git a/extlib/benz/string.c b/extlib/benz/string.c index 431d2fd2..54b9c41c 100644 --- a/extlib/benz/string.c +++ b/extlib/benz/string.c @@ -4,7 +4,7 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" +#include "picrin/private/object.h" struct pic_chunk { char *str; diff --git a/extlib/benz/symbol.c b/extlib/benz/symbol.c index 0fa0ab63..81f02925 100644 --- a/extlib/benz/symbol.c +++ b/extlib/benz/symbol.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" #define kh_pic_str_hash(a) (pic_str_hash(pic, pic_obj_value(a))) #define kh_pic_str_cmp(a, b) (pic_str_cmp(pic, pic_obj_value(a), pic_obj_value(b)) == 0) diff --git a/extlib/benz/value.c b/extlib/benz/value.c index 1a737256..db8ccdf7 100644 --- a/extlib/benz/value.c +++ b/extlib/benz/value.c @@ -3,7 +3,7 @@ */ #include "picrin.h" -#include "picrin/object.h" +#include "picrin/private/object.h" #if PIC_NAN_BOXING diff --git a/extlib/benz/var.c b/extlib/benz/var.c index 4eb048e0..8f4b2ef7 100644 --- a/extlib/benz/var.c +++ b/extlib/benz/var.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" static pic_value var_get(pic_state *pic, pic_value var) diff --git a/extlib/benz/vector.c b/extlib/benz/vector.c index 402f36c8..aa254917 100644 --- a/extlib/benz/vector.c +++ b/extlib/benz/vector.c @@ -4,7 +4,7 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" +#include "picrin/private/object.h" pic_value pic_make_vec(pic_state *pic, int len, pic_value *argv) diff --git a/extlib/benz/weak.c b/extlib/benz/weak.c index 1ba978b1..2a294e4a 100644 --- a/extlib/benz/weak.c +++ b/extlib/benz/weak.c @@ -3,7 +3,7 @@ */ #include "picrin.h" -#include "picrin/object.h" +#include "picrin/private/object.h" KHASH_DEFINE(weak, struct pic_object *, pic_value, kh_ptr_hash_func, kh_ptr_hash_equal) diff --git a/extlib/benz/write.c b/extlib/benz/write.c index c3b68ba5..810f1b12 100644 --- a/extlib/benz/write.c +++ b/extlib/benz/write.c @@ -4,8 +4,8 @@ #include "picrin.h" #include "picrin/extra.h" -#include "picrin/object.h" -#include "picrin/state.h" +#include "picrin/private/object.h" +#include "picrin/private/state.h" KHASH_DECLARE(l, void *, int) KHASH_DECLARE(v, void *, int)