home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / MFM_119C.ZIP / SETUP.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-06-04  |  15.5 KB  |  484 lines

  1. Unit Setup;
  2. {========================================================================}
  3. Interface
  4.   Uses
  5.     MfmDefs;
  6.   Procedure ParseCommandLine;
  7.   Procedure BuildSkipList;
  8.   Procedure ParseConfigFile;
  9.   Function OkToAdd(InString : String) : Boolean;
  10.   Function CommentEntry : Boolean;
  11.   Procedure FindOrphans;
  12.   Procedure BuildList;
  13.   Function Bytes(NumberOfBytes : LongInt) : S8;
  14.   Procedure SetupScreen;
  15.   Procedure ReDrawScreen;
  16. {========================================================================}
  17. Implementation
  18.   Uses
  19.     Crt, Display, Dos, General, MaxAreas, MfmStr, Quit, Screen;
  20. {========================================================================}
  21. Procedure BuildClt;
  22.   Var
  23.     Cltb : Byte;
  24.   Begin
  25.     CommandLineTail := '';
  26.     If ParamCount > 0 Then
  27.     Begin
  28.       For Cltb := 1 To ParamCount Do CommandLineTail := CommandLineTail+ParamStr(Cltb)+' ';
  29.       Delete(CommandLineTail,Length(CommandLineTail),1);
  30.     End;
  31.   End;
  32. {========================================================================}
  33. Procedure ParseCommandLine;
  34.   Var
  35.     Pclb : Byte;
  36.     FileAreaPathOk, AreaPathOk, OutputSelected : Boolean;
  37.   Begin
  38.     BuildClt;
  39.     CommandLineTail := UpperString(CommandLineTail);
  40.     ReDirectTo := StandardIO;
  41.     Assign(Input,''); Reset(Input);
  42.     Assign(Output,''); Rewrite(Output);
  43.     OutputSelected := False;
  44.     WriteLn(Pgmid); WriteLn;
  45.     FileAreaPath := '';
  46.     FileAreaPathOk := False;
  47.     AreaPathOk := False;
  48.     MfmRunFb := False;
  49.     AreaChanged := False;
  50.     If ParamCount = 0 Then
  51.     Begin
  52.       ReDirectTo := Console;
  53.       OutputSelected := True;
  54.       AssignCrt(Input); Reset(Input);
  55.       AssignCrt(Output); Rewrite(Output);
  56.       AreaPath := MfmExeDir+'AREA.DAT';
  57.     End
  58.     Else
  59.     Begin
  60.       If (Pos('/A',CommandLineTail) > 0) Or (Pos('-A',CommandLineTail) > 0) Then
  61.       Begin
  62.         AreaPathOk := True;
  63.         If Pos('/A',CommandLineTail) > 0 Then
  64.         Begin
  65.           AreaPath := HereToSpace(CommandLineTail,Pos('/A',CommandLineTail)+2);
  66.         End
  67.         Else
  68.         Begin
  69.           AreaPath := HereToSpace(CommandLineTail,Pos('-A',CommandLineTail)+2);
  70.         End;
  71.         If Length(AreaPath) > 0 Then
  72.         Begin
  73.           If Not FileExist(AreaPath) Then
  74.           Begin
  75.             If Copy(AreaPath,Length(AreaPath),1) <> '\' Then AreaPath := AreaPath + '\';
  76.             If Not FileExist(AreaPath+'AREA.DAT') Then
  77.             Begin
  78.               WriteLn('AREA.DAT not found in '+AreaPath+' !');
  79.               Halt(1);
  80.             End
  81.             Else
  82.             Begin
  83.               AreaPath := AreaPath+'AREA.DAT';
  84.             End;
  85.           End;
  86.         End;
  87.       End;
  88.       If (Pos('/C',CommandLineTail) > 0) Or (Pos('-C',CommandLineTail) > 0) Then
  89.       Begin
  90.         OutputSelected := True;
  91.         If (Pos('/C0',CommandLineTail) > 0) Or (Pos('-C0',CommandLineTail) > 0) Then
  92.         Begin
  93.           ReDirectTo := Console;
  94.           AssignCrt(Input); Reset(Input);
  95.           AssignCrt(Output); Rewrite(Output);
  96.         End;
  97.         If (Pos('/C1',CommandLineTail) > 0) Or (Pos('-C1',CommandLineTail) > 0) Then
  98.         Begin
  99.           ReDirectTo := ComPort1;
  100.           Assign(Input,'Com1'); Reset(Input);
  101.           Assign(Output,'Com1'); Rewrite(Output);
  102.         End;
  103.         If (Pos('/C2',CommandLineTail) > 0) Or (Pos('-C2',CommandLineTail) > 0) Then
  104.         Begin
  105.           ReDirectTo := ComPort2;
  106.           Assign(Input,'Com2'); Reset(Input);
  107.           Assign(Output,'Com2'); Rewrite(Output);
  108.         End;
  109.         If (Pos('/C9',CommandLineTail) > 0) Or (Pos('-C9',CommandLineTail) > 0) Then
  110.         Begin
  111.           ReDirectTo := StandardIO;
  112.           Assign(Input,''); Reset(Input);
  113.           Assign(Output,''); Rewrite(Output);
  114.         End;
  115.       End;
  116.       If (Pos('/P',CommandLineTail) > 0) Or (Pos('-P',CommandLineTail) > 0) Then
  117.       Begin
  118.         FileAreaPathOk := True;
  119.         If Pos('/P',CommandLineTail) > 0 Then
  120.         Begin
  121.           FileAreaPath := HereToSpace(CommandLineTail,Pos('/P',CommandLineTail)+2);
  122.         End
  123.         Else
  124.         Begin
  125.           FileAreaPath := HereToSpace(CommandLineTail,Pos('-P',CommandLineTail)+2);
  126.         End;
  127.         If Length(FileAreaPath) > 0 Then
  128.         Begin
  129.           FileAreaPath := FExpand(FileAreaPath);
  130.           If Not DirExist(FileAreaPath) Then
  131.           Begin
  132.             WriteLn('Directory "'+FileAreaPath+'" not found.');
  133.             Halt(1);
  134.           End;
  135.           If Not FileExist(FileAreaPath+'*.*') Then
  136.           Begin
  137.             WriteLn('No files exist in "'+FileAreaPath+'".');
  138.             Halt(1);
  139.           End;
  140.         End;
  141.       End;
  142.       If Pos('/R',CommandLineTail) > 0 Then MfmRunFb := True;
  143.       If (Pos('/T',CommandLineTail) > 0) Or (Pos('-T',CommandLineTail) > 0) Then TabOk := False;
  144.     End;
  145.     If (Not AreaPathOk) Then AreaPath := MfmExeDir+'AREA.DAT';
  146.     If (Not OutputSelected) Then
  147.     Begin
  148.       ReDirectTo := Console;
  149.       OutputSelected := True;
  150.       AssignCrt(Input); Reset(Input);
  151.       AssignCrt(Output); Rewrite(Output);
  152.     End;
  153.     If (Not FileAreaPathOk) Then
  154.     Begin
  155.       Repeat
  156.         Result := SelectArea(AreaPath,FileAreaPath,FilesBbsPath,OldArea);
  157.         If Result In [252..255] Then
  158.         Begin
  159.           If Result = 255 Then
  160.           Begin
  161.             WriteLn('"'+AreaPath+'" not found.');
  162.             Halt(Result);
  163.           End;
  164.           If Result = 254 Then
  165.           Begin
  166.             WriteLn('Could not open "'+AreaPath+'".');
  167.             Halt(Result);
  168.           End;
  169.           QuitMfm;
  170.         End;
  171.       Until Result < 252;
  172.     End;
  173.   End;
  174. {========================================================================}
  175. Procedure BuildSkipList;
  176.   Var
  177.     Bslb : Byte;
  178.     InFile : Text;
  179.   Begin
  180.     For Bslb := 1 To MaxSkip Do SkipList[Bslb] := 'ACBDEFGHIJKL';
  181.     If FileExist(MfmExeDir+'MFM-SKIP.LST') Then
  182.     Begin
  183.       Assign(InFile,MfmExeDir+'MFM-SKIP.LST');
  184.       Reset(InFile);
  185.       Bslb := 1;
  186.       While (Not Eof(InFile)) And (Bslb < MaxSkip) Do
  187.       Begin
  188.         ReadLn(InFile,SkipList[Bslb]);
  189.         Inc(Bslb);
  190.       End;
  191.       Close(InFIle);
  192.     End;
  193.   End;
  194. {========================================================================}
  195. Procedure ParseConfigFile;
  196.   Var
  197.     CfgFile : Text;
  198.     CfgStr : String;
  199.   Begin
  200.     DefaultViewer := 'L.COM';
  201.     CompressedFileViewer := 'SHEZ.EXE';
  202.     CompressedFileExt := 'ARCARJLZHPAKSDNZIPZOO';
  203.     PictureFileViewer := 'VPIC.EXE';
  204.     PictureFileExt := 'GIF';
  205.     If FileExist(MfmExeDir+'MFM.CFG') Then
  206.     Begin
  207.       Assign(CfgFile,MfmExeDir+'MFM.CFG');
  208.       Reset(CfgFile);
  209.       While Not Eof(CfgFile) Do
  210.       Begin
  211.         ReadLn(CfgFile,CfgStr);
  212.         CfgStr := UpperString(CfgStr);
  213.         If Pos('DEFAULT VIEWER',CfgStr) > 0 Then DefaultViewer := Copy(CfgStr,18,255);
  214.         If Pos('COMPRESSED FILE VIEWER',CfgStr) > 0 Then CompressedFileViewer := Copy(CfgStr,26,255);
  215.         If Pos('PICTURE FILE VIEWER',CfgStr) > 0 Then PictureFileViewer := Copy(CfgStr,23,255);
  216.         If Pos('COMPRESSED FILE EXT',CfgStr) > 0 Then CompressedFileExt := Copy(CfgStr,23,255);
  217.         If Pos('PICTURE FILE EXT',CfgStr) > 0 Then PictureFileExt := Copy(CfgStr,20,255);
  218.       End;
  219.       Close(CfgFile);
  220.     End;
  221.   End;
  222. {========================================================================}
  223. Function OkToAdd(InString : String) : Boolean;
  224.   Var
  225.     Otab : Byte;
  226.   Begin
  227.     If (MaxAvail > SizeOf(ListRecord)) Then
  228.     Begin
  229.       OkToAdd := True;
  230.       For Otab := 1 To 10 Do If Pos(SkipList[Otab],UpperString(InString)) = 1 Then OkToAdd := False;
  231.     End
  232.     Else
  233.     Begin
  234.       OkToAdd := False;
  235.     End;
  236.   End;
  237. {========================================================================}
  238. Function CommentEntry : Boolean;
  239.   Begin
  240.     CommentEntry := False;
  241.     If Length(WorkString) = 0 Then CommentEntry := True;
  242.     If Copy(WorkString,1,1) = ' ' Then CommentEntry := True;
  243.     If Copy(WorkString,1,1) = '-' Then CommentEntry := True;
  244.     If Pos(WorkString[1],Base153) = 0 Then CommentEntry := True;
  245.   End;
  246. {========================================================================}
  247. Procedure FindOrphans;
  248.   Var
  249.     FileFound : Boolean;
  250.     SearchEntry : ListPtr;
  251.   Begin
  252.     FileFound := False; SearchEntry := FirstEntry;
  253.     If FilesBbs Then
  254.     Begin
  255.       While (Not FileFound) And (SearchEntry^.NextEntry <> NIL) Do
  256.       Begin
  257.         If DirInfo.Name = SearchEntry^.FileName Then FileFound := True;
  258.         SearchEntry := SearchEntry^.NextEntry;
  259.       End;
  260.     End;
  261.     If FilesBbs Then
  262.     Begin
  263.       If (Not FileFound) And (DirInfo.Name <> SearchEntry^.FileName) Then
  264.       Begin
  265.         If OkToAdd(DirInfo.Name) Then
  266.         Begin
  267.           New(NewEntry);
  268.           If NumberOfEntries = 0 Then
  269.           Begin
  270.             FirstEntry := NewEntry;
  271.             NewEntry^.PrevEntry := NIL;
  272.             OldEntry := FirstEntry;
  273.           End
  274.           Else
  275.           Begin
  276.             NewEntry^.PrevEntry := OldEntry;
  277.             OldEntry^.NextEntry := NewEntry;
  278.             OldEntry := NewEntry;
  279.           End;
  280.           NewEntry^.TypeOfRecord := Orphan;
  281.           NewEntry^.FileName := DirInfo.Name;
  282.           NewEntry^.FileSize := DirInfo.Size;
  283.           If DirInfo.Name <> 'FILES.BBS' Then
  284.           Begin
  285.             SizeOfFiles := SizeOfFiles + DirInfo.Size;
  286.             Inc(NumberOfFiles);
  287.           End;
  288.           NewEntry^.FileDate := DirInfo.Time;
  289.           NewEntry^.Description := '';
  290.           NewEntry^.Tagged := False;
  291.           Inc(NumberOfEntries);
  292.         End;
  293.       End;
  294.     End
  295.     Else
  296.     Begin
  297.       If Not FileFound Then
  298.       Begin
  299.         If MaxAvail > SizeOf(ListRecord) Then
  300.         Begin
  301.           New(NewEntry);
  302.           NewEntry^.Tagged := False;
  303.           If NumberOfEntries = 0 Then
  304.           Begin
  305.             FirstEntry := NewEntry;
  306.             NewEntry^.PrevEntry := NIL;
  307.             OldEntry := FirstEntry;
  308.           End
  309.           Else
  310.           Begin
  311.             NewEntry^.PrevEntry := OldEntry;
  312.             OldEntry^.NextEntry := NewEntry;
  313.             OldEntry := NewEntry;
  314.           End;
  315.           NewEntry^.TypeOfRecord := Orphan;
  316.           NewEntry^.FileName := DirInfo.Name;
  317.           NewEntry^.FileSize := DirInfo.Size;
  318.           If DirInfo.Name <> 'FILES.BBS' Then
  319.           Begin
  320.             SizeOfFiles := SizeOfFiles + DirInfo.Size;
  321.             Inc(NumberOfFiles);
  322.           End;
  323.           NewEntry^.FileDate := DirInfo.Time;
  324.           NewEntry^.Description := '';
  325.           Inc(NumberOfEntries);
  326.         End;
  327.       End;
  328.     End;
  329.   End;
  330. {========================================================================}
  331. Procedure BuildList;
  332.   Begin
  333.     NumberOfEntries := 0; FilesBbs := True; Altered := False;
  334.     SizeOfFiles := 0; NumberOfFiles := 0;
  335.     Assign(FileList,FilesBbsPath);
  336.     FileMode := 64; {ReadOnly & DenyNone}
  337.     {$I-} Reset(FileList); {$I+}
  338.     If IOresult = 0 Then
  339.     Begin
  340.       AnsiGotoXY(25,1); NewTextColor(White); NewTextBackground(Black);
  341.       AnsiClearToEOL; Write('Loading FILES.BBS ...');
  342.       While Not Eof(FileList) Do
  343.       Begin
  344.         ReadLn(FileList,WorkString);
  345.         If OkToAdd(WorkString) Then
  346.         Begin
  347.           Inc(NumberOfEntries);
  348.           If CommentEntry Then
  349.           Begin
  350.             New(NewEntry);
  351.             NewEntry^.TypeOfRecord := Comment;
  352.             NewEntry^.FileName := '';
  353.             NewEntry^.FileSize := 0;
  354.             NewEntry^.FileDate := 0;
  355.             NewEntry^.Description := WorkString;
  356.             NewEntry^.Tagged := False;
  357.             If NumberOfEntries = 1 Then
  358.             Begin
  359.               FirstEntry := NewEntry;
  360.               NewEntry^.PrevEntry := NIL;
  361.               OldEntry := FirstEntry;
  362.             End
  363.             Else
  364.             Begin
  365.               NewEntry^.PrevEntry := OldEntry;
  366.               OldEntry^.NextEntry := NewEntry;
  367.               OldEntry := NewEntry;
  368.             End;
  369.           End
  370.           Else
  371.           Begin
  372.             New(NewEntry);
  373.             NewEntry^.Tagged := False;
  374.             If NumberOfEntries = 1 Then
  375.             Begin
  376.               FirstEntry := NewEntry;
  377.               NewEntry^.PrevEntry := NIL;
  378.               OldEntry := FirstEntry;
  379.             End
  380.             Else
  381.             Begin
  382.               NewEntry^.PrevEntry := OldEntry;
  383.               OldEntry^.NextEntry := NewEntry;
  384.               OldEntry := NewEntry;
  385.             End;
  386.             If Pos(' ',WorkString) = 0 Then
  387.             Begin
  388.               NewEntry^.FileName := UpperString(WorkString);
  389.             End
  390.             Else
  391.             Begin
  392.               NewEntry^.FileName := UpperString(Copy(Copy(WorkString,1,Pos(' ',WorkString)-1),1,12));
  393.             End;
  394.             FindFirst(FileAreaPath+NewEntry^.FileName,AnyFile,DirInfo);
  395.             If DosError = 0 Then
  396.             Begin
  397.               NewEntry^.TypeOfRecord := FileRecord;
  398.               NewEntry^.FileSize := DirInfo.Size;
  399.               SizeOfFiles := SizeOfFiles + DirInfo.Size;
  400.               Inc(NumberOfFiles);
  401.               NewEntry^.FileDate := DirInfo.Time;
  402.               If Pos(' ',WorkString) = 0 Then
  403.               Begin
  404.                 NewEntry^.Description := '';
  405.               End
  406.               Else
  407.               Begin
  408.                 NewEntry^.Description := AllTrim(Copy(WorkString,Pos(' ',WorkString)+1,MaxDescLength));
  409.               End;
  410.             End
  411.             Else
  412.             Begin
  413.               NewEntry^.TypeOfRecord := Offline;
  414.               NewEntry^.FileSize := 0;
  415.               NewEntry^.FileDate := 0;
  416.               If Pos(' ',WorkString) = 0 Then
  417.               Begin
  418.                 NewEntry^.Description := '';
  419.               End
  420.               Else
  421.               Begin
  422.                 NewEntry^.Description := AllTrim(Copy(WorkString,Pos(' ',WorkString)+1,MaxDescLength));
  423.               End;
  424.             End;
  425.           End;
  426.         End;
  427.       End;
  428.       Close(FileList);
  429.       NewEntry^.NextEntry := NIL;
  430.       If NumberOfEntries = 0 Then FilesBbs := False;
  431.     End
  432.     Else
  433.     Begin
  434.       FilesBbs := False;
  435.     End;
  436.     FindFirst(FileAreaPath+'*.*',Archive,DirInfo);
  437.     If DosError = 0 Then FindOrphans;
  438.     While DosError = 0 Do
  439.     Begin
  440.       NewEntry^.NextEntry := NIL;
  441.       FindNext(DirInfo);
  442.       If DosError = 0 Then FindOrphans;
  443.     End;
  444.     LastEntry := NewEntry;
  445.     LastEntry^.NextEntry := NIL;
  446.     StackEntry := NIL; KillEntry := NIL;
  447.     AnsiGotoXY(25,1); AnsiClearToEOL;
  448.   End;
  449. {========================================================================}
  450. Function Bytes(NumberOfBytes : LongInt) : S8;
  451.   Var
  452.     TempString : S8;
  453.   Begin
  454.     If NumberOfBytes < 1024 Then
  455.     Begin
  456.       TempString := MyStr(NumberOfBytes,4)+'K';
  457.     End
  458.     Else
  459.     Begin
  460.       Str(NumberOfBytes/1024:3:1,TempString);
  461.       TempString := TempString+'M';
  462.     End;
  463.     Bytes := TempString;
  464.   End;
  465. {========================================================================}
  466. Procedure SetupScreen;
  467.   Begin
  468.     NewTextColor(White); NewTextBackground(Black);
  469.     AnsiClearScreen; AnsiGotoXY(24,1);
  470.     NewTextColor(Black); NewTextBackground(Cyan);
  471.     Write(Pgmid+'     ^Q=quit ?=help');
  472.     NewTextColor(White); NewTextBackground(Black);
  473.   End;
  474. {========================================================================}
  475. Procedure ReDrawScreen;
  476.   Begin
  477.     SetupScreen;
  478.     DisplayScreen;
  479.   End;
  480. {========================================================================}
  481. Begin
  482. End.
  483. {========================================================================}
  484.