home *** CD-ROM | disk | FTP | other *** search
- {$R-,S-,I-,D-,V-,B-,N-,L- }
- {$O+}
-
- unit textret;
-
-
- {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
-
- interface
-
- uses gentypes,gensubs,subs1;
-
- {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
-
-
- Procedure reloadtext (sector:integer; VAR q:message);
- Procedure deletetext (sector:integer);
- Function maketext (VAR q:message):integer;
- Function copytext (sector:integer):integer;
- Procedure printtext (sector:integer);
-
-
- {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
-
- implementation
-
- {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
-
-
- Procedure reloadtext (sector:integer; VAR q:message);
- VAR k:char;
- sectorptr,tmp,n:integer;
- buff:buffer;
- x:boolean;
-
- Procedure setbam (sector,val:integer);
- begin
- seek (mapfile,sector);
- write (mapfile,val)
- end;
-
- Procedure chk;
- begin
- iocode:=ioresult;
- if iocode<>0 then writeln (usr,'(Error ',iocode,' reading message)')
- end;
-
- begin
- sectorptr:=32767;
- n:=1;
- q.text[1]:='';
- repeat
- if sectorptr>sectorsize then begin
- if sector<0 then exit;
- seek (tfile,sector); chk;
- read (tfile,buff); chk;
- seek (mapfile,sector); chk;
- read (mapfile,tmp); chk;
- if tmp=-2 then begin
- tmp:=-1;
- seek (mapfile,sector); chk;
- write (mapfile,tmp); chk;
- end;
- sector:=tmp;
- sectorptr:=1
- end;
- k:=buff[sectorptr];
- case k of
- #0,#10:;
- #13:if n>=maxmessagesize
- then k:=#0
- else begin
- n:=n+1;
- q.text[n]:=''
- end
- else q.text[n]:=q.text[n]+k
- end;
- sectorptr:=sectorptr+1
- until k=#0;
- q.numlines:=n;
- chk
- end;
-
- Procedure deletetext (sector:integer);
- VAR next:integer;
-
- Procedure setbam (sector,val:integer);
- begin
- seek (mapfile,sector);
- write (mapfile,val)
- end;
-
- begin
- while sector>=0 do begin
- seek (mapfile,sector);
- read (mapfile,next);
- setbam (sector,-2);
- sector:=next
- end
- end;
-
- Function maketext (VAR q:message):integer;
- VAR line,pos,sector,prev:integer;
- bufptr:integer;
- curline:anystr;
- k:char;
- buff:buffer;
-
- Procedure setbam (sector,val:integer);
- begin
- seek (mapfile,sector);
- write (mapfile,val)
- end;
-
- Function nextblank (first:integer; linkit:boolean):integer;
- VAR cnt,i,blank:integer;
- begin
- nextblank:=-1;
- if first<-1 then first:=-1;
- if first>=numsectors then exit;
- seek (mapfile,first+1);
- for cnt:=first+1 to numsectors do begin
- read (mapfile,i);
- if i=-2 then begin
- blank:=cnt;
- if (first>=0) and linkit then setbam (first,blank);
- nextblank:=blank;
- exit
- end
- end
- end;
-
- Function firstblank:integer;
- begin
- firstblank:=nextblank (-1,false)
- end;
-
- Procedure ensuretfilesize (sector:integer);
- VAR cnt:integer;
- buff:buffer;
- begin
- if sector<filesize(tfile) then exit;
- if (sector<0) or (sector>numsectors) then exit;
- fillchar (buff,sizeof(buff),'*');
- seek (tfile,filesize(tfile));
- for cnt:=filesize(tfile) to sector do write (tfile,buff);
- fillchar (buff,sizeof(buff),'!')
- end;
-
- Procedure writesector (sector:integer; VAR q:buffer);
- VAR n:integer;
- begin
- if (sector<0) or (sector>numsectors) then exit;
- seek (mapfile,sector);
- read (mapfile,n);
- if n<>-2 then begin
- error ('Overwrite error sector=%1!','',strr(sector));
- exit
- end;
- ensuretfilesize (sector);
- seek (tfile,sector);
- write (tfile,q)
- end;
-
- Procedure flushbuf;
- begin
- writesector (sector,buff);
- prev:=sector;
- sector:=nextblank(prev,true);
- bufptr:=1;
- end;
-
- Procedure outofroom;
- begin
- writeln (^B'Sorry, out of room!');
- maketext:=-1
- end;
-
- begin
- if q.numlines=0 then begin
- writeln (^B'Message blank!');
- maketext:=-1;
- exit
- end;
- if firstfree>=0 then begin
- sector:=firstfree;
- seek (mapfile,sector);
- read (mapfile,prev)
- end else prev:=-1;
- if prev<>-2 then begin
- firstfree:=firstblank;
- sector:=firstfree
- end;
- maketext:=sector;
- if sector=-1 then begin
- outofroom;
- exit
- end;
- bufptr:=1;
- for line:=1 to q.numlines do begin
- curline:=q.text[line]+^M;
- if line=q.numlines then curline:=curline+chr(0);
- for pos:=1 to length(curline) do begin
- k:=curline[pos];
- buff[bufptr]:=k;
- bufptr:=bufptr+1;
- if bufptr>sectorsize then begin
- flushbuf;
- if sector=-1 then begin
- outofroom;
- exit
- end
- end
- end
- end;
- if bufptr>1 then flushbuf;
- setbam (prev,-1);
- firstfree:=nextblank(firstfree,false);
- if firstfree=-1 then firstfree:=firstblank
- end;
-
- Function copytext (sector:integer):integer;
- VAR me:message;
- begin
- reloadtext (sector,me);
- copytext:=maketext (me)
- end;
-
- Procedure printtext (sector:integer);
- VAR q:message;
- x,b:boolean;
- n:integer;
- begin
- reloadtext (sector,q);
- writeln (^B);
- n:=1;
- repeat
- writeln (q.text[n]);
- n:=n+1
- until break or (n>q.numlines) or hungupon;
- x:=xpressed; b:=break;
- writeln (^B^M);
- xpressed:=x; break:=b
- end;
-
- end.