home *** CD-ROM | disk | FTP | other *** search
- (*******************************************************)
- (* LISPFIO.INC *)
- (* Include-Modul des LittleLisp-Systems *)
- (* (C) 1988 Reinhard Häring & TOOLBOX *)
- (*******************************************************)
-
- {-- Lisp File IO --------------------------}
-
- PROCEDURE read_file(a:objp);
- VAR lfile:TEXT;
- sexpr:lstring;
- name:string20;
-
- PROCEDURE read_sexpr(VAR l:lstring);
- LABEL 99;
- VAR Line,h:lstring;
- kl:INTEGER; strp:BOOLEAN;
-
- FUNCTION count_b(l:lstring):INTEGER;
- VAR i,e:INTEGER;
- BEGIN
- e:=0;
- FOR i:=1 TO Length(l) DO
- IF l[i]='"' THEN strp:= NOT strp
- ELSE IF NOT strp AND (l[i]='(') THEN e:=e+1
- ELSE IF NOT strp AND (l[i]=')') THEN e:=e-1;
- count_b:=e;
- END;
-
- FUNCTION first(a:lstring):CHAR;
- VAR i:INTEGER;
- BEGIN
- i:=1; first:=' ';
- WHILE NOT(i>Length(a)) DO BEGIN
- IF a[i]=' ' THEN
- i:=i+1
- ELSE BEGIN
- first:=a[i]; i:=MaxInt;
- END;
- END;
- END;
-
- BEGIN
- kl:=0; l:=''; strp:=FALSE;
- REPEAT
- REPEAT
- ReadLn(lfile,Line);
- UNTIL first(Line)<>';';
- IF Line<>'' THEN BEGIN
- kl:=kl+count_b(Line); h:=clean(Line);
- IF (Length(l)+1+Length(h))>255 THEN BEGIN
- Write('Too Long:'); WriteLn(l);
- l:='*error*';
- GOTO 99;
- END;
- l:=l+' '+h;
- END;
- UNTIL kl<=0;
- l:=clean(l);
- 99:
- IF strp THEN error('String not closed'+Line);
- IF kl<0 THEN
- error('Too many closing paranthesis '+Line);
- END;
-
- BEGIN
- IF a^.typ=2 THEN name:=a^.a^+'.lsp' ELSE
- name:=a^.s^;
- Assign(lfile,name); ReSet(lfile);
- WHILE NOT Eof(lfile) DO BEGIN
- read_sexpr(sexpr);
- IF sexpr<>'*error*' THEN dummy:=eval(inlist(sexpr),base_env);
- END;
- Close(lfile);
- END;