History

remove aa_readfp and simplify reading

Sigrid Haflínudóttir committed 6 years ago

Commit a5cbab71 parent 2362b063 files · +22 −39Browse files

Unified · Split

3 files
  1. aa.c +20 −36
  2. aa.h +1 −2
  3. repl.c +1 −1
aa.c+20−36
@@ -589,7 +589,7 @@ aa_set(aaContext *ctx, aaObject *sym, aaObject *v) · 588 unmodified lines
589}589}
590 590
591static aaObject *591static aaObject *
592read_(aaContext *ctx, aaReadFn fn, void *udata)592read_(aaContext *ctx, Biobuf *fp)
593{593{
594 const char *delimiter = " \n\t\r();";594 const char *delimiter = " \n\t\r();";
595 aaObject *v, *res, **tail;595 aaObject *v, *res, **tail;
@@ -598,21 +598,21 @@ read_(aaContext *ctx, aaReadFn fn, void *udata) · 2 unmodified lines
598 char buf[64], *p;598 char buf[64], *p;
599 599
600 /* get next character */600 /* get next character */
601 chr = ctx->nextchr ? ctx->nextchr : fn(ctx, udata);601 chr = ctx->nextchr ? ctx->nextchr : Bgetc(fp);
602 ctx->nextchr = '\0';602 ctx->nextchr = '\0';
603 603
604 /* skip whitespace */604 /* skip whitespace */
605 while(chr && strchr(" \n\t\r", chr))605 while(chr > 0 && strchr(" \n\t\r", chr))
606 chr = fn(ctx, udata);606 chr = Bgetc(fp);
607 607
608 switch(chr){608 if(chr <= 0)
609 case 0:
610 return nil;609 return nil;
611 610
611 switch(chr){
612 case ';':612 case ';':
613 while(chr && chr != '\n')613 while(chr > 0 && chr != '\n')
614 chr = fn(ctx, udata);614 chr = Bgetc(fp);
615 return read_(ctx, fn, udata);615 return read_(ctx, fp);
616 616
617 case ')':617 case ')':
618 return &rparen;618 return &rparen;
@@ -622,12 +622,12 @@ read_(aaContext *ctx, aaReadFn fn, void *udata) · 3 unmodified lines
622 tail = &res;622 tail = &res;
623 gc = aa_savegc(ctx);623 gc = aa_savegc(ctx);
624 aa_pushgc(ctx, res); /* to cause error on too-deep nesting */624 aa_pushgc(ctx, res); /* to cause error on too-deep nesting */
625 while((v = read_(ctx, fn, udata)) != &rparen){625 while((v = read_(ctx, fp)) != &rparen){
626 if(v == nil)626 if(v == nil)
627 aa_error(ctx, "unclosed list");627 aa_error(ctx, "unclosed list");
628 if(TYPE(v) == AA_TSYMBOL && streq(CAR(CDR(v)), ".")){628 if(TYPE(v) == AA_TSYMBOL && streq(CAR(CDR(v)), ".")){
629 /* dotted pair */629 /* dotted pair */
630 *tail = aa_read(ctx, fn, udata);630 *tail = aa_read(ctx, fp);
631 }else{631 }else{
632 /* proper pair */632 /* proper pair */
633 *tail = aa_cons(ctx, v, &Null);633 *tail = aa_cons(ctx, v, &Null);
@@ -639,7 +639,7 @@ read_(aaContext *ctx, aaReadFn fn, void *udata) · 5 unmodified lines
639 return res;639 return res;
640 640
641 case '\'':641 case '\'':
642 v = aa_read(ctx, fn, udata);642 v = aa_read(ctx, fp);
643 if(!v)643 if(!v)
644 aa_error(ctx, "stray '''");644 aa_error(ctx, "stray '''");
645 return aa_cons(ctx, aa_symbol(ctx, "quote"), aa_cons(ctx, v, &Null));645 return aa_cons(ctx, aa_symbol(ctx, "quote"), aa_cons(ctx, v, &Null));
@@ -647,11 +647,11 @@ read_(aaContext *ctx, aaReadFn fn, void *udata) · 1 unmodified line
647 case '"':647 case '"':
648 res = buildstring(ctx, nil, '\0');648 res = buildstring(ctx, nil, '\0');
649 v = res;649 v = res;
650 for(chr = fn(ctx, udata); chr != '"'; chr = fn(ctx, udata)){650 for(chr = Bgetc(fp); chr != '"'; chr = Bgetc(fp)){
651 if(chr == 0)651 if(chr <= 0)
652 aa_error(ctx, "unclosed string");652 aa_error(ctx, "unclosed string");
653 if(chr == '\\'){653 if(chr == '\\'){
654 chr = fn(ctx, udata);654 chr = Bgetc(fp);
655 if(strchr("nrt", chr))655 if(strchr("nrt", chr))
656 chr = strchr("n\nr\rt\t", chr)[1];656 chr = strchr("n\nr\rt\t", chr)[1];
657 }657 }
@@ -665,8 +665,8 @@ read_(aaContext *ctx, aaReadFn fn, void *udata) · 7 unmodified lines
665 if(p == buf + sizeof(buf) - 1)665 if(p == buf + sizeof(buf) - 1)
666 aa_error(ctx, "symbol too long");666 aa_error(ctx, "symbol too long");
667 *p++ = chr;667 *p++ = chr;
668 chr = fn(ctx, udata);668 chr = Bgetc(fp);
669 }while(chr && !strchr(delimiter, chr));669 }while(chr > 0 && !strchr(delimiter, chr));
670 *p = '\0';670 *p = '\0';
671 ctx->nextchr = chr;671 ctx->nextchr = chr;
672 n.r = strtod(buf, &p); /* try to read as number */672 n.r = strtod(buf, &p); /* try to read as number */
@@ -677,9 +677,9 @@ read_(aaContext *ctx, aaReadFn fn, void *udata) · 4 unmodified lines
677}677}
678 678
679aaObject *679aaObject *
680aa_read(aaContext *ctx, aaReadFn fn, void *udata)680aa_read(aaContext *ctx, Biobuf *fp)
681{681{
682 aaObject *obj = read_(ctx, fn, udata);682 aaObject *obj = read_(ctx, fp);
683 683
684 if(obj == &rparen)684 if(obj == &rparen)
685 aa_error(ctx, "stray ')'");685 aa_error(ctx, "stray ')'");
@@ -687,22 +687,6 @@ aa_read(aaContext *ctx, aaReadFn fn, void *udata) · 1 unmodified line
687 return obj;687 return obj;
688}688}
689 689
690static char
691readbio(aaContext *ctx, void *udata)
692{
693 int chr;
694
695 USED(ctx);
696
697 return (chr = Bgetc(udata)) < 0 ? 0 : chr;
698}
699
700aaObject *
701aa_readfp(aaContext *ctx, Biobuf *fp)
702{
703 return aa_read(ctx, readbio, fp);
704}
705
706static aaObject *690static aaObject *
707evallist(aaContext *ctx, aaObject *lst, aaObject *env)691evallist(aaContext *ctx, aaObject *lst, aaObject *env)
708{692{
@@ -1069,7 +1053,7 @@ aa_open(void *ptr, int size, int flags) · 360 unmodified lines
1069 Binits(&b, -1, OREAD, (uchar*)prelude, i);1053 Binits(&b, -1, OREAD, (uchar*)prelude, i);
1070 b.icount = -i;1054 b.icount = -i;
1071 Biofn(&b, eof);1055 Biofn(&b, eof);
1072 while((v = aa_readfp(ctx, &b)) != nil){1056 while((v = aa_read(ctx, &b)) != nil){
1073 aa_eval(ctx, v);1057 aa_eval(ctx, v);
1074 aa_restoregc(ctx, save);1058 aa_restoregc(ctx, save);
1075 }1059 }
aa.h+1−2
@@ -99,6 +99,5 @@ aaObject *aa_cdr(aaContext *ctx, aaObject *obj); · 98 unmodified lines
99aaNumber aa_tonumber(aaContext *ctx, aaObject *obj);99aaNumber aa_tonumber(aaContext *ctx, aaObject *obj);
100void *aa_toptr(aaContext *ctx, aaObject *obj);100void *aa_toptr(aaContext *ctx, aaObject *obj);
101void aa_set(aaContext *ctx, aaObject *sym, aaObject *v);101void aa_set(aaContext *ctx, aaObject *sym, aaObject *v);
102aaObject *aa_read(aaContext *ctx, aaReadFn fn, void *udata);102aaObject *aa_read(aaContext *ctx, Biobuf *fp);
103aaObject *aa_readfp(aaContext *ctx, Biobuf *fp);
104aaObject *aa_eval(aaContext *ctx, aaObject *obj);103aaObject *aa_eval(aaContext *ctx, aaObject *obj);
repl.c+1−1
@@ -63,7 +63,7 @@ main(int argc, char **argv) · 62 unmodified lines
63 Bflush(ctx->fd[2]);63 Bflush(ctx->fd[2]);
64 Bflush(ctx->fd[1]);64 Bflush(ctx->fd[1]);
65 }65 }
66 if((obj = aa_readfp(ctx, fp)) == nil)66 if((obj = aa_read(ctx, fp)) == nil)
67 break;67 break;
68 obj = aa_eval(ctx, obj);68 obj = aa_eval(ctx, obj);
69 if(fp->fid == 0)69 if(fp->fid == 0)

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t