6 typedef struct Istack Istack;
29 if(istack == nil || istack->name == nil)
31 _nr(L(".F"), istack->name);
32 r = erunestrdup(istack->name);
33 p = runestrchr(r, '.');
63 _inputfile(Rune *s, void (*push)(Istack*))
69 t = esmprint("%S", s);
70 if((b = Bopen(t, OREAD)) == nil){
72 fprint(2, "%s: open %S: %r\n", argv0, s);
76 is = emalloc(sizeof *is);
78 is->name = erunestrdup(s);
85 pushinputfile(Rune *s)
87 return _inputfile(s, ipush);
91 queueinputfile(Rune *s)
93 return _inputfile(s, iqueue);
97 _inputstdin(void (*push)(Istack*))
102 if((b = Bopen("/dev/null", OREAD)) == nil){
103 fprint(2, "%s: open /dev/null: %r\n", argv0);
107 is = emalloc(sizeof *is);
109 is->name = erunestrdup(L("stdin"));
118 return _inputstdin(ipush);
124 return _inputstdin(iqueue);
128 _inputstring(Rune *s, void (*push)(Istack*))
132 is = emalloc(sizeof *is);
133 is->s = erunestrdup(s);
135 is->ep = is->p+runestrlen(is->p);
140 pushinputstring(Rune *s)
142 _inputstring(s, ipush);
147 inputnotify(void (*fn)(void))
162 istack = istack->next;
184 return istack->unget[--istack->nunget];
186 if(istack->p >= istack->ep){
192 if((c = Bgetrune(istack->b)) < 0){
199 sysfatal("getrune - can't happen");
209 if(istack == nil || istack->nunget >= nelem(istack->unget))
210 pushinputstring(L(""));
211 istack->unget[istack->nunget++] = r;
219 for(is=istack; is && !is->b; is=is->next)
222 return fmtprint(f, "%S:%d", is->name, is->lineno);
224 return fmtprint(f, "<no input>");
228 setlinenumber(Rune *s, int n)
232 for(is=istack; is && !is->name; is=is->next)
237 is->name = erunestrdup(s);