home *** CD-ROM | disk | FTP | other *** search
/ ftp.wwiv.com / ftp.wwiv.com.zip / ftp.wwiv.com / pub / MISC / MKDATE12.ZIP / block2.pas next >
Pascal/Delphi Source File  |  2003-06-21  |  4KB  |  220 lines

  1. unit block2;
  2.  
  3. interface
  4.  
  5. uses
  6.  block, sublist, message;
  7.  
  8. var
  9.  headerfpos, msgfpos: longint;
  10.  err: integer;
  11.  
  12.  membroot: treeroottype;
  13.  p: sublistptr;
  14.  
  15. function frecname(p: pointer): string;
  16. procedure ergor(p: pointer);
  17. procedure ergow(p: pointer);
  18. procedure lockclose;
  19. function subopen(a: subfilesset): boolean;
  20. function lockopen: boolean;
  21. procedure error;
  22. procedure err2(bx: byte; a: string);
  23. procedure dserr(x: integer);
  24.  
  25. function blockopen(var q: blockfiletype): boolean;
  26. procedure blockclose(var q: blockfiletype);
  27. function lroot(var q: blockfiletype): longint;
  28.  
  29. implementation
  30.  
  31. uses
  32.  dos;
  33.  
  34. const
  35.  errmode: array[1..2] of string[7] = (
  36.   'reading',
  37.   'writing'
  38.   );
  39.  
  40.  diskerr: array[1..8] of string[19] = (
  41.   'File not found',
  42.   'Path not found',
  43.   'Access denied',
  44.   'Invalid handle',
  45.   'Not enough memory',
  46.   'Invalid environment',
  47.   'Invalid format',
  48.   'No more files'
  49.   );
  50.               
  51. function frecname(p: pointer): string;
  52.  type
  53.   bete = ^filerec;
  54.  var
  55.   q: bete absolute p;
  56.  begin
  57.   frecname := copy(q^.name, 1, pos(#0, q^.name) - 1)
  58.  end;
  59.  
  60. procedure ergor(p: pointer);
  61.  begin
  62.   err := ioresult;
  63.   if (err <> 0) then err2(1, frecname(p))
  64.  end;
  65.  
  66. procedure ergow(p: pointer);
  67.  begin
  68.   err := ioresult;
  69.   if (err <> 0) then err2(2, frecname(p))
  70.  end;
  71.  
  72. procedure lockclose;
  73.  begin
  74.   blockclose(mainsub.headerf);
  75.   blockclose(mainsub.msgf);
  76.   blockclose(mainsub.memberf)
  77.  end;
  78.  
  79. function subopen(a: subfilesset): boolean;
  80.  var
  81.   e: boolean;
  82.   b: pathstr;
  83.  begin
  84.   lockclose;
  85.   mainsub.name := p^.fname;
  86.   e := true;
  87.   b := p^.path + p^.fname;
  88.   if e and (headerf in a) then
  89.    begin
  90.     assign(mainsub.headerf.filevar, b + '.HDR');
  91.     e := blockopen(mainsub.headerf);
  92.     if e then
  93.      begin
  94.       blockread(mainsub.headerf.filevar, mainsub.subinfo, 128);
  95.       err := ioresult;
  96.       e := (err = 0)
  97.      end
  98.    end;
  99.   if e and (msgf in a) then
  100.    begin
  101.     assign(mainsub.msgf.filevar, b + '.MSG');
  102.     e := blockopen(mainsub.msgf)
  103.    end;
  104.   if e and (memberf in a) then
  105.    begin
  106.     assign(mainsub.memberf.filevar, b + '.MBR');
  107.     e := blockopen(mainsub.memberf);
  108.     if e then
  109.      begin
  110.       blockread(mainsub.memberf.filevar, membroot, 12);
  111.       err := ioresult;
  112.       e := (err = 0)
  113.      end
  114.    end;
  115.   subopen := e
  116.  end;
  117.  
  118. function lockopen: boolean;
  119.  var
  120.   t: boolean;
  121.  begin
  122.   if mainsub.memberf.open then t := subopen([headerf, msgf])
  123.   else t := subopen(allfiles);
  124.   if t then
  125.    if (lockfile(mainsub.headerf) and lockfile(mainsub.msgf) and
  126.     (not(mainsub.memberf.open) or lockfile(mainsub.memberf))) then
  127.     begin
  128.      headerfpos := -1;
  129.      msgfpos := -1
  130.     end
  131.    else
  132.     begin
  133.      lockclose;
  134.      t := false
  135.     end;
  136.   lockopen := t
  137.  end;
  138.  
  139. procedure error;
  140.  begin
  141.   lockclose;
  142.   writeln('*** Error from DOS operation ***');
  143.   write(#7);
  144.   halt(1)
  145.  end;
  146.  
  147. procedure err2(bx: byte; a: string);
  148.  begin
  149.   lockclose;
  150.   writeln('*** Error ', errmode[bx], ' file ', a, ' ***');
  151.   write(#7);
  152.   halt(1)
  153.  end;
  154.  
  155. procedure dserr(x: integer);
  156.  begin
  157.   write('DOS error ', x, ': ');
  158.   case x of
  159.     2: writeln(diskerr[1]);
  160.     3: writeln(diskerr[2]);
  161.     5: writeln(diskerr[3]);
  162.     6: writeln(diskerr[4]);
  163.     8: writeln(diskerr[5]);
  164.    10: writeln(diskerr[6]);
  165.    11: writeln(diskerr[7]);
  166.    18: writeln(diskerr[8]);
  167.   else writeln
  168.   end;
  169.   error
  170.  end;
  171.  
  172. function blockopen(var q: blockfiletype): boolean;
  173.  var
  174.   foo: boolean;
  175.  begin
  176.   filemode := 66;
  177.   reset(q.filevar, 1);
  178.   err := ioresult;
  179.   foo := (err = 0);
  180.   if foo then
  181.    begin
  182.     blockread(q.filevar, q.header, 12);
  183.     err := ioresult;
  184.     foo := (err = 0);
  185.     if foo then
  186.      begin
  187.       q.open := true;
  188.       q.lock := 0;
  189.       q.hlock := 0;
  190.       q.recsize := q.header.recsize;
  191.       q.offset := q.header.offset
  192.      end
  193.    end;
  194.   blockopen := foo
  195.  end;
  196.  
  197. procedure blockclose(var q: blockfiletype);
  198.  begin
  199.   while (q.lock + q.hlock) > 0 do unlockfile(q);
  200.   if q.open then
  201.    begin
  202.     close(q.filevar);
  203.     ergor(@q.filevar)
  204.    end;
  205.   fillchar(q, sizeof(blockfiletype), 0)
  206.  end;
  207.  
  208. function lroot(var q: blockfiletype): longint;
  209.  var
  210.   fie: treeroottype;
  211.  begin
  212.   blockread(q.filevar, fie, 12);
  213.   ergow(@q.filevar);
  214.   lroot := fie.listroot
  215.  end;
  216.  
  217. begin
  218.  fillchar(mainsub, sizeof(mainsub), 0);
  219. end.
  220.