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 >
Pascal/Delphi Source File  |  1994-09-17  |  6KB  |  208 lines

  1. Unit OFWrite;
  2. { objet fichier *.WRI produit par Write pour Windows }
  3. { KOSTRZEWA Bruno août 1994 }
  4.  
  5. INTERFACE
  6.  
  7. Uses OBinFile,
  8.      OTableau;
  9.  
  10. Const
  11.  { erreurs détectées }
  12.  erTableau    = $101;
  13.  erFormat     = $102;
  14.  
  15.  { largeur d'une ligne affichable (modifiable) }
  16.  LargeurLigne:Byte = 76;
  17.  
  18. Type
  19.  PWriFile = ^TWriFile;
  20.  TWriFile = object(TBinFile)
  21.     PosDeb   : LongInt;
  22.     PosFin   : LongInt;
  23.     TabLigne : TTableau;
  24.     Constructor Init(NomDeFichier:String);
  25.     Destructor Done;                           virtual;
  26.     Function  GetErrorMsg:String;              virtual;
  27.     Function  PosLigne(n:Integer):LongInt;
  28.     Function  DonneLigne(n:Integer):String;
  29.     Function  NumLigne(p:LongInt):Integer;
  30.     End;
  31.  
  32. IMPLEMENTATION
  33.  
  34. { objet TWriFile }
  35.  
  36. Constructor TWriFile.Init(NomDeFichier:String);
  37. { ouverture du fichier et initialisations }
  38. Var t:Word;
  39. Begin
  40.  { ouverture du fichier }
  41.  TBinFile.Init(NomDeFichier,16*1024);
  42.  if IsValid
  43.     then begin  { test de validité du format }
  44.           ReadVar(t,sizeof(Word));
  45.           if not((t=$BE31) or (t=$BE32))
  46.              then ErrorFlag:=erFormat;
  47.          end;
  48.  { création du tableau des débuts de ligne }
  49.  TabLigne.Init(50,50,sizeof(LongInt));
  50.  if not TabLigne.IsValid
  51.     then ErrorFlag:=erTableau;
  52.  if not IsValid then exit;
  53.  { enregistrement du début du texte }
  54.  PosDeb:=128;
  55.  TabLigne.Ajouter(PosDeb);
  56.  { lecture de la fin du texte }
  57.  SetFilePosit(14);
  58.  ReadVar(PosFin,sizeof(longint));
  59. End;
  60.  
  61. Destructor TWriFile.Done;
  62. { libération mémoire et fermeture du fichier }
  63. Begin
  64.  TabLigne.Done;
  65.  TBinFile.Done;
  66. End;
  67.  
  68. Function TWriFile.GetErrorMsg:String;
  69. { messages d'erreur }
  70. Begin
  71.  case ErrorFlag of
  72.   erTableau : GetErrorMsg:=TabLigne.GetErrorMsg;
  73.   erFormat  : GetErrorMsg:='Format du fichier non reconnu.';
  74.   else GetErrorMsg:=TBinFile.GetErrorMsg;
  75.   end;
  76. End;
  77.  
  78. Function TWriFile.PosLigne(n:Integer):LongInt;
  79. { recherche de la position du début de la ligne n }
  80. { et sauvegarde dans le tableau TabLigne }
  81. Var S:String;
  82.     p,l:LongInt;
  83.     i:Byte;
  84.     ok:Boolean;
  85. Begin
  86.  { si la position a déjà été calculée, on lit le tableau }
  87.  if n<=TabLigne.NombreItems
  88.     then begin
  89.           TabLigne.Lire(p,n);
  90.           PosLigne:=p;
  91.           exit;
  92.          end;
  93.  { sinon on cherche à partir de la dernière position calculée }
  94.  ok:=false;
  95.  while not ok do
  96.   begin
  97.    { lire la dernière position calculée }
  98.    TabLigne.Lire(p,TabLigne.NombreItems);
  99.    if p>=PosFin  { on est à la fin du texte, on stoppe }
  100.       then begin
  101.             PosLigne:=PosFin;
  102.             exit;
  103.            end;
  104.    { on se place au début de la ligne }
  105.    SetFilePosit(p);
  106.    { on lit le nombre d'octets nécessaires pour une ligne complète }
  107.    ReadVar(S[1],LargeurLigne);
  108.    S[0]:=chr(LargeurLigne);
  109.    { on cherche une fin de paragraphe }
  110.    i:=pos(#13#10,S);
  111.    if i<>0
  112.        then p:=p+i+1  { fin de paragraphe trouvée = début ligne suivante }
  113.        else begin     { fin de paragraphe non trouvée }
  114.              { on cherche la présence d'un objet image }
  115.              i:=pos(#$E4#0#0#0,S);
  116.              if i<>0
  117.                 then begin { début d'image trouvé }
  118.                       if i<>1  { l'image est-elle en début de ligne ? }
  119.                          then p:=p+i-1  { non, elle est le nouveau début }
  120.                          else begin     { oui, on cherche sa fin }
  121.                                { lire taille image }
  122.                                SetFilePosit(p+16);
  123.                                ReadVar(l,sizeof(LongInt));
  124.                                { position de la nouvelle ligne }
  125.                                p:=p+l+40;
  126.                               end;
  127.                      end
  128.                 else begin  { pas d'image en vue }
  129.                       { pour ne pas couper un mot on cherche un espace }
  130.                       i:=LargeurLigne;
  131.                       while (i>0) and (S[i]<>' ') do dec(i);
  132.                       if i>0 then p:=p+i
  133.                              else p:=p+LargeurLigne;
  134.                      end;
  135.             end;
  136.     { ramener p à l'intérieur du texte si nécessaire }
  137.     if p>PosFin
  138.        then p:=PosFin;
  139.     { inscrire le résultat dans le tableau }
  140.     TabLigne.Ajouter(p);
  141.     { a-t-on atteint le numéro cherché ? }
  142.     if TabLigne.NombreItems=n
  143.        then begin
  144.              PosLigne:=p;
  145.              ok:=true;
  146.             end;
  147.    end;
  148. End;
  149.  
  150. Function  TWriFile.NumLigne(p:LongInt):Integer;
  151. { recherche du numéro de la ligne contenant l'adresse p }
  152. Var n:Integer;
  153.     r:LongInt;
  154. Begin
  155.  { si p trop petit on est à la première ligne }
  156.  if p<=PosDeb
  157.     then begin
  158.           NumLigne:=1;
  159.           exit;
  160.          end;
  161.  { si p trop grand on le ramène à la fin du texte }
  162.  if p>PosFin
  163.     then p:=PosFin;
  164.  { on commence à la ligne 1 }
  165.  n:=1;
  166.  r:=PosLigne(1);
  167.  { on cherche le premier début de ligne supérieur ou égal à p }
  168.  while r<p do
  169.   begin
  170.    inc(n);
  171.    r:=PosLigne(n);
  172.   end;
  173.  { on en déduit le numéro de ligne }
  174.  if r=p
  175.     then NumLigne:=n
  176.     else NumLigne:=n-1;
  177. End;
  178.  
  179. Function TWriFile.DonneLigne(n:Integer):String;
  180. { recherche du contenu de la ligne n }
  181. Var S:String;
  182.     p1,p2:LongInt;
  183. Begin
  184.  { calcul du début de la ligne et du début de la ligne suivante }
  185.  p1:=PosLigne(n);
  186.  p2:=PosLigne(n+1);
  187.  if (p1=PosFin) or (p1>=p2)
  188.     then S:=''  { fin de texte atteinte }
  189.     else begin
  190.           if p2-p1>largeurligne+2  { test image }
  191.              then S:='[Objet non reproductible]' { on a une image }
  192.              else begin
  193.                    { lecture de la ligne }
  194.                    SetFilePosit(p1);
  195.                    ReadVar(S[1],p2-p1);
  196.                    S[0]:=chr(p2-p1);
  197.                    { suppression des marques de fin de paragraphe }
  198.                    if S[length(S)]=#10
  199.                       then dec(S[0],2);
  200.                   end;
  201.          end;
  202.  DonneLigne:=S;
  203. End;
  204.  
  205. END.
  206.  
  207. {                        Fin du fichier OFWRITE.PAS                         }
  208.