mirror of
https://github.com/false-schemers/skint.git
synced 2024-11-16 07:47:54 +01:00
n.{h,c}, k.c, s.c, and t.c fully generated from /pre
This commit is contained in:
parent
8a4b1b06ea
commit
ea15417b4e
5 changed files with 25 additions and 550 deletions
2
i.c
2
i.c
|
@ -4866,7 +4866,7 @@ static obj *init_module(obj *r, obj *sp, obj *hp, const char **mod)
|
|||
return hp;
|
||||
}
|
||||
|
||||
/* partially hand-coded module (prototyped in i.scm) */
|
||||
/* hand-coded! */
|
||||
char *i_code[] = {
|
||||
|
||||
/* initialize *transformers* with xform builtins */
|
||||
|
|
518
k.c
518
k.c
|
@ -1,503 +1,11 @@
|
|||
/* k.sf */
|
||||
/* Generated by #F $Id$ */
|
||||
#ifdef PROFILE
|
||||
#define host host_module_k
|
||||
#endif
|
||||
/* k.c -- generated via skint ksf2c.ssc k.sf */
|
||||
|
||||
#include "n.h"
|
||||
#include "i.h"
|
||||
|
||||
#define MODULE module_k
|
||||
#define LOAD()
|
||||
|
||||
/* standard includes */
|
||||
#include <stdio.h>
|
||||
#include <stddef.h>
|
||||
#include <stdlib.h>
|
||||
#include <assert.h>
|
||||
/* extra includes */
|
||||
#include <math.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
|
||||
/* standard definitions */
|
||||
#ifdef NAN_BOXING
|
||||
#include <stdint.h>
|
||||
typedef int64_t obj; /* pointers are this size, higher 16 bits and lower bit zero */
|
||||
typedef int64_t cxoint_t; /* same thing, used as integer */
|
||||
typedef struct { /* type descriptor */
|
||||
const char *tname; /* name (debug) */
|
||||
void (*free)(void*); /* deallocator */
|
||||
} cxtype_t;
|
||||
|
||||
#define notobjptr(o) (((cxoint_t)(o) - (cxoint_t)cxg_heap) & cxg_hmask)
|
||||
#define isobjptr(o) (!notobjptr(o))
|
||||
#define notaptr(o) ((o) & 0xffff000000000001ULL)
|
||||
#define isaptr(o) (!notaptr(o))
|
||||
#else
|
||||
typedef ptrdiff_t obj; /* pointers are this size, lower bit zero */
|
||||
typedef ptrdiff_t cxoint_t; /* same thing, used as integer */
|
||||
typedef struct { /* type descriptor */
|
||||
const char *tname; /* name (debug) */
|
||||
void (*free)(void*); /* deallocator */
|
||||
} cxtype_t;
|
||||
|
||||
#define notobjptr(o) (((char*)(o) - (char*)cxg_heap) & cxg_hmask)
|
||||
#define isobjptr(o) (!notobjptr(o))
|
||||
#define notaptr(o) ((o) & 1)
|
||||
#define isaptr(o) (!notaptr(o))
|
||||
#endif
|
||||
|
||||
#define obj_from_obj(o) (o)
|
||||
#define obj_from_objptr(p) ((obj)(p))
|
||||
#define obj_from_size(n) (((cxoint_t)(n) << 1) | 1)
|
||||
|
||||
#define objptr_from_objptr(p) (p)
|
||||
#define objptr_from_obj(o) ((obj*)(o))
|
||||
|
||||
#define size_from_obj(o) ((int)((o) >> 1))
|
||||
|
||||
#define obj_from_case(n) obj_from_objptr(cases+(n))
|
||||
#define case_from_obj(o) (objptr_from_obj(o)-cases)
|
||||
#define obj_from_ktrap() obj_from_size(0x5D56F806)
|
||||
#define obj_from_void(v) ((void)(v), obj_from_size(0x6F56DF77))
|
||||
|
||||
#define bool_from_obj(o) (o)
|
||||
#define bool_from_bool(b) (b)
|
||||
#define bool_from_size(s) (s)
|
||||
|
||||
#define void_from_void(v) (void)(v)
|
||||
#define void_from_obj(o) (void)(o)
|
||||
|
||||
#define rreserve(m) if (r + (m) >= cxg_rend) r = cxm_rgc(r, m)
|
||||
#define hpushptr(p, pt, l) (hreserve(2, l), *--hp = (obj)(p), *--hp = (obj)(pt), (obj)(hp+1))
|
||||
#define hbsz(s) ((s) + 1) /* 1 extra word to store block size */
|
||||
#define hreserve(n, l) ((hp < cxg_heap + (n)) ? hp = cxm_hgc(r, r+(l), hp, n) : hp)
|
||||
#define hendblk(n) (*--hp = obj_from_size(n), (obj)(hp+1))
|
||||
#define hblklen(p) size_from_obj(((obj*)(p))[-1])
|
||||
#define hblkref(p, i) (((obj*)(p))[i])
|
||||
|
||||
typedef obj (*cxhost_t)(obj);
|
||||
typedef struct cxroot_tag {
|
||||
int globc; obj **globv;
|
||||
struct cxroot_tag *next;
|
||||
} cxroot_t;
|
||||
|
||||
extern obj *cxg_heap;
|
||||
extern obj *cxg_hp;
|
||||
extern cxoint_t cxg_hmask;
|
||||
extern cxroot_t *cxg_rootp;
|
||||
extern obj *cxm_rgc(obj *regs, size_t needs);
|
||||
extern obj *cxm_hgc(obj *regs, obj *regp, obj *hp, size_t needs);
|
||||
extern obj *cxg_regs, *cxg_rend;
|
||||
extern void cxm_check(int x, char *msg);
|
||||
extern void *cxm_cknull(void *p, char *msg);
|
||||
extern int cxg_rc;
|
||||
extern char **cxg_argv;
|
||||
|
||||
/* extra definitions */
|
||||
/* basic object representation */
|
||||
#ifdef NAN_BOXING
|
||||
#define isim0(o) (((o) & 0xffffffff00000003ULL) == 3) /* 30 bits of payload */
|
||||
#define isimm(o, t) (((o) & 0xffffffff000000ffULL) == (((t) << 2) | 1)) /* 24 */
|
||||
#ifdef NDEBUG
|
||||
#define getim0s(o) (long)(((((int32_t)(o) >> 2) & 0x3fffffff) ^ 0x20000000) - 0x20000000)
|
||||
#define getimmu(o, t) (long)(((o) >> 8) & 0xffffff)
|
||||
#else
|
||||
extern long getim0s(obj o);
|
||||
extern long getimmu(obj o, int t);
|
||||
#endif
|
||||
#define mkim0(v) ((obj)((((v) & 0x000000003fffffffULL) << 2) | 3))
|
||||
#define mkimm(v, t) ((obj)((((v) & 0x0000000000ffffffULL) << 8) | ((t) << 2) | 1))
|
||||
#else
|
||||
#define isim0(o) (((o) & 3) == 3)
|
||||
#define isimm(o, t) (((o) & 0xff) == (((t) << 2) | 1))
|
||||
#ifdef NDEBUG
|
||||
#define getim0s(o) (long)(((((int)(o) >> 2) & 0x3fffffff) ^ 0x20000000) - 0x20000000)
|
||||
#define getimmu(o, t) (long)(((o) >> 8) & 0xffffff)
|
||||
#else
|
||||
extern long getim0s(obj o);
|
||||
extern long getimmu(obj o, int t);
|
||||
#endif
|
||||
#define mkim0(o) (obj)((((o) & 0x3fffffff) << 2) | 3)
|
||||
#define mkimm(o, t) (obj)((((o) & 0xffffff) << 8) | ((t) << 2) | 1)
|
||||
#define FLONUMS_BOXED
|
||||
#endif
|
||||
#ifdef NDEBUG
|
||||
static int isnative(obj o, cxtype_t *tp)
|
||||
{ return isobjptr(o) && objptr_from_obj(o)[-1] == (obj)tp; }
|
||||
#define getnative(o, t) ((void*)(*objptr_from_obj(o)))
|
||||
#else
|
||||
extern int isnative(obj o, cxtype_t *tp);
|
||||
extern void *getnative(obj o, cxtype_t *tp);
|
||||
#endif
|
||||
extern int istagged(obj o, int t);
|
||||
#ifdef NDEBUG
|
||||
#define cktagged(o, t) (o)
|
||||
#define taggedlen(o, t) (hblklen(o)-1)
|
||||
#define taggedref(o, t, i) (&hblkref(o, (i)+1))
|
||||
#else
|
||||
extern obj cktagged(obj o, int t);
|
||||
extern int taggedlen(obj o, int t);
|
||||
extern obj* taggedref(obj o, int t, int i);
|
||||
#endif
|
||||
extern int istyped(obj o);
|
||||
#ifdef NDEBUG
|
||||
#define cktyped(o, t) (o)
|
||||
#define typedtype(o) (&hblkref(o, 0))
|
||||
#define typedlen(o) (hblklen(o)-1)
|
||||
#define typedref(o, i) (&hblkref(o, (i)+1))
|
||||
#else
|
||||
extern obj cktyped(obj o);
|
||||
extern obj* typedtype(obj o);
|
||||
extern int typedlen(obj o);
|
||||
extern obj* typedref(obj o, int i);
|
||||
#endif
|
||||
/* booleans */
|
||||
#define TRUE_ITAG 0
|
||||
typedef int bool_t;
|
||||
#define is_bool_obj(o) (!((o) & ~(obj)1))
|
||||
#define is_bool_bool(b) ((void)(b), 1)
|
||||
#define void_from_bool(b) (void)(b)
|
||||
#define obj_from_bool(b) ((b) ? mkimm(0, TRUE_ITAG) : 0)
|
||||
/* void */
|
||||
#define VOID_ITAG 1
|
||||
#define mkvoid() mkimm(0, VOID_ITAG)
|
||||
#define isvoid(o) ((o) == mkimm(0, VOID_ITAG))
|
||||
#undef obj_from_void
|
||||
#define obj_from_void(v) ((void)(v), mkimm(0, VOID_ITAG))
|
||||
/* unit */
|
||||
#define obj_from_unit() (obj_from_size(0x6DF6F577))
|
||||
/* numbers */
|
||||
#define FIXNUM_BIT 30
|
||||
#define FIXNUM_MIN -536870912
|
||||
#define FIXNUM_MAX 536870911
|
||||
#ifdef NDEBUG
|
||||
#define fxneg(x) (-(x))
|
||||
#define fxabs(x) (labs(x))
|
||||
#define fxadd(x, y) ((x) + (y))
|
||||
#define fxsub(x, y) ((x) - (y))
|
||||
#define fxmul(x, y) ((x) * (y))
|
||||
/* exact integer division */
|
||||
#define fxdiv(x, y) ((x) / (y))
|
||||
/* truncated division (common/C99) */
|
||||
#define fxquo(x, y) ((x) / (y))
|
||||
#define fxrem(x, y) ((x) % (y))
|
||||
/* floor division */
|
||||
static long fxmqu(long x, long y) {
|
||||
long q = x / y; return ((x < 0 && y > 0) || (x > 0 && y < 0)) ? q - 1 : q;
|
||||
}
|
||||
static long fxmlo(long x, long y) {
|
||||
long r = x % y; return ((r < 0 && y > 0) || (r > 0 && y < 0)) ? r + y : r;
|
||||
}
|
||||
/* euclidean division */
|
||||
static long fxeuq(long x, long y) {
|
||||
long q = x / y, r = x % y; return (r < 0) ? ((y > 0) ? q - 1 : q + 1) : q;
|
||||
}
|
||||
static long fxeur(long x, long y) {
|
||||
long r = x % y; return (r < 0) ? ((y > 0) ? r + y : r - y) : r;
|
||||
}
|
||||
static long fxgcd(long x, long y) {
|
||||
long a = labs(x), b = labs(y), c; while (b) c = a%b, a = b, b = c;
|
||||
return a;
|
||||
}
|
||||
#define fxasl(x, y) ((x) << (y))
|
||||
#define fxasr(x, y) ((x) >> (y))
|
||||
#define fxflo(f) ((long)(f))
|
||||
#else
|
||||
extern long fxneg(long x);
|
||||
extern long fxabs(long x);
|
||||
extern long fxadd(long x, long y);
|
||||
extern long fxsub(long x, long y);
|
||||
extern long fxmul(long x, long y);
|
||||
extern long fxdiv(long x, long y);
|
||||
extern long fxquo(long x, long y);
|
||||
extern long fxrem(long x, long y);
|
||||
extern long fxmqu(long x, long y);
|
||||
extern long fxmlo(long x, long y);
|
||||
extern long fxeuq(long x, long y);
|
||||
extern long fxeur(long x, long y);
|
||||
extern long fxgcd(long x, long y);
|
||||
extern long fxasl(long x, long y);
|
||||
extern long fxasr(long x, long y);
|
||||
extern long fxflo(double f);
|
||||
#endif
|
||||
static int flisint(double f) { return f > -HUGE_VAL && f < HUGE_VAL && f == floor(f); }
|
||||
extern long fxpow(long x, long y);
|
||||
extern long fxsqrt(long x);
|
||||
extern int fxifdv(long x, long y, long *pi, double *pd);
|
||||
extern double flquo(double x, double y);
|
||||
extern double flrem(double x, double y);
|
||||
extern double flmqu(double x, double y);
|
||||
extern double flmlo(double x, double y);
|
||||
extern double flgcd(double x, double y);
|
||||
extern double flround(double x);
|
||||
extern int strtofxfl(char *s, int radix, long *pl, double *pd);
|
||||
/* fixnums */
|
||||
typedef long fixnum_t;
|
||||
#define is_fixnum_obj(o) (isim0(o))
|
||||
#define is_fixnum_fixnum(i) ((void)(i), 1)
|
||||
#define is_bool_fixnum(i) ((void)(i), 0)
|
||||
#define is_fixnum_bool(i) ((void)(i), 0)
|
||||
#define fixnum_from_obj(o) (getim0s(o))
|
||||
#define fixnum_from_fixnum(i) (i)
|
||||
#define fixnum_from_flonum(l,x) ((fixnum_t)(x))
|
||||
#define bool_from_fixnum(i) ((void)(i), 1)
|
||||
#define void_from_fixnum(i) (void)(i)
|
||||
#define obj_from_fixnum(i) mkim0((fixnum_t)(i))
|
||||
/* flonums */
|
||||
#ifndef FLONUMS_BOXED
|
||||
typedef double flonum_t;
|
||||
#define is_flonum_obj(o) (((o) & 0xffff000000000000ULL) != 0ULL)
|
||||
#define is_flonum_flonum(f) ((void)(f), 1)
|
||||
#define is_flonum_bool(f) ((void)(f), 0)
|
||||
#define is_bool_flonum(f) ((void)(f), 0)
|
||||
#define is_fixnum_flonum(i) ((void)(i), 0)
|
||||
#define is_flonum_fixnum(i) ((void)(i), 0)
|
||||
#define flonum_from_flonum(l, f) (f)
|
||||
#define flonum_from_fixnum(x) ((flonum_t)(x))
|
||||
#define bool_from_flonum(f) ((void)(f), 0)
|
||||
#define void_from_flonum(l, f) (void)(f)
|
||||
union iod { cxoint_t i; double d; };
|
||||
static double flonum_from_obj(obj o) {
|
||||
union iod u;
|
||||
assert(is_flonum_obj(o));
|
||||
u.i = ~o;
|
||||
return u.d;
|
||||
}
|
||||
static obj obj_from_flonum(int rc, double d) {
|
||||
union iod u;
|
||||
u.d = d;
|
||||
assert(is_flonum_obj(~u.i));
|
||||
return ~u.i;
|
||||
}
|
||||
#else /* FLONUMS_BOXED */
|
||||
extern cxtype_t *FLONUM_NTAG;
|
||||
typedef double flonum_t;
|
||||
#define is_flonum_obj(o) (isnative(o, FLONUM_NTAG))
|
||||
#define is_flonum_flonum(f) ((void)(f), 1)
|
||||
#define is_flonum_bool(f) ((void)(f), 0)
|
||||
#define is_bool_flonum(f) ((void)(f), 0)
|
||||
#define is_fixnum_flonum(i) ((void)(i), 0)
|
||||
#define is_flonum_fixnum(i) ((void)(i), 0)
|
||||
#define flonum_from_obj(o) (*(flonum_t*)getnative(o, FLONUM_NTAG))
|
||||
#define flonum_from_flonum(l, f) (f)
|
||||
#define flonum_from_fixnum(x) ((flonum_t)(x))
|
||||
#define bool_from_flonum(f) ((void)(f), 0)
|
||||
#define void_from_flonum(l, f) (void)(f)
|
||||
#define obj_from_flonum(l, f) hpushptr(dupflonum(f), FLONUM_NTAG, l)
|
||||
extern flonum_t *dupflonum(flonum_t f);
|
||||
#endif
|
||||
/* characters */
|
||||
#define CHAR_ITAG 2
|
||||
typedef int char_t;
|
||||
#define ischar(o) (isimm(o, CHAR_ITAG))
|
||||
#define is_char_obj(o) (isimm(o, CHAR_ITAG))
|
||||
#define is_char_char(i) ((void)(i), 1)
|
||||
#define is_char_bool(i) ((void)(i), 0)
|
||||
#define is_bool_char(i) ((void)(i), 0)
|
||||
#define is_char_fixnum(i) ((void)(i), 0)
|
||||
#define is_fixnum_char(i) ((void)(i), 0)
|
||||
#define is_char_flonum(i) ((void)(i), 0)
|
||||
#define is_flonum_char(i) ((void)(i), 0)
|
||||
#define char_from_obj(o) ((int)getimmu(o, CHAR_ITAG))
|
||||
#define char_from_char(i) (i)
|
||||
#define bool_from_char(i) ((void)(i), 1)
|
||||
#define void_from_char(i) (void)(i)
|
||||
#define obj_from_char(i) mkimm(i, CHAR_ITAG)
|
||||
/* strings */
|
||||
extern cxtype_t *STRING_NTAG;
|
||||
#define isstring(o) (isnative(o, STRING_NTAG))
|
||||
#define stringdata(o) ((int*)getnative(o, STRING_NTAG))
|
||||
#define sdatachars(d) ((char*)((d)+1))
|
||||
#define stringlen(o) (*stringdata(o))
|
||||
#define stringchars(o) ((char*)(stringdata(o)+1))
|
||||
#define hpushstr(l, s) hpushptr(s, STRING_NTAG, l)
|
||||
#ifdef NDEBUG
|
||||
#define stringref(o, i) (stringchars(o)+(i))
|
||||
#else
|
||||
extern char* stringref(obj o, int i);
|
||||
#endif
|
||||
extern int *newstring(char *s);
|
||||
extern int *newstringn(char *s, int n);
|
||||
extern int *allocstring(int n, int c);
|
||||
extern int *substring(int *d, int from, int to);
|
||||
extern int *stringcat(int *d0, int *d1);
|
||||
extern int *dupstring(int *d);
|
||||
extern void stringfill(int *d, int c);
|
||||
extern int strcmp_ci(char *s1, char *s2);
|
||||
/* vectors */
|
||||
#define VECTOR_BTAG 1
|
||||
#define isvector(o) istagged(o, VECTOR_BTAG)
|
||||
#define vectorref(v, i) *taggedref(v, VECTOR_BTAG, i)
|
||||
#define vectorlen(v) taggedlen(v, VECTOR_BTAG)
|
||||
/* bytevectors */
|
||||
extern cxtype_t *BYTEVECTOR_NTAG;
|
||||
#define isbytevector(o) (isnative(o, BYTEVECTOR_NTAG))
|
||||
#define bytevectordata(o) ((int*)getnative(o, BYTEVECTOR_NTAG))
|
||||
#define bvdatabytes(d) ((unsigned char*)((d)+1))
|
||||
#define bytevectorlen(o) (*bytevectordata(o))
|
||||
#define bytevectorbytes(o) (bvdatabytes(bytevectordata(o)))
|
||||
#define hpushu8v(l, s) hpushptr(s, BYTEVECTOR_NTAG, l)
|
||||
static int is_byte_obj(obj o) { return (obj_from_fixnum(0) <= o && o <= obj_from_fixnum(255)); }
|
||||
#define byte_from_obj(o) byte_from_fixnum(fixnum_from_obj(o))
|
||||
#ifdef NDEBUG
|
||||
#define byte_from_fixnum(n) ((unsigned char)(n))
|
||||
#else
|
||||
static unsigned char byte_from_fixnum(int n) { assert(0 <= n && n <= 255); return n; }
|
||||
#endif
|
||||
#define byte_from_obj(o) byte_from_fixnum(fixnum_from_obj(o))
|
||||
#ifdef NDEBUG
|
||||
#define bytevectorref(o, i) (bytevectorbytes(o)+(i))
|
||||
#else
|
||||
extern unsigned char* bytevectorref(obj o, int i);
|
||||
#endif
|
||||
extern int *newbytevector(unsigned char *s, int n);
|
||||
extern int *makebytevector(int n, int c);
|
||||
extern int *allocbytevector(int n);
|
||||
extern int *dupbytevector(int *d);
|
||||
extern int bytevectoreq(int *d0, int *d1);
|
||||
extern int *subbytevector(int *d, int from, int to);
|
||||
/* boxes */
|
||||
#define BOX_BTAG 2
|
||||
#define isbox(o) istagged(o, BOX_BTAG)
|
||||
#define boxref(o) *taggedref(o, BOX_BTAG, 0)
|
||||
/* null */
|
||||
#define NULL_ITAG 3
|
||||
#define mknull() mkimm(0, NULL_ITAG)
|
||||
#define isnull(o) ((o) == mkimm(0, NULL_ITAG))
|
||||
/* pairs and lists */
|
||||
#define PAIR_BTAG 3
|
||||
#define ispair(o) istagged(o, PAIR_BTAG)
|
||||
#define car(o) *taggedref(o, PAIR_BTAG, 0)
|
||||
#define cdr(o) *taggedref(o, PAIR_BTAG, 1)
|
||||
extern int islist(obj l);
|
||||
/* symbols */
|
||||
#define SYMBOL_ITAG 4
|
||||
#define issymbol(o) (isimm(o, SYMBOL_ITAG))
|
||||
#define mksymbol(i) mkimm(i, SYMBOL_ITAG)
|
||||
#define getsymbol(o) getimmu(o, SYMBOL_ITAG)
|
||||
extern char *symbolname(int sym);
|
||||
extern int internsym(char *name);
|
||||
/* records */
|
||||
#define isrecord(o) istyped(o)
|
||||
#define recordrtd(r) *typedtype(r)
|
||||
#define recordlen(r) typedlen(r)
|
||||
#define recordref(r, i) *typedref(r, i)
|
||||
/* procedures */
|
||||
extern int isprocedure(obj o);
|
||||
extern int procedurelen(obj o);
|
||||
extern obj* procedureref(obj o, int i);
|
||||
/* apply and dotted lambda list */
|
||||
extern obj appcases[];
|
||||
/* eof */
|
||||
#define EOF_ITAG 7
|
||||
#define mkeof() mkimm(0, EOF_ITAG)
|
||||
#define iseof(o) ((o) == mkimm(0, EOF_ITAG))
|
||||
/* shebangs (#! directives or script start lines) */
|
||||
#define SHEBANG_ITAG 8
|
||||
#define isshebang(o) (isimm(o, SHEBANG_ITAG))
|
||||
#define mkshebang(i) mkimm(i, SHEBANG_ITAG)
|
||||
#define getshebang(o) getimmu(o, SHEBANG_ITAG)
|
||||
/* input ports */
|
||||
typedef struct { /* extends cxtype_t */
|
||||
const char *tname;
|
||||
void (*free)(void*);
|
||||
int (*close)(void*);
|
||||
int (*getch)(void*);
|
||||
int (*ungetch)(int, void*);
|
||||
} cxtype_iport_t;
|
||||
extern cxtype_t *IPORT_CLOSED_NTAG;
|
||||
extern cxtype_t *IPORT_FILE_NTAG;
|
||||
extern cxtype_t *IPORT_STRING_NTAG;
|
||||
extern cxtype_t *IPORT_BYTEVECTOR_NTAG;
|
||||
static cxtype_iport_t *iportvt(obj o) {
|
||||
cxtype_t *pt; if (!isobjptr(o)) return NULL;
|
||||
pt = (cxtype_t*)objptr_from_obj(o)[-1];
|
||||
if (pt != IPORT_CLOSED_NTAG && pt != IPORT_FILE_NTAG &&
|
||||
pt != IPORT_STRING_NTAG && pt != IPORT_BYTEVECTOR_NTAG) return NULL;
|
||||
else return (cxtype_iport_t*)pt; }
|
||||
#define ckiportvt(o) ((cxtype_iport_t*)cxm_cknull(iportvt(o), "iportvt"))
|
||||
#define isiport(o) (iportvt(o) != NULL)
|
||||
#define iportdata(o) ((void*)(*objptr_from_obj(o)))
|
||||
static int iportgetc(obj o) {
|
||||
cxtype_iport_t *vt = iportvt(o); void *pp = iportdata(o);
|
||||
assert(vt); return vt->getch(pp);
|
||||
}
|
||||
static int iportpeekc(obj o) {
|
||||
cxtype_iport_t *vt = iportvt(o); void *pp = iportdata(o); int c;
|
||||
assert(vt); c = vt->getch(pp); if (c != EOF) vt->ungetch(c, pp); return c;
|
||||
}
|
||||
/* closed input ports */
|
||||
#define mkiport_file(l, fp) hpushptr(fp, IPORT_FILE_NTAG, l)
|
||||
/* string input ports */
|
||||
typedef struct { char *p; void *base; } sifile_t;
|
||||
extern sifile_t *sialloc(char *p, void *base);
|
||||
#define mkiport_string(l, fp) hpushptr(fp, IPORT_STRING_NTAG, l)
|
||||
/* bytevector input ports */
|
||||
typedef struct { unsigned char *p, *e; void *base; } bvifile_t;
|
||||
extern bvifile_t *bvialloc(unsigned char *p, unsigned char *e, void *base);
|
||||
#define mkiport_bytevector(l, fp) hpushptr(fp, IPORT_BYTEVECTOR_NTAG, l)
|
||||
/* output ports */
|
||||
typedef struct { /* extends cxtype_t */
|
||||
const char *tname;
|
||||
void (*free)(void*);
|
||||
int (*close)(void*);
|
||||
int (*putch)(int, void*);
|
||||
int (*flush)(void*);
|
||||
} cxtype_oport_t;
|
||||
extern cxtype_t *OPORT_CLOSED_NTAG;
|
||||
extern cxtype_t *OPORT_FILE_NTAG;
|
||||
extern cxtype_t *OPORT_STRING_NTAG;
|
||||
extern cxtype_t *OPORT_BYTEVECTOR_NTAG;
|
||||
static cxtype_oport_t *oportvt(obj o) {
|
||||
cxtype_t *pt; if (!isobjptr(o)) return NULL;
|
||||
pt = (cxtype_t*)objptr_from_obj(o)[-1];
|
||||
if (pt != OPORT_CLOSED_NTAG && pt != OPORT_FILE_NTAG &&
|
||||
pt != OPORT_STRING_NTAG && pt != OPORT_BYTEVECTOR_NTAG) return NULL;
|
||||
else return (cxtype_oport_t*)pt; }
|
||||
#define ckoportvt(o) ((cxtype_oport_t*)cxm_cknull(oportvt(o), "oportvt"))
|
||||
#define isoport(o) (oportvt(o) != NULL)
|
||||
#define oportdata(o) ((void*)(*objptr_from_obj(o)))
|
||||
static void oportputc(int c, obj o) {
|
||||
cxtype_oport_t *vt = oportvt(o); void *pp = oportdata(o);
|
||||
assert(vt); vt->putch(c, pp);
|
||||
}
|
||||
static void oportputs(char *s, obj o) {
|
||||
cxtype_oport_t *vt = oportvt(o); void *pp = oportdata(o);
|
||||
assert(vt); while (*s) vt->putch(*s++, pp);
|
||||
}
|
||||
static void oportwrite(char *s, int n, obj o) {
|
||||
cxtype_oport_t *vt = oportvt(o); void *pp = oportdata(o);
|
||||
assert(vt); while (n-- > 0) vt->putch(*s++, pp);
|
||||
}
|
||||
static void oportflush(obj o) {
|
||||
cxtype_oport_t *vt = oportvt(o); void *pp = oportdata(o);
|
||||
assert(vt); vt->flush(pp);
|
||||
}
|
||||
/* closed output ports */
|
||||
#define mkoport_file(l, fp) hpushptr(fp, OPORT_FILE_NTAG, l)
|
||||
/* string output ports */
|
||||
typedef struct cbuf_tag { char *buf; char *fill; char *end; } cbuf_t;
|
||||
extern cbuf_t* newcb(void);
|
||||
extern void freecb(cbuf_t* pcb);
|
||||
extern int cbputc(int c, cbuf_t* pcb);
|
||||
extern size_t cblen(cbuf_t* pcb);
|
||||
extern char* cbdata(cbuf_t* pcb);
|
||||
#define mkoport_string(l, fp) hpushptr(fp, OPORT_STRING_NTAG, l)
|
||||
/* bytevector output ports */
|
||||
#define mkoport_bytevector(l, fp) hpushptr(fp, OPORT_BYTEVECTOR_NTAG, l)
|
||||
extern int iscircular(obj x);
|
||||
extern int iseqv(obj x, obj y);
|
||||
extern obj ismemv(obj x, obj l);
|
||||
extern obj isassv(obj x, obj l);
|
||||
extern int isequal(obj x, obj y);
|
||||
extern obj ismember(obj x, obj l);
|
||||
extern obj isassoc(obj x, obj l);
|
||||
/* S-expression writers */
|
||||
extern void oportputsimple(obj x, obj p, int disp);
|
||||
extern void oportputcircular(obj x, obj p, int disp);
|
||||
extern void oportputshared(obj x, obj p, int disp);
|
||||
#include "i.h"
|
||||
|
||||
/* cx globals */
|
||||
obj cx__2Acurrent_2Derror_2A; /* *current-error* */
|
||||
obj cx__2Acurrent_2Dinput_2A; /* *current-input* */
|
||||
|
@ -515,8 +23,8 @@ obj cx_install_2Dglobal_2Dlambdas; /* install-global-lambdas */
|
|||
obj cx_main; /* main */
|
||||
obj cx_make_2Dclosure; /* make-closure */
|
||||
obj cx_tcode_2Drepl; /* tcode-repl */
|
||||
static obj cx__2312; /* constant #12 */
|
||||
static obj cx__2316; /* constant #16 */
|
||||
static obj cx__2320; /* constant #20 */
|
||||
|
||||
/* gc roots */
|
||||
static obj *globv[] = {
|
||||
|
@ -534,8 +42,8 @@ static obj *globv[] = {
|
|||
&cx_initialize_2Dmodules,
|
||||
&cx_install_2Dglobal_2Dlambdas,
|
||||
&cx_make_2Dclosure,
|
||||
&cx__2312,
|
||||
&cx__2316,
|
||||
&cx__2320,
|
||||
};
|
||||
|
||||
static cxroot_t root = {
|
||||
|
@ -561,9 +69,9 @@ jump:
|
|||
switch (case_from_obj(pc)) {
|
||||
|
||||
case 0: /* load module */
|
||||
cx__2316 = (hpushstr(0, newstring("K5")));
|
||||
cx__2312 = (hpushstr(0, newstring("K5")));
|
||||
{ static char s[] = { 36, 123, 64, 40, 121, 52, 58, 114, 101, 112, 108, 41, 91, 48, 48, 125, 0 };
|
||||
cx__2320 = (hpushstr(0, newstring(s))); }
|
||||
cx__2316 = (hpushstr(0, newstring(s))); }
|
||||
{ /* make-vector */
|
||||
obj o; int i = 0, c = (+991);
|
||||
hreserve(hbsz(c+1), 0); /* 0 live regs */
|
||||
|
@ -603,7 +111,7 @@ case 0: /* load module */
|
|||
r[2+0] = r[0];
|
||||
pc = objptr_from_obj(r[2+0])[0];
|
||||
r[2+1] = r[1];
|
||||
r[2+2] = (cx__2316);
|
||||
r[2+2] = (cx__2312);
|
||||
r += 2; /* shift reg wnd */
|
||||
rreserve(MAX_HOSTREGS);
|
||||
rc = 3;
|
||||
|
@ -699,7 +207,7 @@ gs_tcode_2Drepl: /* k */
|
|||
r[3+0] = r[1];
|
||||
pc = objptr_from_obj(r[3+0])[0];
|
||||
r[3+1] = r[2];
|
||||
r[3+2] = (cx__2320);
|
||||
r[3+2] = (cx__2316);
|
||||
r += 3; /* shift reg wnd */
|
||||
rreserve(MAX_HOSTREGS);
|
||||
rc = 3;
|
||||
|
@ -766,7 +274,7 @@ case 9: /* clo ek r */
|
|||
r[0] = r[2];
|
||||
pc = objptr_from_obj(r[0])[0];
|
||||
r[1] = obj_from_ktrap();
|
||||
r[2] = ((0) ? obj_from_bool(0) : obj_from_void(0));
|
||||
r[2] = obj_from_bool(0);
|
||||
rreserve(MAX_HOSTREGS);
|
||||
rc = 3;
|
||||
goto jump;
|
||||
|
@ -813,7 +321,7 @@ int cxg_rc = 0;
|
|||
char **cxg_argv = NULL;
|
||||
|
||||
static obj *cxg_heap2 = NULL;
|
||||
size_t cxg_hsize = 0;
|
||||
size_t cxg_hsize = 0;
|
||||
static cxoint_t cxg_hmask2 = 0;
|
||||
int cxg_gccount = 0, cxg_bumpcount = 0;
|
||||
|
||||
|
|
37
pre/i.scm
37
pre/i.scm
|
@ -1,37 +0,0 @@
|
|||
;---------------------------------------------------------------------------------------------
|
||||
; Interpreter bootstrap helper code
|
||||
;---------------------------------------------------------------------------------------------
|
||||
|
||||
(load "s.scm")
|
||||
|
||||
|
||||
; NB: this can be compiled into an entry in i_code module (see i.c), but doesn't have to
|
||||
; The code in there was produced while the following opcodes had been exposed as integrables:
|
||||
;
|
||||
; declare_instruction(dys, "y", 0, "%dynamic-state", '0', AUTOGL)
|
||||
; declare_instruction(setdys, "sy", 0, "%set-dynamic-state!", '1', AUTOGL)
|
||||
|
||||
(define (%dynamic-state-reroot! there)
|
||||
(let loop ([there there])
|
||||
(unless (eq? (%dynamic-state) there)
|
||||
(loop (cdr there))
|
||||
(let ([before (caar there)] [after (cdar there)])
|
||||
(let ([here (%dynamic-state)])
|
||||
(set-car! here (cons after before))
|
||||
(set-cdr! here there)
|
||||
(set-car! there #f)
|
||||
(set-cdr! there '())
|
||||
(%set-dynamic-state! there))
|
||||
(before)))))
|
||||
|
||||
; same %dynamic-state integrable is needed for dynamic-wind; the code in i_code module is
|
||||
; later modified manually to make sure internal lambda does not list/unlist its arguments
|
||||
|
||||
(define (dynamic-wind before during after)
|
||||
(let ([here (%dynamic-state)])
|
||||
(%dynamic-state-reroot! (cons (cons before after) here))
|
||||
(call-with-values during
|
||||
(lambda results
|
||||
(%dynamic-state-reroot! here)
|
||||
(apply values results)))))
|
||||
|
4
pre/k.sf
4
pre/k.sf
|
@ -138,6 +138,8 @@
|
|||
(define main
|
||||
(lambda (argv)
|
||||
; if we fell out of tcode repl on error, go back
|
||||
(if (eq? (tcode-repl) #t) #t (main #f))))
|
||||
(if (eq? (tcode-repl) #t)
|
||||
#f ; normal exit, exit code = 0 (#f conventions)
|
||||
(main #f))))
|
||||
|
||||
|
||||
|
|
|
@ -9,8 +9,12 @@
|
|||
(define (list4? x) (and (pair? x) (list3? (cdr x))))
|
||||
|
||||
(define *prelude* "
|
||||
#include \"n.h\"
|
||||
#include \"i.h\"
|
||||
|
||||
#define MODULE module_k
|
||||
#define LOAD()
|
||||
|
||||
")
|
||||
|
||||
(define (convert iport oport ifbase ifname)
|
||||
|
@ -26,12 +30,14 @@
|
|||
(loop (read-line iport) #f)]
|
||||
[in-header?
|
||||
(loop (read-line iport) #t)]
|
||||
[(string=? l "static size_t cxg_hsize = 0;")
|
||||
[(string=? l "static size_t cxg_hsize = 0; ") ; sfc puts 1 trailing space!
|
||||
(display "size_t cxg_hsize = 0;" oport) (newline oport)
|
||||
(loop (read-line iport) #f)]
|
||||
[(string=? l "static int cxg_gccount = 0, cxg_bumpcount = 0;")
|
||||
(display "int cxg_gccount = 0, cxg_bumpcount = 0;" oport) (newline oport)
|
||||
(loop (read-line iport) #f)]
|
||||
[(string=? l " /* fprintf(stderr, \"%d collections, %d reallocs\\n\", cxg_gccount, cxg_bumpcount); */")
|
||||
(loop (read-line iport) #f)]
|
||||
[else
|
||||
(display l oport) (newline oport)
|
||||
(loop (read-line iport) #f)])))
|
||||
|
@ -44,11 +50,6 @@
|
|||
(define ifbase (path-strip-extension ifname))
|
||||
(define tfpath (string-append ifdir ifbase ".c"))
|
||||
(define sfccmd (format #f "~a -v ~a" sfcp ifname))
|
||||
(format #t "sfcp is '~a'~%" sfcp)
|
||||
(format #t "ifdir is '~a'~%" ifdir)
|
||||
(format #t "ifname is '~a'~%" ifname)
|
||||
(format #t "tfpath is '~a'~%" tfpath)
|
||||
(format #t "sfccmd is '~a'~%" sfccmd)
|
||||
(when (file-exists? tfpath) (error "itermediate file already exists" tfpath))
|
||||
(format #t "; running ~a~%" sfccmd)
|
||||
(parameterize ([current-directory ifdir])
|
||||
|
@ -59,6 +60,7 @@
|
|||
(let ([iport (open-input-file tfpath)]
|
||||
[oport (if (null? ?ofpath) (current-output-port) (open-output-file (car ?ofpath)))])
|
||||
(convert iport oport ifbase ifname)
|
||||
(close-input-port iport)
|
||||
(unless (null? ?ofpath) (close-output-port oport)))
|
||||
(format #t "; deleting intermediate file ~a~%" tfpath)
|
||||
(delete-file tfpath))
|
||||
|
|
Loading…
Reference in a new issue