adding io.peekc, top-level-bound? (alias)
fixing behavior of number? fixing bugs in get-output-string, setting eof
This commit is contained in:
		
							parent
							
								
									0cc3595e80
								
							
						
					
					
						commit
						37a23afb3c
					
				| 
						 | 
					@ -13,6 +13,7 @@
 | 
				
			||||||
			    (equal? (car x) "noexpand"))
 | 
								    (equal? (car x) "noexpand"))
 | 
				
			||||||
		       (cadr x)
 | 
							       (cadr x)
 | 
				
			||||||
		       x)))))
 | 
							       x)))))
 | 
				
			||||||
 | 
					(define (command-line) *argv*)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define gensym
 | 
					(define gensym
 | 
				
			||||||
  (let (($gensym gensym))
 | 
					  (let (($gensym gensym))
 | 
				
			||||||
| 
						 | 
					@ -61,6 +62,8 @@
 | 
				
			||||||
(define char>? >)
 | 
					(define char>? >)
 | 
				
			||||||
(define char<=? <=)
 | 
					(define char<=? <=)
 | 
				
			||||||
(define char>=? >=)
 | 
					(define char>=? >=)
 | 
				
			||||||
 | 
					(define (char-whitespace? c) (not (not (string.find *whitespace* c))))
 | 
				
			||||||
 | 
					(define (char-numeric? c) (not (not (string.find "0123456789" c))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define string=? eqv?)
 | 
					(define string=? eqv?)
 | 
				
			||||||
(define string<? <)
 | 
					(define string<? <)
 | 
				
			||||||
| 
						 | 
					@ -94,6 +97,7 @@
 | 
				
			||||||
(define close-input-port io.close)
 | 
					(define close-input-port io.close)
 | 
				
			||||||
(define close-output-port io.close)
 | 
					(define close-output-port io.close)
 | 
				
			||||||
(define (read-char (s *input-stream*)) (io.getc s))
 | 
					(define (read-char (s *input-stream*)) (io.getc s))
 | 
				
			||||||
 | 
					(define (peek-char (s *input-stream*)) (io.peekc s))
 | 
				
			||||||
(define (write-char c (s *output-stream*)) (io.putc s c))
 | 
					(define (write-char c (s *output-stream*)) (io.putc s c))
 | 
				
			||||||
(define (port-eof? p) (io.eof? p))
 | 
					(define (port-eof? p) (io.eof? p))
 | 
				
			||||||
(define (open-input-string str)
 | 
					(define (open-input-string str)
 | 
				
			||||||
| 
						 | 
					@ -109,8 +113,9 @@
 | 
				
			||||||
(define (get-output-string b)
 | 
					(define (get-output-string b)
 | 
				
			||||||
  (let ((p (io.pos b)))
 | 
					  (let ((p (io.pos b)))
 | 
				
			||||||
    (io.seek b 0)
 | 
					    (io.seek b 0)
 | 
				
			||||||
    (prog1 (io.readall b)
 | 
					    (let ((s (io.readall b)))
 | 
				
			||||||
	   (io.seek b p))))
 | 
					      (io.seek b p)
 | 
				
			||||||
 | 
					      (if (eof-object? s) "" s))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
(define (open-input-file name) (file name :read))
 | 
					(define (open-input-file name) (file name :read))
 | 
				
			||||||
(define (open-output-file name) (file name :write :create))
 | 
					(define (open-output-file name) (file name :write :create))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -713,7 +713,12 @@ value_t fl_cons(value_t a, value_t b)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int isnumber(value_t v)
 | 
					int isnumber(value_t v)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    return (isfixnum(v) || iscprim(v));
 | 
					    if (isfixnum(v)) return 1;
 | 
				
			||||||
 | 
					    if (iscprim(v)) {
 | 
				
			||||||
 | 
					        cprim_t *c = (cprim_t*)ptr(v);
 | 
				
			||||||
 | 
					        return c->type != wchartype;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// read -----------------------------------------------------------------------
 | 
					// read -----------------------------------------------------------------------
 | 
				
			||||||
| 
						 | 
					@ -1230,7 +1235,7 @@ static value_t apply_cl(uint32_t nargs)
 | 
				
			||||||
            Stack[SP-1] = (issymbol(Stack[SP-1]) ? FL_T : FL_F); NEXT_OP;
 | 
					            Stack[SP-1] = (issymbol(Stack[SP-1]) ? FL_T : FL_F); NEXT_OP;
 | 
				
			||||||
        OP(OP_NUMBERP)
 | 
					        OP(OP_NUMBERP)
 | 
				
			||||||
            v = Stack[SP-1];
 | 
					            v = Stack[SP-1];
 | 
				
			||||||
            Stack[SP-1] = (isfixnum(v) || iscprim(v) ? FL_T:FL_F); NEXT_OP;
 | 
					            Stack[SP-1] = (isnumber(v) ? FL_T:FL_F); NEXT_OP;
 | 
				
			||||||
        OP(OP_FIXNUMP)
 | 
					        OP(OP_FIXNUMP)
 | 
				
			||||||
            Stack[SP-1] = (isfixnum(Stack[SP-1]) ? FL_T : FL_F); NEXT_OP;
 | 
					            Stack[SP-1] = (isfixnum(Stack[SP-1]) ? FL_T : FL_F); NEXT_OP;
 | 
				
			||||||
        OP(OP_BOUNDP)
 | 
					        OP(OP_BOUNDP)
 | 
				
			||||||
| 
						 | 
					@ -2145,6 +2150,7 @@ static void lisp_init(void)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    setc(symbol("eq"), builtin(OP_EQ));
 | 
					    setc(symbol("eq"), builtin(OP_EQ));
 | 
				
			||||||
    setc(symbol("procedure?"), builtin(OP_FUNCTIONP));
 | 
					    setc(symbol("procedure?"), builtin(OP_FUNCTIONP));
 | 
				
			||||||
 | 
					    setc(symbol("top-level-bound?"), builtin(OP_BOUNDP));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef LINUX
 | 
					#ifdef LINUX
 | 
				
			||||||
    setc(symbol("*os-name*"), symbol("linux"));
 | 
					    setc(symbol("*os-name*"), symbol("linux"));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,6 +134,16 @@ value_t fl_iogetc(value_t *args, u_int32_t nargs)
 | 
				
			||||||
    return mk_wchar(wc);
 | 
					    return mk_wchar(wc);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					value_t fl_iopeekc(value_t *args, u_int32_t nargs)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    argcount("io.peekc", nargs, 1);
 | 
				
			||||||
 | 
					    ios_t *s = toiostream(args[0], "io.peekc");
 | 
				
			||||||
 | 
					    uint32_t wc;
 | 
				
			||||||
 | 
					    if (ios_peekutf8(s, &wc) == IOS_EOF)
 | 
				
			||||||
 | 
					        return FL_EOF;
 | 
				
			||||||
 | 
					    return mk_wchar(wc);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
value_t fl_ioputc(value_t *args, u_int32_t nargs)
 | 
					value_t fl_ioputc(value_t *args, u_int32_t nargs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    argcount("io.putc", nargs, 2);
 | 
					    argcount("io.putc", nargs, 2);
 | 
				
			||||||
| 
						 | 
					@ -397,6 +407,7 @@ static builtinspec_t iostreamfunc_info[] = {
 | 
				
			||||||
    { "io.pos",   fl_iopos },
 | 
					    { "io.pos",   fl_iopos },
 | 
				
			||||||
    { "io.getc" , fl_iogetc },
 | 
					    { "io.getc" , fl_iogetc },
 | 
				
			||||||
    { "io.putc" , fl_ioputc },
 | 
					    { "io.putc" , fl_ioputc },
 | 
				
			||||||
 | 
					    { "io.peekc" , fl_iopeekc },
 | 
				
			||||||
    { "io.discardbuffer", fl_iopurge },
 | 
					    { "io.discardbuffer", fl_iopurge },
 | 
				
			||||||
    { "io.read", fl_ioread },
 | 
					    { "io.read", fl_ioread },
 | 
				
			||||||
    { "io.write", fl_iowrite },
 | 
					    { "io.write", fl_iowrite },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -54,7 +54,7 @@
 | 
				
			||||||
  * (nconc x) => x  for any x
 | 
					  * (nconc x) => x  for any x
 | 
				
			||||||
  . (copy-list (list|append|nconc ...)) => (list|append|nconc ...)
 | 
					  . (copy-list (list|append|nconc ...)) => (list|append|nconc ...)
 | 
				
			||||||
  * (apply vector (list ...)) => (vector ...)
 | 
					  * (apply vector (list ...)) => (vector ...)
 | 
				
			||||||
  . (nconc (cons x nil) y) => (cons x y)
 | 
					  * (nconc (cons x nil) y) => (cons x y)
 | 
				
			||||||
* let form without initializers (let (a b) ...), defaults to nil
 | 
					* let form without initializers (let (a b) ...), defaults to nil
 | 
				
			||||||
* print (quote a) as 'a, same for ` etc.
 | 
					* print (quote a) as 'a, same for ` etc.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -975,7 +975,7 @@ consolidated todo list as of 7/8:
 | 
				
			||||||
* fix make-system-image to save aliases of builtins
 | 
					* fix make-system-image to save aliases of builtins
 | 
				
			||||||
* reading named characters, e.g. #\newline etc.
 | 
					* reading named characters, e.g. #\newline etc.
 | 
				
			||||||
- #+, #- reader macros
 | 
					- #+, #- reader macros
 | 
				
			||||||
- printing improvements: *print-big*, keep track of horiz. position
 | 
					- printing improvements: *print-length*, keep track of horiz. position
 | 
				
			||||||
  per-stream so indenting works across print calls
 | 
					  per-stream so indenting works across print calls
 | 
				
			||||||
- remaining c types
 | 
					- remaining c types
 | 
				
			||||||
- remaining cvalues functions
 | 
					- remaining cvalues functions
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										29
									
								
								llt/ios.c
								
								
								
								
							
							
						
						
									
										29
									
								
								llt/ios.c
								
								
								
								
							| 
						 | 
					@ -247,6 +247,8 @@ static size_t _ios_read(ios_t *s, char *dest, size_t n, int all)
 | 
				
			||||||
        if (s->bm == bm_mem || s->fd == -1) {
 | 
					        if (s->bm == bm_mem || s->fd == -1) {
 | 
				
			||||||
            // can't get any more data
 | 
					            // can't get any more data
 | 
				
			||||||
            s->bpos += avail;
 | 
					            s->bpos += avail;
 | 
				
			||||||
 | 
					            if (avail == 0 && n > 0)
 | 
				
			||||||
 | 
					                s->_eof = 1;
 | 
				
			||||||
            return avail;
 | 
					            return avail;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
| 
						 | 
					@ -450,7 +452,7 @@ size_t ios_trunc(ios_t *s, size_t size)
 | 
				
			||||||
int ios_eof(ios_t *s)
 | 
					int ios_eof(ios_t *s)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    if (s->bm == bm_mem)
 | 
					    if (s->bm == bm_mem)
 | 
				
			||||||
        return (s->bpos >= s->size);
 | 
					        return (s->_eof ? 1 : 0);
 | 
				
			||||||
    if (s->fd == -1)
 | 
					    if (s->fd == -1)
 | 
				
			||||||
        return 1;
 | 
					        return 1;
 | 
				
			||||||
    if (s->_eof)
 | 
					    if (s->_eof)
 | 
				
			||||||
| 
						 | 
					@ -817,6 +819,7 @@ int ios_ungetc(int c, ios_t *s)
 | 
				
			||||||
    if (s->bpos > 0) {
 | 
					    if (s->bpos > 0) {
 | 
				
			||||||
        s->bpos--;
 | 
					        s->bpos--;
 | 
				
			||||||
        s->buf[s->bpos] = (char)c;
 | 
					        s->buf[s->bpos] = (char)c;
 | 
				
			||||||
 | 
					        s->_eof = 0;
 | 
				
			||||||
        return c;
 | 
					        return c;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (s->size == s->maxsize) {
 | 
					    if (s->size == s->maxsize) {
 | 
				
			||||||
| 
						 | 
					@ -826,6 +829,7 @@ int ios_ungetc(int c, ios_t *s)
 | 
				
			||||||
    memmove(s->buf + 1, s->buf, s->size);
 | 
					    memmove(s->buf + 1, s->buf, s->size);
 | 
				
			||||||
    s->buf[0] = (char)c;
 | 
					    s->buf[0] = (char)c;
 | 
				
			||||||
    s->size++;
 | 
					    s->size++;
 | 
				
			||||||
 | 
					    s->_eof = 0;
 | 
				
			||||||
    return c;
 | 
					    return c;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -856,6 +860,29 @@ int ios_getutf8(ios_t *s, uint32_t *pwc)
 | 
				
			||||||
    return 1;
 | 
					    return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int ios_peekutf8(ios_t *s, uint32_t *pwc)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    int c;
 | 
				
			||||||
 | 
					    size_t sz;
 | 
				
			||||||
 | 
					    char c0;
 | 
				
			||||||
 | 
					    char buf[8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    c = ios_peekc(s);
 | 
				
			||||||
 | 
					    if (c == IOS_EOF)
 | 
				
			||||||
 | 
					        return IOS_EOF;
 | 
				
			||||||
 | 
					    c0 = (char)c;
 | 
				
			||||||
 | 
					    sz = u8_seqlen(&c0)-1;
 | 
				
			||||||
 | 
					    if (sz == 0) {
 | 
				
			||||||
 | 
					        *pwc = (uint32_t)c0;
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    if (ios_readprep(s, sz) < sz)
 | 
				
			||||||
 | 
					        return IOS_EOF;
 | 
				
			||||||
 | 
					    size_t i = s->bpos;
 | 
				
			||||||
 | 
					    *pwc = u8_nextchar(s->buf, &i);
 | 
				
			||||||
 | 
					    return 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int ios_pututf8(ios_t *s, uint32_t wc)
 | 
					int ios_pututf8(ios_t *s, uint32_t wc)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    char buf[8];
 | 
					    char buf[8];
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,6 +110,7 @@ void hexdump(ios_t *dest, char *buffer, size_t len, size_t startoffs);
 | 
				
			||||||
/* high-level stream functions - input */
 | 
					/* high-level stream functions - input */
 | 
				
			||||||
int ios_getnum(ios_t *s, char *data, uint32_t type);
 | 
					int ios_getnum(ios_t *s, char *data, uint32_t type);
 | 
				
			||||||
int ios_getutf8(ios_t *s, uint32_t *pwc);
 | 
					int ios_getutf8(ios_t *s, uint32_t *pwc);
 | 
				
			||||||
 | 
					int ios_peekutf8(ios_t *s, uint32_t *pwc);
 | 
				
			||||||
int ios_ungetutf8(ios_t *s, uint32_t wc);
 | 
					int ios_ungetutf8(ios_t *s, uint32_t wc);
 | 
				
			||||||
int ios_getstringz(ios_t *dest, ios_t *src);
 | 
					int ios_getstringz(ios_t *dest, ios_t *src);
 | 
				
			||||||
int ios_getstringn(ios_t *dest, ios_t *src, size_t nchars);
 | 
					int ios_getstringn(ios_t *dest, ios_t *src, size_t nchars);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue