mirror of
https://github.com/false-schemers/skint.git
synced 2024-12-27 21:58:53 +01:00
n.sf fixes
This commit is contained in:
parent
5285131672
commit
74d652f3d9
3 changed files with 17 additions and 38 deletions
29
n.c
29
n.c
|
@ -499,15 +499,12 @@ static int sigetch(sifile_t *fp) {
|
||||||
static int siungetch(int c, sifile_t *fp) {
|
static int siungetch(int c, sifile_t *fp) {
|
||||||
assert(fp && fp->p); --(fp->p); assert(c == *(fp->p)); return c; }
|
assert(fp && fp->p); --(fp->p); assert(c == *(fp->p)); return c; }
|
||||||
|
|
||||||
static int sictl(ctlop_t op, sifile_t *fp, ...)
|
static int sictl(ctlop_t op, sifile_t *fp, ...) {
|
||||||
{
|
|
||||||
if (op == CTLOP_RDLN) {
|
if (op == CTLOP_RDLN) {
|
||||||
va_list args; int **pd;
|
va_list args; int **pd; va_start(args, fp);
|
||||||
va_start(args, fp);
|
|
||||||
pd = va_arg(args, int **);
|
pd = va_arg(args, int **);
|
||||||
if (*(fp->p) == 0) {
|
if (*(fp->p) == 0) *pd = NULL;
|
||||||
*pd = NULL;
|
else {
|
||||||
} else {
|
|
||||||
char *s = strchr(fp->p, '\n');
|
char *s = strchr(fp->p, '\n');
|
||||||
if (s) { *pd = newstringn(fp->p, s-fp->p); fp->p = s+1; }
|
if (s) { *pd = newstringn(fp->p, s-fp->p); fp->p = s+1; }
|
||||||
else { *pd = newstring(fp->p); fp->p += strlen(fp->p); }
|
else { *pd = newstring(fp->p); fp->p += strlen(fp->p); }
|
||||||
|
@ -518,8 +515,6 @@ static int sictl(ctlop_t op, sifile_t *fp, ...)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bvifile_t *bvialloc(unsigned char *p, unsigned char *e, void *base) {
|
bvifile_t *bvialloc(unsigned char *p, unsigned char *e, void *base) {
|
||||||
bvifile_t *fp = cxm_cknull(malloc(sizeof(bvifile_t)), "malloc(bvifile)");
|
bvifile_t *fp = cxm_cknull(malloc(sizeof(bvifile_t)), "malloc(bvifile)");
|
||||||
fp->p = p; fp->e = e; fp->base = base; return fp; }
|
fp->p = p; fp->e = e; fp->base = base; return fp; }
|
||||||
|
@ -582,7 +577,7 @@ char* cbdata(cbuf_t* pcb) {
|
||||||
cbuf_t *cbclear(cbuf_t *pcb) { pcb->fill = pcb->buf; return pcb; }
|
cbuf_t *cbclear(cbuf_t *pcb) { pcb->fill = pcb->buf; return pcb; }
|
||||||
|
|
||||||
typedef enum { TIF_NONE = 0, TIF_EOF = 1, TIF_CI = 2 } tiflags_t;
|
typedef enum { TIF_NONE = 0, TIF_EOF = 1, TIF_CI = 2 } tiflags_t;
|
||||||
typedef struct tifile_tag { cbuf_t cb; char *next; FILE *fp; int lno; tiflags_t flags; } tifile_t;
|
struct tifile_tag { cbuf_t cb; char *next; FILE *fp; int lno; tiflags_t flags; };
|
||||||
|
|
||||||
tifile_t *tialloc(FILE *fp) {
|
tifile_t *tialloc(FILE *fp) {
|
||||||
tifile_t *tp = cxm_cknull(malloc(sizeof(tifile_t)), "malloc(tifile)");
|
tifile_t *tp = cxm_cknull(malloc(sizeof(tifile_t)), "malloc(tifile)");
|
||||||
|
@ -605,7 +600,6 @@ static int tigetch(tifile_t *tp) {
|
||||||
else if (tp->flags & TIF_EOF || !tp->fp) return EOF;
|
else if (tp->flags & TIF_EOF || !tp->fp) return EOF;
|
||||||
else { /* refill with next line from fp */
|
else { /* refill with next line from fp */
|
||||||
cbuf_t *pcb = cbclear(&tp->cb); FILE *fp = tp->fp;
|
cbuf_t *pcb = cbclear(&tp->cb); FILE *fp = tp->fp;
|
||||||
#if 1
|
|
||||||
char *line = fgets(cballoc(pcb, 256), 256, fp);
|
char *line = fgets(cballoc(pcb, 256), 256, fp);
|
||||||
if (!line) { cbclear(pcb); tp->flags |= TIF_EOF; }
|
if (!line) { cbclear(pcb); tp->flags |= TIF_EOF; }
|
||||||
else { /* manually add the rest of the line */
|
else { /* manually add the rest of the line */
|
||||||
|
@ -615,10 +609,6 @@ static int tigetch(tifile_t *tp) {
|
||||||
if (c == EOF) tp->flags |= TIF_EOF;
|
if (c == EOF) tp->flags |= TIF_EOF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
do { c = getc(fp); if (c == EOF) break; cbputc(c, pcb); } while (c != '\n');
|
|
||||||
if (c == EOF) tp->flags |= TIF_EOF;
|
|
||||||
#endif
|
|
||||||
tp->lno += 1; tp->next = cbdata(pcb); /* 0-term */
|
tp->lno += 1; tp->next = cbdata(pcb); /* 0-term */
|
||||||
goto retry;
|
goto retry;
|
||||||
}
|
}
|
||||||
|
@ -630,8 +620,7 @@ static int tiungetch(int c, tifile_t *tp) {
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tictl(ctlop_t op, tifile_t *tp, ...)
|
static int tictl(ctlop_t op, tifile_t *tp, ...) {
|
||||||
{
|
|
||||||
if (op == CTLOP_RDLN) {
|
if (op == CTLOP_RDLN) {
|
||||||
va_list args; int c, n, **pd;
|
va_list args; int c, n, **pd;
|
||||||
va_start(args, tp);
|
va_start(args, tp);
|
||||||
|
@ -970,7 +959,6 @@ static void wrs(char *s, wenv_t *e) {
|
||||||
assert(vt); while (*s) vt->putch(*s++, pp);
|
assert(vt); while (*s) vt->putch(*s++, pp);
|
||||||
}
|
}
|
||||||
static int cleansymname(char *s) {
|
static int cleansymname(char *s) {
|
||||||
#if 1
|
|
||||||
static char inisub_map[256] = { /* ini: [a-zA-Z!$%&*:/<=>?@^_~] sub: ini + [0123456789.@+-] */
|
static char inisub_map[256] = { /* ini: [a-zA-Z!$%&*:/<=>?@^_~] sub: ini + [0123456789.@+-] */
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
||||||
0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 1, 1,
|
0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 2, 0, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 0, 1, 1, 1, 1,
|
||||||
|
@ -983,11 +971,6 @@ static int cleansymname(char *s) {
|
||||||
};
|
};
|
||||||
char *p = s; while (*p) if (inisub_map[*p++ & 0xFF] == 0) return 0; if (!s[0]) return 0;
|
char *p = s; while (*p) if (inisub_map[*p++ & 0xFF] == 0) return 0; if (!s[0]) return 0;
|
||||||
if (inisub_map[s[0] & 0xFF] == 1) return 1;
|
if (inisub_map[s[0] & 0xFF] == 1) return 1;
|
||||||
#else
|
|
||||||
char *inits = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!$%&*/:<=>?@^_~";
|
|
||||||
char *subss = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!$%&*/:<=>?@^_~0123456789.@+-";
|
|
||||||
if (s[0] == 0 || s[strspn(s, subss)] != 0) return 0; else if (strchr(inits, s[0])) return 1;
|
|
||||||
#endif
|
|
||||||
if (s[0] == '+' || s[0] == '-') {
|
if (s[0] == '+' || s[0] == '-') {
|
||||||
if (strcmp_ci(s+1, "inf.0") == 0 || strcmp_ci(s+1, "nan.0") == 0) return 0;
|
if (strcmp_ci(s+1, "inf.0") == 0 || strcmp_ci(s+1, "nan.0") == 0) return 0;
|
||||||
if ((s[1] == 'i' || s[1] == 'I') && s[2] == 0) return 0;
|
if ((s[1] == 'i' || s[1] == 'I') && s[2] == 0) return 0;
|
||||||
|
|
3
n.h
3
n.h
|
@ -488,9 +488,8 @@ static void oportflush(obj o) {
|
||||||
typedef struct cbuf_tag { char *buf; char *fill; char *end; } cbuf_t;
|
typedef struct cbuf_tag { char *buf; char *fill; char *end; } cbuf_t;
|
||||||
extern cbuf_t* newcb(void);
|
extern cbuf_t* newcb(void);
|
||||||
extern void freecb(cbuf_t* pcb);
|
extern void freecb(cbuf_t* pcb);
|
||||||
|
extern char* cballoc(cbuf_t* pcb, size_t n);
|
||||||
extern int cbputc(int c, cbuf_t* pcb);
|
extern int cbputc(int c, cbuf_t* pcb);
|
||||||
extern int cbgetc(cbuf_t* pcb);
|
|
||||||
extern int cbungetc(cbuf_t* pcb, int c);
|
|
||||||
extern size_t cblen(cbuf_t* pcb);
|
extern size_t cblen(cbuf_t* pcb);
|
||||||
extern char* cbdata(cbuf_t* pcb);
|
extern char* cbdata(cbuf_t* pcb);
|
||||||
extern cbuf_t* cbclear(cbuf_t *pcb);
|
extern cbuf_t* cbclear(cbuf_t *pcb);
|
||||||
|
|
17
pre/n.sf
17
pre/n.sf
|
@ -969,7 +969,7 @@ unsigned char* bytevectorref(obj o, int i) {
|
||||||
pd = va_arg(args, int **);
|
pd = va_arg(args, int **);
|
||||||
if (*(fp->p) == 0) *pd = NULL;
|
if (*(fp->p) == 0) *pd = NULL;
|
||||||
else {
|
else {
|
||||||
char *s = strchr(fp->p, '\n');
|
char *s = strchr(fp->p, '\\n');
|
||||||
if (s) { *pd = newstringn(fp->p, s-fp->p); fp->p = s+1; }
|
if (s) { *pd = newstringn(fp->p, s-fp->p); fp->p = s+1; }
|
||||||
else { *pd = newstring(fp->p); fp->p += strlen(fp->p); }
|
else { *pd = newstring(fp->p); fp->p += strlen(fp->p); }
|
||||||
}
|
}
|
||||||
|
@ -1091,9 +1091,7 @@ unsigned char* bytevectorref(obj o, int i) {
|
||||||
|
|
||||||
; text input port (uses cbuf)
|
; text input port (uses cbuf)
|
||||||
|
|
||||||
(%localdef "buf_t *cbclear(cbuf_t *pcb) { pcb->fill = pcb->buf; return pcb; }
|
(%localdef "typedef enum { TIF_NONE = 0, TIF_EOF = 1, TIF_CI = 2 } tiflags_t;
|
||||||
|
|
||||||
typedef enum { TIF_NONE = 0, TIF_EOF = 1, TIF_CI = 2 } tiflags_t;
|
|
||||||
struct tifile_tag { cbuf_t cb; char *next; FILE *fp; int lno; tiflags_t flags; };
|
struct tifile_tag { cbuf_t cb; char *next; FILE *fp; int lno; tiflags_t flags; };
|
||||||
|
|
||||||
tifile_t *tialloc(FILE *fp) {
|
tifile_t *tialloc(FILE *fp) {
|
||||||
|
@ -1121,8 +1119,8 @@ static int tigetch(tifile_t *tp) {
|
||||||
if (!line) { cbclear(pcb); tp->flags |= TIF_EOF; }
|
if (!line) { cbclear(pcb); tp->flags |= TIF_EOF; }
|
||||||
else { /* manually add the rest of the line */
|
else { /* manually add the rest of the line */
|
||||||
size_t len = strlen(line); pcb->fill = pcb->buf + len;
|
size_t len = strlen(line); pcb->fill = pcb->buf + len;
|
||||||
if (len > 0 && line[len-1] != '\n') {
|
if (len > 0 && line[len-1] != '\\n') {
|
||||||
do { c = getc(fp); if (c == EOF) break; cbputc(c, pcb); } while (c != '\n');
|
do { c = getc(fp); if (c == EOF) break; cbputc(c, pcb); } while (c != '\\n');
|
||||||
if (c == EOF) tp->flags |= TIF_EOF;
|
if (c == EOF) tp->flags |= TIF_EOF;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1148,7 +1146,7 @@ static int tictl(ctlop_t op, tifile_t *tp, ...) {
|
||||||
} else {
|
} else {
|
||||||
char *s; tiungetch(c, tp);
|
char *s; tiungetch(c, tp);
|
||||||
s = tp->next; n = tp->cb.fill - s;
|
s = tp->next; n = tp->cb.fill - s;
|
||||||
if (n > 0 && s[n-1] == '\n') --n;
|
if (n > 0 && s[n-1] == '\\n') --n;
|
||||||
*pd = newstringn(s, n);
|
*pd = newstringn(s, n);
|
||||||
tp->next = tp->cb.fill;
|
tp->next = tp->cb.fill;
|
||||||
}
|
}
|
||||||
|
@ -1735,7 +1733,7 @@ extern int set_cwd(char *cwd)
|
||||||
return chdir(cwd);
|
return chdir(cwd);
|
||||||
}
|
}
|
||||||
|
|
||||||
define TT_FALSE 'f'
|
#define TT_FALSE 'f'
|
||||||
#define TT_TRUE 't'
|
#define TT_TRUE 't'
|
||||||
#define TT_NUMBER 'n'
|
#define TT_NUMBER 'n'
|
||||||
#define TT_CHAR 'c'
|
#define TT_CHAR 'c'
|
||||||
|
@ -2054,5 +2052,4 @@ int slex(int (*in_getc)(void*), int (*in_ungetc)(int, void*), void *in, cbuf_t *
|
||||||
err:
|
err:
|
||||||
eoferr:
|
eoferr:
|
||||||
return TT_ERR;
|
return TT_ERR;
|
||||||
}
|
}")
|
||||||
")
|
|
||||||
|
|
Loading…
Reference in a new issue