add include/picrin/private dir
This commit is contained in:
parent
2246cc42d9
commit
8dd423cdbc
|
@ -1,6 +1,6 @@
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
struct pic_fullcont {
|
struct pic_fullcont {
|
||||||
jmp_buf jmp;
|
jmp_buf jmp;
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
pic_blob_value(pic_state *pic, const unsigned char *buf, int len)
|
pic_blob_value(pic_state *pic, const unsigned char *buf, int len)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
|
|
||||||
#if PIC_NAN_BOXING
|
#if PIC_NAN_BOXING
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
struct pic_cont {
|
struct pic_cont {
|
||||||
PIC_JMPBUF *jmp;
|
PIC_JMPBUF *jmp;
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
|
|
||||||
bool
|
bool
|
||||||
pic_data_p(pic_state *pic, pic_value obj, const pic_data_type *type)
|
pic_data_p(pic_state *pic, pic_value obj, const pic_data_type *type)
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
pic_get_backtrace(pic_state *pic)
|
pic_get_backtrace(pic_state *pic)
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.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)
|
KHASH_DEFINE(dict, pic_sym *, pic_value, kh_ptr_hash_func, kh_ptr_hash_equal)
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
void
|
void
|
||||||
pic_panic(pic_state PIC_UNUSED(*pic), const char *msg)
|
pic_panic(pic_state PIC_UNUSED(*pic), const char *msg)
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/opcode.h"
|
#include "picrin/private/opcode.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
optimize_beta(pic_state *pic, pic_value expr)
|
optimize_beta(pic_state *pic, pic_value expr)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
#ifndef EOF
|
#ifndef EOF
|
||||||
# define EOF (-1)
|
# define EOF (-1)
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
WHITE = 0,
|
WHITE = 0,
|
||||||
|
|
|
@ -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 <stdbool.h>
|
|
||||||
#else
|
|
||||||
# define bool char
|
|
||||||
# define true 1
|
|
||||||
# define false 0
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if __STDC_VERSION__ >= 199901L
|
|
||||||
# include <stddef.h>
|
|
||||||
#elif ! defined(offsetof)
|
|
||||||
# define offsetof(s,m) ((size_t)&(((s *)NULL)->m))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if __STDC_VERSION__ >= 199901L
|
|
||||||
# include <stdint.h>
|
|
||||||
#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 <stdnoreturn.h>
|
|
||||||
# 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 <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#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 <stdio.h>
|
|
||||||
|
|
||||||
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
|
|
|
@ -9,7 +9,7 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "picrin/khash.h"
|
#include "picrin/private/khash.h"
|
||||||
|
|
||||||
typedef struct pic_identifier pic_id;
|
typedef struct pic_identifier pic_id;
|
||||||
typedef pic_id pic_sym;
|
typedef pic_id pic_sym;
|
|
@ -9,12 +9,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "picrin/khash.h"
|
#include "picrin/private/khash.h"
|
||||||
#include "picrin/file.h"
|
#include "picrin/private/file.h"
|
||||||
|
|
||||||
#include "picrin/irep.h"
|
#include "picrin/private/irep.h"
|
||||||
#include "picrin/read.h"
|
#include "picrin/private/read.h"
|
||||||
#include "picrin/gc.h"
|
#include "picrin/private/gc.h"
|
||||||
|
|
||||||
struct pic_lib {
|
struct pic_lib {
|
||||||
struct pic_string *name;
|
struct pic_string *name;
|
|
@ -91,4 +91,374 @@
|
||||||
# define GC_DEBUG_DETAIL 0
|
# define GC_DEBUG_DETAIL 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "picrin/compat.h"
|
/* check compatibility */
|
||||||
|
|
||||||
|
#if __STDC_VERSION__ >= 199901L
|
||||||
|
# include <stdbool.h>
|
||||||
|
#else
|
||||||
|
# define bool char
|
||||||
|
# define true 1
|
||||||
|
# define false 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __STDC_VERSION__ >= 199901L
|
||||||
|
# include <stddef.h>
|
||||||
|
#elif ! defined(offsetof)
|
||||||
|
# define offsetof(s,m) ((size_t)&(((s *)NULL)->m))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if __STDC_VERSION__ >= 199901L
|
||||||
|
# include <stdint.h>
|
||||||
|
#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 <stdnoreturn.h>
|
||||||
|
# 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 <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#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 <stdio.h>
|
||||||
|
|
||||||
|
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 *);
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
KHASH_DEFINE(ltable, const char *, struct pic_lib, kh_str_hash_func, kh_str_cmp_func)
|
KHASH_DEFINE(ltable, const char *, struct pic_lib, kh_str_hash_func, kh_str_cmp_func)
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
KHASH_DEFINE(env, pic_id *, pic_sym *, kh_ptr_hash_func, kh_ptr_hash_equal)
|
KHASH_DEFINE(env, pic_id *, pic_sym *, kh_ptr_hash_func, kh_ptr_hash_equal)
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
pic_cons(pic_state *pic, pic_value car, pic_value cdr)
|
pic_cons(pic_state *pic, pic_value car, pic_value cdr)
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/file.h"
|
#include "picrin/private/file.h"
|
||||||
|
|
||||||
#undef EOF
|
#undef EOF
|
||||||
#define EOF (-1)
|
#define EOF (-1)
|
||||||
|
|
|
@ -4,9 +4,9 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/opcode.h"
|
#include "picrin/private/opcode.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
#define MIN(x,y) ((x) < (y) ? (x) : (y))
|
#define MIN(x,y) ((x) < (y) ? (x) : (y))
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
#undef EOF
|
#undef EOF
|
||||||
#define EOF (-1)
|
#define EOF (-1)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
pic_make_rec(pic_state *pic, pic_value type, pic_value datum)
|
pic_make_rec(pic_state *pic, pic_value type, pic_value datum)
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
static void
|
static void
|
||||||
pic_init_features(pic_state *pic)
|
pic_init_features(pic_state *pic)
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
|
|
||||||
struct pic_chunk {
|
struct pic_chunk {
|
||||||
char *str;
|
char *str;
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
#define kh_pic_str_hash(a) (pic_str_hash(pic, pic_obj_value(a)))
|
#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)
|
#define kh_pic_str_cmp(a, b) (pic_str_cmp(pic, pic_obj_value(a), pic_obj_value(b)) == 0)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
|
|
||||||
#if PIC_NAN_BOXING
|
#if PIC_NAN_BOXING
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
static pic_value
|
static pic_value
|
||||||
var_get(pic_state *pic, pic_value var)
|
var_get(pic_state *pic, pic_value var)
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
|
|
||||||
pic_value
|
pic_value
|
||||||
pic_make_vec(pic_state *pic, int len, pic_value *argv)
|
pic_make_vec(pic_state *pic, int len, pic_value *argv)
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "picrin.h"
|
#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)
|
KHASH_DEFINE(weak, struct pic_object *, pic_value, kh_ptr_hash_func, kh_ptr_hash_equal)
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
|
|
||||||
#include "picrin.h"
|
#include "picrin.h"
|
||||||
#include "picrin/extra.h"
|
#include "picrin/extra.h"
|
||||||
#include "picrin/object.h"
|
#include "picrin/private/object.h"
|
||||||
#include "picrin/state.h"
|
#include "picrin/private/state.h"
|
||||||
|
|
||||||
KHASH_DECLARE(l, void *, int)
|
KHASH_DECLARE(l, void *, int)
|
||||||
KHASH_DECLARE(v, void *, int)
|
KHASH_DECLARE(v, void *, int)
|
||||||
|
|
Loading…
Reference in New Issue