FLAGS.PAS

4.9 KB e8c36366db13ef8a…
{$I DIRECT.INC}

unit flags;

interface

uses gentypes;

const accessstr:array [accesstype] of string[8]=
        ('By level','Keep out','Let in','');

Procedure GetScanRec(VAR N:NewScanRec; C:Byte);
Procedure WriteScanRec(N:NewScanRec; C:Byte);
procedure setuseraccflag (var n:newscanrec; bn:integer; ac:accesstype);
function getuseraccflag (var n:newscanrec; bn:integer):accesstype;
Procedure Setallflags (bn:integer; ac:accesstype);
Procedure Setalluserflags (var n:newscanrec; ac:accesstype);
Procedure PromptFlag(VAR Flags:Mstr);
Procedure GetFlag(VAR Flags:Mstr);
Function CheckFlags(HisFlags,Flags:Mstr):Boolean;
Procedure WriteFlags(F:Mstr);

implementation

uses Dos,configrt,gensubs,subs1,subsovr,subs2, FileLock;

Procedure GetScanRec(VAR N:NewScanRec; C:Byte);
Begin
  Assign(ScanFile,Cfg.DataDir+'SCANDATA.'+Strr(C));
  Reset(ScanFile);
  FillChar(N,SizeOf(N),0);
  N.NewScanConfig:=[];
  N.Access1:=[];
  N.Access2:=[];
  If IoResult<>0 Then Begin
    Close(ScanFile);
    Exit;
  End;
  If Unum<=FileSize(ScanFile) Then Begin
    Seek(ScanFile,Unum);
    NRead(ScanFile,N);
  End;
  Close(ScanFile);
End;

Procedure DeleteScanRec(Num:Integer);
VAR N:NewScanRec;
Begin
  Assign(ScanFile,Cfg.DataDir+'SCANDATA.1');
  Reset(ScanFile);
  FillChar(N,SizeOf(N),0);
  Seek(ScanFile,Num);
  NWrite(ScanFile,N);
  Close(ScanFile);
End;

Procedure WriteScanRec(N:NewScanRec; C:Byte);
VAR X:Integer;
    Temp:NewScanRec;
Begin
  If Unum<1 Then Exit;
  Assign(ScanFile,Cfg.DataDir+'SCANDATA.'+Strr(C));
  Reset(ScanFile);
  If IoResult<>0 Then Begin
    FillChar(Temp,SizeOf(Temp),0);
    Rewrite(ScanFile);
    NWrite(ScanFile,Temp);
  End;
  If Unum>FileSize(ScanFile) Then Begin
    Seek(ScanFile,FileSize(ScanFile));
    For X:=FileSize(ScanFile)+1 to UNum Do Begin
      FillChar(Temp,SizeOf(Temp),0);
      NWrite(ScanFile,Temp);
    End;
  End;
  N.Name:=Urec.Handle;
  Seek(ScanFile,Unum);
  NWrite(ScanFile,N);
  Close(ScanFile);
End;

procedure setuseraccflag (var n:newscanrec; bn:integer; ac:accesstype);
begin
  if (ord(ac) and 1)=1
    then n.access1:=n.access1+[bn]
    else n.access1:=n.access1-[bn];
  if (ord(ac) and 2)=2
    then n.access2:=n.access2+[bn]
    else n.access2:=n.access2-[bn]
end;

function getuseraccflag (var n:newscanrec; bn:integer):accesstype;
var ac:accesstype;
begin
  getuseraccflag:=accesstype(ord(bn in n.access1) or
                             (ord(bn in n.access2) shl 1))
end;

procedure setallflags (bn:integer; ac:accesstype);
var cnt:integer;
    u:userrec;
    N:NewScanRec;
begin
  Assign(ScanFile,Cfg.DataDir+'NEWSCAN.DAT');
  Reset(ScanFile);
  for cnt:=1 to filesize(ScanFile)-1 do begin
    seek (scanfile,cnt);
    NRead (scanfile,n);
    setuseraccflag (n,bn,ac);
    seek (scanfile,cnt);
    NWrite (scanfile,n)
  end
end;

procedure setalluserflags (var n:NewScanRec; ac:accesstype);
var b1,b2:byte;
begin
  b1:=(ord(ac) and 1)*255;
  b2:=((ord(ac) and 2) shr 1)*255;
  fillchar (n.access1,32,b1);
  fillchar (n.access2,32,b2)
end;

Procedure PromptFlag(VAR Flags:Mstr);
Var OldFlags:Mstr;
    I,B:Byte;
Begin
  OldFlags:=Flags;
  SendFull(^P'[A-Z / "-" + Letter = NOT]: ');
  NoCrInput('',15);
  For B:=1 to Length(Inpt) Do If Not (inpt[B] in ['-','A'..'Z','a'..'z'])
    Then Begin
      Ansicolor(117);
      For I:=1 to Length(inpt) Do SendFull(^H);
      WriteStr(inpt[B]+': Invalid Flag! &');
      Flags:=OldFlags;
      Exit;
    End;
  Flags:=inpt;
End;

Procedure GetFlag(VAR Flags:Mstr);
VAR K:Char;
    P,I:Byte;
    Done:Boolean;
Begin
  Done:=False;
  For K:='A' to 'Z' Do
  If Pos(K,Flags)>0 then SendFull(K) Else Write('-');
  SendStr(#27+'[27D');
  Repeat
  K:=WaitForChar(False);
  K:=UpCase(K);
  If K in ['A'..'Z'] then Begin
    I:=Ord(K)-39;
    SendStr(#27+'['+Strr(I-25)+'C');
    P:=Pos(K,Flags);
    If P>0 then Begin
      Delete(Flags,P,1);
      SendFull('-');
    End Else Begin
      Flags:=Flags+K;
      SendFull(K);
    End;
    SendStr(#27+'['+Strr(I-24)+'D');
  End Else If K=#32 Then Done:=True;
  Until (Done) or  (HungUpOn);
End;

Function CheckFlags(HisFlags,Flags:Mstr):Boolean;
VAR I:Byte;
    B,Neg:Boolean;
Begin
  B:=True;
  If Flags<>'' then Begin;
  i:=0;
  Repeat
    Neg:=False;
    inc(i);
    If Flags[i]='-' then Begin
      inc(i);
      neg:=true;
    End;
    If (Pos(Upcase(Flags[i]),HisFlags)=0) And (Not(Neg)) then Begin
      CheckFlags:=False;
      Exit;
    End Else
    If (Pos(Upcase(Flags[i]),HisFlags)>0) And (Neg) then Begin
      CheckFlags:=False;
      Exit;
    End;
    If Flags[i]=#32 then inc(i);
  Until (i=Length(Flags)) or hungupon;
  End;
  CheckFlags:=B;
End;

Procedure WriteFlags(F:Mstr);
VAR K:Char;
Begin
  For K:='A' to 'Z' Do
    If pos(K,F)>0
      Then SendFull(K)
      Else SendFull('-');
End;


begin
end.