home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / MFM_119C.ZIP / MAXAREAS.PAS < prev    next >
Pascal/Delphi Source File  |  1993-06-03  |  18KB  |  571 lines

  1. Unit MaxAreas;
  2. {========================================================================}
  3. Interface
  4.   Uses
  5.     Dos;
  6.   Function SelectArea(AreaPath : PathStr; Var DnLdPath, FilesBbsPath : PathStr; Var OldArea : Word) : Byte;
  7. {========================================================================}
  8. Implementation
  9.   Uses
  10.     Crt, General, Help, MfmDefs, Screen, Setup, SlctDir, Strings;
  11.   Const
  12.     MaxClass = 12;
  13.     MaxOvr = 16;
  14.     TopLine = 1;
  15.     BottomLine = 23;
  16.   Type
  17.     ArrayInPtr = ^ArrayInType;
  18.     ArrayInType = Array[1..255] Of Char;
  19.     Override = Record
  20.       Priv : Integer;
  21.       Lock1, lock2 : Word;
  22.       Ch : Char;
  23.       Fill : Byte;
  24.     End;
  25.     AreaRecordType = Record
  26.       Id : Array[0..3] Of Char;
  27.       StructLen : Word;
  28.       AreaNo : Array[0..1] Of Char;
  29.       Name : Array[0..39] Of Char;
  30.       AreaType : Word;
  31.       MsgPath : Array[0..79] Of Char;
  32.       MsgName : Array[0..39] Of Char;
  33.       MsgInfo, MsgBar : Array[0..79] Of Char;
  34.       Origin : Array[0..61] Of Char;
  35.       MsgPriv : Integer;
  36.       MsgLock, Fill1 : Byte;
  37.       OriginAka : Word;
  38.       FilePath, UpPath, FileBar, FilesBbs, FileInfo : Array[0..79] Of Char;
  39.       FilePriv : Integer;
  40.       FileLock, Fill2 : Byte;
  41.       MsgMenuName, FileMenuName : Array[0..12] Of Char;
  42.       Attrib : Array[1..MaxClass] Of Word;
  43.       Movr : Array[1..MaxOvr] Of Override;
  44.       Fovr : Array[1..MaxOvr] Of Override;
  45.       MsgLock1, MsgLock2, FileLock1, FileLock2 : Word;
  46.       KillByAge, KillByNum : Word;
  47.     End;
  48.   Var
  49.     StructLen : Word;
  50.     TotalAreas, FirstArea, LastArea, AreaNum, TopArea, BottomArea : Word;
  51.     RecordBuffer : Pointer;
  52.     AreaDat : File;
  53.     MaxAreaRecord : ^AreaRecordType;
  54.     Row, BottomRow : Byte;
  55. {========================================================================}
  56. Function OpenMaxArea(AreaPath : PathStr) : Boolean;
  57.   Begin
  58.     Assign(AreaDat,AreaPath);
  59.     FileMode := 64; {ReadOnly & DenyNone}
  60.     {$I-} Reset(AreaDat,1); {$I+}
  61.     If DosError = 0 Then
  62.     Begin
  63.       OpenMaxArea := True;
  64.       Seek(AreaDat,4);
  65.       BlockRead(AreaDat,StructLen,SizeOf(StructLen));
  66.       TotalAreas := FileSize(AreaDat) Div StructLen;
  67.       GetMem(RecordBuffer,StructLen);
  68.     End
  69.     Else
  70.     Begin
  71.       OpenMaxArea := False;
  72.     End;
  73.   End;
  74. {========================================================================}
  75. Function GetMaxArea(AreaNo : LongInt) : Byte;
  76.   Begin
  77.     If (StructLen*AreaNo) > FileSize(AreaDat) Then
  78.     Begin
  79.       GetMaxArea := 254;
  80.     End
  81.     Else
  82.     Begin
  83.       Seek(AreaDat,StructLen*(AreaNo-1));
  84.       BlockRead(AreaDat,RecordBuffer^,StructLen);
  85.       GetMaxArea := 0;
  86.     End;
  87.   End;
  88. {========================================================================}
  89. Procedure CloseMaxArea;
  90.   Begin
  91.     Close(AreaDat);
  92.     FreeMem(RecordBuffer,StructLen);
  93.   End;
  94. {========================================================================}
  95. Function Priv(PrivIn : Integer) : String;
  96.   Begin
  97.     Case PrivIn Of
  98.      -2 : Priv := 'Twit';
  99.       0 : Priv := 'Disgrace';
  100.       1 : Priv := 'Limited';
  101.       2 : Priv := 'Normal';
  102.       3 : Priv := 'Worthy';
  103.       4 : Priv := 'Privil';
  104.       5 : Priv := 'Favored';
  105.       6 : Priv := 'Extra';
  106.       7 : Priv := 'Clerk';
  107.       8 : Priv := 'AsstSysop';
  108.      10 : Priv := 'Sysop';
  109.      11 : Priv := 'Hidden';
  110.     Else
  111.       Priv := 'Hidden';
  112.     End;
  113.   End;
  114. {========================================================================}
  115. Function Keys(Keys1, Keys2 : Word) : String;
  116.   Var
  117.     Ks : String;
  118.   Begin
  119.     Ks := '';
  120.     If Keys1+Keys2 > 0 Then
  121.     Begin
  122.       Ks := '/';
  123.       If (Keys1 And 1) = 1 Then Ks := Ks+'1';
  124.       If (Keys1 And 2) = 2 Then Ks := Ks+'2';
  125.       If (Keys1 And 4) = 4 Then Ks := Ks+'3';
  126.       If (Keys1 And 8) = 8 Then Ks := Ks+'4';
  127.       If (Keys1 And 16) = 16 Then Ks := Ks+'5';
  128.       If (Keys1 And 32) = 32 Then Ks := Ks+'6';
  129.       If (Keys1 And 64) = 64 Then Ks := Ks+'7';
  130.       If (Keys1 And 128) = 128 Then Ks := Ks+'8';
  131.       If (Keys1 And 256) = 256 Then Ks := Ks+'A';
  132.       If (Keys1 And 512) = 512 Then Ks := Ks+'B';
  133.       If (Keys1 And 1024) = 1024 Then Ks := Ks+'C';
  134.       If (Keys1 And 2048) = 2048 Then Ks := Ks+'D';
  135.       If (Keys1 And 4096) = 4096 Then Ks := Ks+'E';
  136.       If (Keys1 And 8192) = 8192 Then Ks := Ks+'F';
  137.       If (Keys1 And 16384) = 16384 Then Ks := Ks+'G';
  138.       If (Keys1 And 32768) = 32768 Then Ks := Ks+'H';
  139.       If (Keys2 And 1) = 1 Then Ks := Ks+'I';
  140.       If (Keys2 And 2) = 2 Then Ks := Ks+'J';
  141.       If (Keys2 And 4) = 4 Then Ks := Ks+'K';
  142.       If (Keys2 And 8) = 8 Then Ks := Ks+'L';
  143.       If (Keys2 And 16) = 16 Then Ks := Ks+'M';
  144.       If (Keys2 And 32) = 32 Then Ks := Ks+'N';
  145.       If (Keys2 And 64) = 64 Then Ks := Ks+'O';
  146.       If (Keys2 And 128) = 128 Then Ks := Ks+'P';
  147.       If (Keys2 And 256) = 256 Then Ks := Ks+'Q';
  148.       If (Keys2 And 512) = 512 Then Ks := Ks+'R';
  149.       If (Keys2 And 1024) = 1024 Then Ks := Ks+'S';
  150.       If (Keys2 And 2048) = 2048 Then Ks := Ks+'T';
  151.       If (Keys2 And 4096) = 4096 Then Ks := Ks+'U';
  152.       If (Keys2 And 8192) = 8192 Then Ks := Ks+'V';
  153.       If (Keys2 And 16384) = 16384 Then Ks := Ks+'W';
  154.       If (Keys2 And 32768) = 32768 Then Ks := Ks+'X';
  155.     End;
  156.     Keys := Ks;
  157.   End;
  158. {========================================================================}
  159. Procedure BlankCurrentLocation(Row : Byte);
  160.   Begin
  161.     NewTextColor(White);
  162.     AnsiGotoXY(Row,1); Write(' ');
  163.     AnsiGotoXY(Row,47); Write(' ');
  164.     AnsiGotoXY(24,80);
  165.   End;
  166. {========================================================================}
  167. Procedure DisplayCurrentLocation(Row : Byte);
  168.   Begin
  169.     NewTextColor(White+Blink);
  170.     AnsiGotoXY(Row,1); Write('>');
  171.     AnsiGotoXY(Row,47); Write('>');
  172.     NewTextColor(White);
  173.     AnsiGotoXY(25,1); AnsiClearToEOL;
  174.     Write(Priv(MaxAreaRecord^.FilePriv)+Keys(MaxAreaRecord^.FileLock1,MaxAreaRecord^.FileLock2));
  175.     AnsiGotoXY(25,45);
  176.     If StrLen(MaxAreaRecord^.FilesBbs) = 0 Then
  177.     Begin
  178.       Write(MaxAreaRecord^.FilePath);
  179.       Write('Files.Bbs');
  180.     End
  181.     Else
  182.     Begin
  183.       Write(MaxAreaRecord^.FilesBbs);
  184.     End;
  185.     AnsiGotoXY(24,80);
  186.   End;
  187. {========================================================================}
  188. Procedure DisplayRecord(Row : Byte);
  189.   Var
  190.     AreaLine : Array[0..79] Of Char;
  191.   Begin
  192.     AnsiGotoXY(Row,1); AnsiClearToEOL;
  193.     AnsiGotoXY(Row,2);
  194.     NewTextColor(White);
  195.     StrLCopy(AreaLine,MaxAreaRecord^.Name,4);
  196.     Write(AreaLine);
  197.     AnsiGotoXY(Row,7);
  198.     NewTextColor(Yellow);
  199.     StrLCopy(AreaLine,MaxAreaRecord^.FileInfo,40);
  200.     Write(AreaLine);
  201.     AnsiGotoXY(Row,48);
  202.     NewTextColor(LightGreen);
  203.     StrLCopy(AreaLine,MaxAreaRecord^.FilePath,30);
  204.     Write(AreaLine);
  205.   End;
  206. {========================================================================}
  207. Procedure DisplayScreen;
  208.   Var
  209.     Row : Byte;
  210.     AreaNum : Integer;
  211.   Begin
  212.     SetupScreen;
  213.     Row := TopLine-1;
  214.     AreaNum := TopArea;
  215.     While (AreaNum <= LastArea) And (Row < BottomLine) Do
  216.     Begin
  217.       GetMaxArea(AreaNum);
  218.       While (StrLen(MaxAreaRecord^.FilePath) = 0) And (AreaNum < LastArea) Do
  219.       Begin
  220.         Inc(AreaNum);
  221.         GetMaxArea(AreaNum);
  222.       End;
  223.       BottomArea := AreaNum;
  224.       If StrLen(MaxAreaRecord^.FilePath) > 0 Then
  225.       Begin
  226.         Inc(Row); Inc(AreaNum);
  227.         DisplayRecord(Row);
  228.       End;
  229.       BottomRow := Row;
  230.     End;
  231.   End;
  232. {========================================================================}
  233. Procedure LineUp;
  234.   Begin
  235.     If AreaNum > FirstArea Then
  236.     Begin
  237.       If Row > TopLine Then
  238.       Begin
  239.         BlankCurrentLocation(Row); Dec(Row); Dec(AreaNum);
  240.       End
  241.       Else
  242.       Begin
  243.         Dec(TopArea); DisplayScreen; Dec(AreaNum);
  244.       End;
  245.       GetMaxArea(AreaNum);
  246.       While (StrLen(MaxAreaRecord^.FilePath) = 0) And (AreaNum > FirstArea) Do
  247.       Begin
  248.         Dec(AreaNum); GetMaxArea(AreaNum);
  249.       End;
  250.       DisplayCurrentLocation(Row);
  251.     End;
  252.   End;
  253. {========================================================================}
  254. Procedure LineDown;
  255.   Begin
  256.     If AreaNum < LastArea Then
  257.     Begin
  258.       If Row < BottomLine Then
  259.       Begin
  260.         BlankCurrentLocation(Row); Inc(Row); Inc(AreaNum);
  261.       End
  262.       Else
  263.       Begin
  264.         Inc(TopArea); DisplayScreen; Inc(AreaNum);
  265.       End;
  266.       GetMaxArea(AreaNum);
  267.       While (StrLen(MaxAreaRecord^.FilePath) = 0) And (AreaNum < LastArea) Do
  268.       Begin
  269.         Inc(AreaNum); GetMaxArea(AreaNum);
  270.       End;
  271.       DisplayCurrentLocation(Row);
  272.     End;
  273.   End;
  274. {========================================================================}
  275. Procedure PageUp;
  276.   Var
  277.     Counter : Byte;
  278.   Begin
  279.     If AreaNum <> FirstArea Then
  280.     Begin
  281.       If TotalAreas <= BottomLine Then
  282.       Begin
  283.         AreaNum := FirstArea;
  284.         BlankCurrentLocation(Row);
  285.         Row := TopLine;
  286.         GetMaxArea(AreaNum);
  287.         DisplayCurrentLocation(Row);
  288.       End
  289.       Else
  290.       Begin
  291.         If Row = TopLine Then
  292.         Begin
  293.           Counter := BottomLine;
  294.           While (Counter > 1) And (AreaNum > FirstArea) Do
  295.           Begin
  296.             Dec(AreaNum); Dec(Counter);
  297.             GetMaxArea(AreaNum);
  298.             While (StrLen(MaxAreaRecord^.FilePath) = 0) And (AreaNum > FirstArea) Do
  299.             Begin
  300.               Dec(AreaNum); GetMaxArea(AreaNum);
  301.             End;
  302.           End;
  303.           TopArea := AreaNum;
  304.           DisplayScreen;
  305.           GetMaxArea(AreaNum);
  306.           DisplayCurrentLocation(Row);
  307.         End
  308.         Else
  309.         Begin
  310.           AreaNum := TopArea;
  311.           BlankCurrentLocation(Row);
  312.           Row := TopLine;
  313.           GetMaxArea(AreaNum);
  314.           DisplayCurrentLocation(Row);
  315.         End;
  316.       End;
  317.     End;
  318.   End;
  319. {========================================================================}
  320. Procedure PageDown;
  321.   Var
  322.     Counter : Byte;
  323.   Begin
  324.     If Not ((Row = BottomLine) And (AreaNum = LastArea)) Then
  325.     Begin
  326.       If TotalAreas <= BottomLine Then
  327.       Begin
  328.         AreaNum := LastArea;
  329.         BlankCurrentLocation(Row);
  330.         Row := TotalAreas;
  331.         GetMaxArea(AreaNum);
  332.         DisplayCurrentLocation(Row);
  333.       End
  334.       Else
  335.       Begin
  336.         If AreaNum = LastArea Then
  337.         Begin
  338.           For Counter := 1 To BottomLine-1 Do
  339.           Begin
  340.             Dec(AreaNum);
  341.             GetMaxArea(AreaNum);
  342.             While (StrLen(MaxAreaRecord^.FilePath) = 0) And (AreaNum > FirstArea) Do
  343.             Begin
  344.               Dec(AreaNum); GetMaxArea(AreaNum);
  345.             End;
  346.           End;
  347.           TopArea := AreaNum;
  348.           DisplayScreen;
  349.           Row := BottomLine;
  350.           AreaNum := LastArea;
  351.           GetMaxArea(AreaNum);
  352.           DisplayCurrentLocation(Row);
  353.         End
  354.         Else
  355.         Begin
  356.           If Row = BottomLine Then
  357.           Begin
  358.             TopArea := BottomArea;
  359.             DisplayScreen;
  360.             AreaNum := BottomArea;
  361.             GetMaxArea(AreaNum);
  362.             Row := BottomRow;
  363.             DisplayCurrentLocation(Row);
  364.           End
  365.           Else
  366.           Begin
  367.             AreaNum := BottomArea;
  368.             BlankCurrentLocation(Row);
  369.             Row := BottomLine;
  370.             GetMaxArea(AreaNum);
  371.             DisplayCurrentLocation(Row);
  372.           End;
  373.         End;
  374.       End;
  375.     End;
  376.   End;
  377. {========================================================================}
  378. Procedure TopOfList;
  379.   Begin
  380.     If TopArea <> FirstArea Then
  381.     Begin
  382.       TopArea := FirstArea;
  383.       DisplayScreen;
  384.     End
  385.     Else
  386.     Begin
  387.       BlankCurrentLocation(Row);
  388.     End;
  389.     AreaNum := FirstArea;
  390.     GetMaxArea(AreaNum);
  391.     Row := TopLine;
  392.     DisplayCurrentLocation(Row);
  393.   End;
  394. {========================================================================}
  395. Procedure BottomOfList;
  396.   Var
  397.     Counter : Byte;
  398.   Begin
  399.     If Not ((Row = BottomLine) And (AreaNum = LastArea)) Then
  400.     Begin
  401.       AreaNum := LastArea;
  402.       If TotalAreas <= BottomLine Then
  403.       Begin
  404.         BlankCurrentLocation(Row);
  405.         Row := TotalAreas;
  406.         GetMaxArea(AreaNum);
  407.         DisplayCurrentLocation(Row);
  408.       End
  409.       Else
  410.       Begin
  411.         For Counter := 1 To BottomLine-1 Do
  412.         Begin
  413.           Dec(AreaNum);
  414.           GetMaxArea(AreaNum);
  415.           While (StrLen(MaxAreaRecord^.FilePath) = 0) And (AreaNum > FirstArea) Do
  416.           Begin
  417.             Dec(AreaNum); GetMaxArea(AreaNum);
  418.           End;
  419.         End;
  420.         TopArea := AreaNum;
  421.         DisplayScreen;
  422.         Row := BottomLine;
  423.         AreaNum := LastArea;
  424.         GetMaxArea(AreaNum);
  425.         DisplayCurrentLocation(Row);
  426.       End;
  427.     End;
  428.   End;
  429. {========================================================================}
  430. Function SelectArea(AreaPath : PathStr; Var DnLdPath, FilesBbsPath : PathStr; Var OldArea : Word) : Byte;
  431.   Var
  432.     Sab, Counter : Byte;
  433.     Sac : Char;
  434.     TempAreaPath : PathStr;
  435.   Begin
  436.     SelectArea := 0;
  437.     If FileExist(AreaPath) Then
  438.     Begin
  439.       If OpenMaxArea(AreaPath) Then
  440.       Begin
  441.         TotalAreas := 0; FirstArea := 0; LastArea := 0; AreaNum := 1;
  442.         While GetMaxArea(AreaNum) = 0 Do
  443.         Begin
  444.           MaxAreaRecord := RecordBuffer;
  445.           If StrLen(MaxAreaRecord^.FilePath) > 0 Then
  446.           Begin
  447.             Inc(TotalAreas);
  448.             LastArea := AreaNum;
  449.           End;
  450.           Inc(AreaNum);
  451.         End;
  452.         If TotalAreas > 0 Then
  453.         Begin
  454.           Repeat
  455.             GetMaxArea(AreaNum);
  456.             MaxAreaRecord := RecordBuffer;
  457.             If StrLen(MaxAreaRecord^.FilePath) > 0 Then FirstArea := AreaNum;
  458.             Dec(AreaNum);
  459.           Until AreaNum = 0;
  460.           If OldArea = $FFFF Then
  461.           Begin
  462.             OldArea := FirstArea;
  463.             TopArea := FirstArea;
  464.           End;
  465.           If TopArea = OldArea Then
  466.           Begin
  467.             DisplayScreen;
  468.             Row := TopLine;
  469.           End
  470.           Else
  471.           Begin
  472.             AreaNum := OldArea;
  473.             Counter := BottomLine;
  474.             While (Counter > 1) And (AreaNum > FirstArea) Do
  475.             Begin
  476.               Dec(AreaNum); Dec(Counter);
  477.               GetMaxArea(AreaNum);
  478.               While (StrLen(MaxAreaRecord^.FilePath) = 0) And (AreaNum > FirstArea) Do
  479.               Begin
  480.                 Dec(AreaNum); GetMaxArea(AreaNum);
  481.               End;
  482.             End;
  483.             TopArea := AreaNum;
  484.             DisplayScreen;
  485.             Row := (BottomLine-Counter)+1;
  486.           End;
  487.           AreaNum := OldArea;
  488.           GetMaxArea(AreaNum);
  489.           DisplayCurrentLocation(Row);
  490.           Repeat
  491.             GetMaxArea(AreaNum);
  492.             Sab := GetInput;
  493.             Sac := Upcase(Chr(Sab));
  494.             If Sab = 0 Then
  495.             Begin
  496.               Sab := GetInput;
  497.               Case Sab Of
  498.                 71 : Sac := '7';
  499.                 72 : Sac := '8';
  500.                 73 : Sac := '9';
  501.                 75 : Sac := '4';
  502.                 77 : Sac := '6';
  503.                 79 : Sac := '1';
  504.                 80 : Sac := '2';
  505.                 81 : Sac := '3';
  506.               End;
  507.             End;
  508.             Case Sac Of
  509.               '8' : LineUp;
  510.               '2' : LineDown;
  511.               '9' : PageUp;
  512.               '3' : PageDown;
  513.               '7' : TopOfList;
  514.               '1' : BottomOfList;
  515.               ^I  : Begin
  516.                       If TabOk Then
  517.                       Begin
  518.                         TempAreaPath := SelectDir(StrPas(MaxAreaRecord^.FilePath)+'*.*');
  519.                         If Length(TempAreaPath) = 0 Then
  520.                         Begin
  521.                           Sac := ' ';
  522.                           DisplayScreen;
  523.                           GetMaxArea(AreaNum);
  524.                           DisplayCurrentLocation(Row);
  525.                         End
  526.                         Else
  527.                         Begin
  528.                           DnLdPath := TempAreaPath;
  529.                           FilesBbsPath := DnLdPath+'Files.Bbs';
  530.                         End;
  531.                       End
  532.                       Else
  533.                       Begin
  534.                         Sac := ' ';
  535.                       End;
  536.                     End;
  537.               '?' : Begin
  538.                       AreaHelp;
  539.                       DisplayScreen;
  540.                       GetMaxArea(AreaNum);
  541.                       DisplayCurrentLocation(Row);
  542.                     End;
  543.             End;
  544.           Until Sac In [^I,^M,^Q,^[];
  545.           If Sac = ^M Then
  546.           Begin
  547.             DnLdPath := StrPas(MaxAreaRecord^.FilePath);
  548.             FilesBbsPath := StrPas(MaxAreaRecord^.FilesBbs);
  549.             If Length(FilesBbsPath) = 0 Then FilesBbsPath := DnLdPath+'Files.Bbs';
  550.           End;
  551.           If Sac = ^Q Then SelectArea := 253;
  552.           If Sac = ^[ Then SelectArea := 252;
  553.         End;
  554.         CloseMaxArea;
  555.       End
  556.       Else
  557.       Begin
  558.         SelectArea := 254;
  559.       End;
  560.     End
  561.     Else
  562.     Begin
  563.       SelectArea := 255;
  564.     End;
  565.     If Sac = ^M Then OldArea := AreaNum;
  566.   End;
  567. {========================================================================}
  568. Begin
  569. End.
  570. {========================================================================}
  571.