Skip to content

Commit abfa0a7

Browse files
authored
Merge pull request #342 from Affonso-Gui/read_cond
Raise less errors on read_cond
2 parents 62fec65 + c760c01 commit abfa0a7

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

lisp/c/reader.c

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ static char *rcsid="@(#)$Id$";
2626

2727
#define syntaxtype(ch) ((enum ch_type)(current_syntax[thr_self()][ch]))
2828

29+
int read_suppress = FALSE;
30+
2931
extern pointer FEATURES,READBASE,QREADTABLE;
3032
extern pointer QNOT, QAND, QOR; /*eval_read_cond, Jan/1995*/
3133

@@ -238,7 +240,8 @@ static pointer readlabdef(ctx,f,labx)
238240
context *ctx;
239241
pointer f; /*stream*/
240242
eusinteger_t labx;
241-
{ pointer unsol, *unsolp, result,newlab;
243+
{ if (read_suppress) return(read1(ctx,f));
244+
pointer unsol, *unsolp, result,newlab;
242245

243246
if (findlabel(labx)!=NIL) error(E_READLABEL,makeint(labx)); /*already defined*/
244247
newlab=(pointer)makelabref(makeint(labx),UNBOUND,oblabels[thr_self()]->c.lab.next);
@@ -279,7 +282,8 @@ static pointer readlabref(ctx,f,val,subchar)
279282
pointer f;
280283
eusinteger_t val;
281284
int subchar;
282-
{ register pointer obj,element;
285+
{ if (read_suppress) return(NIL);
286+
register pointer obj,element;
283287
obj=findlabel(val);
284288
if (obj==NIL) error(E_READLABEL,makeint(val)); /*undefined label*/
285289
if ((element=obj->c.lab.value)==UNBOUND) return(obj);
@@ -298,7 +302,7 @@ register int size;
298302
register int i=0;
299303
Char ch;
300304
ch=nextch(ctx,f);
301-
if (size>0) {
305+
if (size>0 && !read_suppress) {
302306
result=makevector(C_VECTOR,size);
303307
vpush(result);
304308
while ((ch!=')') && (ch!=EOF) && (i<size)) {
@@ -421,7 +425,8 @@ register pointer s; /*input stream*/
421425
static pointer readstructure(ctx,s)
422426
register context *ctx;
423427
register pointer s; /*input stream*/
424-
{ register pointer name, klass, slot, elem, result, varvec, *slotp;
428+
{ if (read_suppress) return(read1(ctx,s));
429+
register pointer name, klass, slot, elem, result, varvec, *slotp;
425430
Char ch;
426431

427432
ch=nextch(ctx,s);
@@ -519,7 +524,8 @@ register context *ctx;
519524
pointer f;
520525
eusinteger_t val;
521526
int subchar;
522-
{ register int i=0;
527+
{ if (read_suppress) return(read1(ctx,f));
528+
register int i=0;
523529
char buf[WORD_SIZE/2], ch;
524530
ch=readch(f); val=0;
525531
while (i<WORD_SIZE/2 && ch>='0' && ch<'8') { buf[i++] = ch; ch=readch(f);}
@@ -554,6 +560,7 @@ pointer f;
554560
{ pointer p;
555561
p=read1(ctx,f);
556562
/* if (debug) prinx(ctx,p,Spevalof(QSTDOUT)); */
563+
if (read_suppress) return(UNBOUND);
557564
return(eval(ctx,p));}
558565

559566
static pointer eval_read_cond(ctx,expr)
@@ -587,8 +594,10 @@ register pointer f;
587594
{ register pointer flag,result;
588595
flag=read1(ctx,f);
589596
vpush(flag);
590-
result=read1(ctx,f);
591-
if (eval_read_cond(ctx,flag)==NIL) result=(pointer)UNBOUND;
597+
if (eval_read_cond(ctx,flag)==NIL) {
598+
read_suppress=TRUE; read1(ctx,f);
599+
result=(pointer)UNBOUND;}
600+
else result=read1(ctx,f);
592601
vpop();
593602
return(result);}
594603

@@ -598,8 +607,10 @@ register pointer f;
598607
{ register pointer flag,result;
599608
flag=read1(ctx,f);
600609
vpush(flag);
601-
result=read1(ctx,f);
602-
if (eval_read_cond(ctx,flag)!=NIL) result=(pointer)UNBOUND;
610+
if (eval_read_cond(ctx,flag)!=NIL) {
611+
read_suppress=TRUE; read1(ctx,f);
612+
result=(pointer)UNBOUND;}
613+
else result=read1(ctx,f);
603614
vpop();
604615
return(result);}
605616

@@ -638,7 +649,9 @@ char token[];
638649
if (ch==EOF) return(UNBOUND);}
639650
subchar=to_upper(ch);
640651
macrofunc=Spevalof(QREADTABLE)->c.rdtab.dispatch->c.vec.v[subchar];
641-
if (macrofunc==NIL) error(E_USER,(pointer)"no # macro defined");
652+
if (macrofunc==NIL) {
653+
if (read_suppress) return(read1(ctx,f));
654+
error(E_USER,(pointer)"no # macro defined");}
642655
if (isint(macrofunc)) { /*internal macro*/
643656
intmac=(pointer (*)())(intval(macrofunc));
644657
result=(*intmac)(ctx,f,val,subchar,token);}
@@ -693,6 +706,7 @@ char token[];
693706
doublecolon=0;
694707
pkg=(pointer)searchpkg((byte *)token,colon);}
695708
if (pkg==(pointer)NULL) {
709+
if (read_suppress) return(NIL);
696710
if (doublecolon) colon--;
697711
pkgstr=makestring(token,colon);
698712
vpush(pkgstr);
@@ -1014,6 +1028,7 @@ register context *ctx;
10141028
register pointer f,recursivep;
10151029
{ register pointer val;
10161030
Char ch;
1031+
read_suppress=FALSE;
10171032
current_syntax[thr_self()]=Spevalof(QREADTABLE)->c.rdtab.syntax->c.str.chars;
10181033
ch=nextch(ctx,f);
10191034
if (ch==EOF) return((pointer)EOF);

0 commit comments

Comments
 (0)