From 89b4f093f98040f311f9581560d7254b14faa091 Mon Sep 17 00:00:00 2001 From: Simon Brooke <simon@journeyman.cc> Date: Sun, 15 Oct 2017 15:14:34 +0100 Subject: [PATCH] Fixed bug which caused reader to infinite loop if symbol contained non-alnum. --- src/init.c | 3 +++ src/read.c | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/init.c b/src/init.c index d39e707..ac811c3 100644 --- a/src/init.c +++ b/src/init.c @@ -89,8 +89,11 @@ int main( int argc, char *argv[] ) { bind_function( "type", &lisp_type ); bind_function( "add", &lisp_add ); + bind_function( "+", &lisp_add ); bind_function( "multiply", &lisp_multiply ); + bind_function( "*", &lisp_multiply ); bind_function( "subtract", &lisp_subtract ); + bind_function( "-", &lisp_subtract ); /* * primitive special forms diff --git a/src/read.c b/src/read.c index 92f9f52..08e37f1 100644 --- a/src/read.c +++ b/src/read.c @@ -20,6 +20,7 @@ #include "consspaceobject.h" #include "integer.h" #include "intern.h" +#include "print.h" #include "read.h" #include "real.h" @@ -194,7 +195,7 @@ struct cons_pointer read_symbol( FILE * input, wint_t initial ) { ungetwc( initial, input ); break; default: - if ( iswalnum( initial ) ) { + if ( iswprint( initial ) && ! iswblank( initial ) ) { result = make_symbol( initial, read_symbol( input, fgetwc( input ) ) ); } else { @@ -206,6 +207,10 @@ struct cons_pointer read_symbol( FILE * input, wint_t initial ) { } break; } + + fputws(L"Read symbol '", stderr); + print(stderr, result); + fputws(L"'\n", stderr); return result; }