home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 19
/
CD_ASCQ_19_010295.iso
/
dos
/
prg
/
pas
/
ktools
/
source
/
ofwrite.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-09-17
|
6KB
|
208 lines
Unit OFWrite;
{ objet fichier *.WRI produit par Write pour Windows }
{ KOSTRZEWA Bruno août 1994 }
INTERFACE
Uses OBinFile,
OTableau;
Const
{ erreurs détectées }
erTableau = $101;
erFormat = $102;
{ largeur d'une ligne affichable (modifiable) }
LargeurLigne:Byte = 76;
Type
PWriFile = ^TWriFile;
TWriFile = object(TBinFile)
PosDeb : LongInt;
PosFin : LongInt;
TabLigne : TTableau;
Constructor Init(NomDeFichier:String);
Destructor Done; virtual;
Function GetErrorMsg:String; virtual;
Function PosLigne(n:Integer):LongInt;
Function DonneLigne(n:Integer):String;
Function NumLigne(p:LongInt):Integer;
End;
IMPLEMENTATION
{ objet TWriFile }
Constructor TWriFile.Init(NomDeFichier:String);
{ ouverture du fichier et initialisations }
Var t:Word;
Begin
{ ouverture du fichier }
TBinFile.Init(NomDeFichier,16*1024);
if IsValid
then begin { test de validité du format }
ReadVar(t,sizeof(Word));
if not((t=$BE31) or (t=$BE32))
then ErrorFlag:=erFormat;
end;
{ création du tableau des débuts de ligne }
TabLigne.Init(50,50,sizeof(LongInt));
if not TabLigne.IsValid
then ErrorFlag:=erTableau;
if not IsValid then exit;
{ enregistrement du début du texte }
PosDeb:=128;
TabLigne.Ajouter(PosDeb);
{ lecture de la fin du texte }
SetFilePosit(14);
ReadVar(PosFin,sizeof(longint));
End;
Destructor TWriFile.Done;
{ libération mémoire et fermeture du fichier }
Begin
TabLigne.Done;
TBinFile.Done;
End;
Function TWriFile.GetErrorMsg:String;
{ messages d'erreur }
Begin
case ErrorFlag of
erTableau : GetErrorMsg:=TabLigne.GetErrorMsg;
erFormat : GetErrorMsg:='Format du fichier non reconnu.';
else GetErrorMsg:=TBinFile.GetErrorMsg;
end;
End;
Function TWriFile.PosLigne(n:Integer):LongInt;
{ recherche de la position du début de la ligne n }
{ et sauvegarde dans le tableau TabLigne }
Var S:String;
p,l:LongInt;
i:Byte;
ok:Boolean;
Begin
{ si la position a déjà été calculée, on lit le tableau }
if n<=TabLigne.NombreItems
then begin
TabLigne.Lire(p,n);
PosLigne:=p;
exit;
end;
{ sinon on cherche à partir de la dernière position calculée }
ok:=false;
while not ok do
begin
{ lire la dernière position calculée }
TabLigne.Lire(p,TabLigne.NombreItems);
if p>=PosFin { on est à la fin du texte, on stoppe }
then begin
PosLigne:=PosFin;
exit;
end;
{ on se place au début de la ligne }
SetFilePosit(p);
{ on lit le nombre d'octets nécessaires pour une ligne complète }
ReadVar(S[1],LargeurLigne);
S[0]:=chr(LargeurLigne);
{ on cherche une fin de paragraphe }
i:=pos(#13#10,S);
if i<>0
then p:=p+i+1 { fin de paragraphe trouvée = début ligne suivante }
else begin { fin de paragraphe non trouvée }
{ on cherche la présence d'un objet image }
i:=pos(#$E4#0#0#0,S);
if i<>0
then begin { début d'image trouvé }
if i<>1 { l'image est-elle en début de ligne ? }
then p:=p+i-1 { non, elle est le nouveau début }
else begin { oui, on cherche sa fin }
{ lire taille image }
SetFilePosit(p+16);
ReadVar(l,sizeof(LongInt));
{ position de la nouvelle ligne }
p:=p+l+40;
end;
end
else begin { pas d'image en vue }
{ pour ne pas couper un mot on cherche un espace }
i:=LargeurLigne;
while (i>0) and (S[i]<>' ') do dec(i);
if i>0 then p:=p+i
else p:=p+LargeurLigne;
end;
end;
{ ramener p à l'intérieur du texte si nécessaire }
if p>PosFin
then p:=PosFin;
{ inscrire le résultat dans le tableau }
TabLigne.Ajouter(p);
{ a-t-on atteint le numéro cherché ? }
if TabLigne.NombreItems=n
then begin
PosLigne:=p;
ok:=true;
end;
end;
End;
Function TWriFile.NumLigne(p:LongInt):Integer;
{ recherche du numéro de la ligne contenant l'adresse p }
Var n:Integer;
r:LongInt;
Begin
{ si p trop petit on est à la première ligne }
if p<=PosDeb
then begin
NumLigne:=1;
exit;
end;
{ si p trop grand on le ramène à la fin du texte }
if p>PosFin
then p:=PosFin;
{ on commence à la ligne 1 }
n:=1;
r:=PosLigne(1);
{ on cherche le premier début de ligne supérieur ou égal à p }
while r<p do
begin
inc(n);
r:=PosLigne(n);
end;
{ on en déduit le numéro de ligne }
if r=p
then NumLigne:=n
else NumLigne:=n-1;
End;
Function TWriFile.DonneLigne(n:Integer):String;
{ recherche du contenu de la ligne n }
Var S:String;
p1,p2:LongInt;
Begin
{ calcul du début de la ligne et du début de la ligne suivante }
p1:=PosLigne(n);
p2:=PosLigne(n+1);
if (p1=PosFin) or (p1>=p2)
then S:='' { fin de texte atteinte }
else begin
if p2-p1>largeurligne+2 { test image }
then S:='[Objet non reproductible]' { on a une image }
else begin
{ lecture de la ligne }
SetFilePosit(p1);
ReadVar(S[1],p2-p1);
S[0]:=chr(p2-p1);
{ suppression des marques de fin de paragraphe }
if S[length(S)]=#10
then dec(S[0],2);
end;
end;
DonneLigne:=S;
End;
END.
{ Fin du fichier OFWRITE.PAS }