home *** CD-ROM | disk | FTP | other *** search
/ SPACE 1 / SPACE - Library 1 - Volume 1.iso / utilitys / 57 / disk_cat.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1986-10-19  |  21.4 KB  |  793 lines

  1. Program Directory_Catalog(Input,Output);
  2.  
  3. {**********************
  4.  *   ST DISK CATALOG  *
  5.  *    Programmed by   *
  6.  *   Michael Ferrara  *
  7.  * (C)1987 ST X-Press *
  8.  **********************}
  9.  
  10.  
  11. Const {$I GEMCONST.PAS}
  12.  
  13. Type  {$I GEMTYPE.PAS}
  14.   Menu_DescType = Array[0..7] of String[15];
  15.   Item_DescType = Array[0..35] of String[17];
  16.   M_TitleType = Array[0..7] of Integer;
  17.   M_ItemType = Array[0..35] of Integer;
  18.   fname = Packed Array[1..12] of char ;
  19.   frec = Packed Record
  20.            reserved : Packed Array [ 0..19 ] Of byte;
  21.            resvd2 : byte;
  22.            attrib : byte;
  23.            time_stamp : integer;
  24.            date_stamp : integer;
  25.            size : long_integer;
  26.            name : fname;
  27.          End;
  28.   catalog_rec = Packed record
  29.                    folder_num : integer;
  30.                    fname      : string[12];
  31.                    Desc       : String[40];
  32.                 End;
  33.  
  34.   Path_Type = Packed Array[1..80] of char;
  35.  
  36. Var
  37.   Menu : Menu_Ptr ;
  38.   Menu_Desc      : Menu_DescType;
  39.   Item_Desc      : Item_DescType;
  40.   M_Title        : M_TitleType;
  41.   M_Item         : M_ItemType;
  42.  
  43.   Catalog      : Packed Array[1..560] of Catalog_rec;
  44.   path_string  : string;
  45.   path         : path_type;
  46.   disk_name    : str255;
  47.   folder_array : Packed array[1..125] of str255;
  48.   folder_count,
  49.   folder_max,
  50.   rec_count,
  51.   Choice : integer;
  52.  
  53. {$I GEMSUBS}
  54.  
  55. Function IO_Result : Integer; External;
  56. Procedure IO_Check(b : boolean); External;
  57.  
  58. Procedure About_Program;
  59. Var Box : Dialog_Ptr;
  60.     Item_String : Array[1..9] of Str255;
  61.     Item : Array [1..9] of Integer;
  62.     Button : Integer;
  63.     X : Integer;
  64.  
  65. Begin
  66.   Item_String[1] := '           ST DISK CATALOG';
  67.   Item_String[2] := '    Programmed by Michael Ferrara';
  68.   Item_String[3] := '         (C)1987 ST X-Press';
  69.   Item_String[4] := '';
  70.   Item_String[5] := '          "The ST Informer" ';
  71.   Item_String[6] := '';
  72.   Item_String[7] := '         ST X-Press Magazine';
  73.   Item_String[8] := '  P.O. Box 2383, La Habra CA 90632';
  74.   Item_String[9] := '      Telephone: (213) 691-8000';
  75.   Box := New_Dialog(20,0,0,40,15);
  76.   For x := 1 to 9 do
  77.   Begin
  78.     Item[X] := Add_DItem(Box,G_String,None,1,X,0,1,0,0);
  79.     Set_DText(Box,Item[X],Item_String[x],System_Font,Te_Left);
  80.   End;
  81.   Button:=Add_DItem(Box,G_Button,Selectable|Exit_Btn|Default,15,12,10,1,0,0);
  82.   Set_DText(Box, Button, 'Continue', System_Font, TE_Center ) ;
  83.   Center_Dialog(Box);
  84.   X :=Do_Dialog(Box,0);
  85.   End_Dialog(Box);
  86.   Delete_Dialog(Box);
  87. End;
  88.  
  89. Procedure Gem_Initialize;
  90. Var X : Integer;
  91. Begin
  92.   Menu_Desc[0] := ' Desk ';
  93.   Menu_Desc[1] := ' Functions ';
  94.   Item_Desc[1] := ' Log Disk     ';
  95.   Item_Desc[2] := ' Load Catalog ';
  96.   Item_Desc[3] := ' Locate...    ';
  97.   Item_Desc[4] := ' Save...      ';
  98.   Item_Desc[5] := ' Edit/Examine ';
  99.   Item_Desc[6] := ' Hardcopy     ';
  100.   Item_Desc[7] := ' Quit         ';
  101.   If Init_Gem >= 0 Then
  102.   Begin
  103.      Init_Mouse;
  104.      Menu := New_Menu(35, '  About Program   ');
  105.      X :=  1;
  106.      M_Title[X]:=Add_MTitle(Menu, Menu_Desc[X]);
  107.      For X :=  1 to 7 Do M_Item[X]:=Add_MItem(Menu, M_Title[1], Item_Desc[X]);
  108.      Draw_Menu( Menu ) ;
  109.   End;
  110. End;
  111.  
  112. Function upcase(c:char) : char;
  113. begin
  114.    if ord(c) in [$61..$7A] then upcase := chr(ord(c)-$20) else upcase := c;
  115. end;
  116.  
  117. Procedure upcase_string(var s : str255);
  118. var i : integer;
  119. begin
  120.   for i := 1 to length(s) do s[i] := upcase(s[i]);
  121. end;
  122.  
  123.  
  124. Procedure Get_Entry(prompt : str255;
  125.                     var input  : str255;
  126.                     size   : integer;
  127.                     var cancel : boolean);
  128. Var Box : Dialog_Ptr;
  129.     X : integer;
  130.     Item_String, Dummy_string, Default_str : Str255;
  131.     Item : Integer;
  132.     Button : Array [1..2] of Integer;
  133.     Button_String : Array[1..2] of Str255;
  134. Begin
  135.   X := Length(prompt) + Size + 10;
  136.   Box := New_Dialog(20,0,0,X,9);
  137.   dummy_string := '';
  138.   for x := 1 to size do dummy_string := concat(dummy_string,'_');
  139.   Item_String:= Concat(prompt,dummy_string);
  140.   Default_str := '';
  141.   Button_String[1] := 'Ok';
  142.   Button_String[2] := 'Cancel';
  143.   Item := Add_DItem(Box,G_FText, None, 1,3, 78, 1, 0, $1180 );
  144.   dummy_string := '';
  145.   for x := 1 to size do dummy_string := concat(dummy_string,'X');
  146.   Set_DEdit(Box,Item,Item_String,dummy_string,Default_str,System_Font,Te_Left);
  147.   Button[1]:=Add_DItem(Box,G_Button,Selectable|Exit_Btn|Default,3,6,10,1,0,0);
  148.   Set_DText(Box, Button[1], Button_String[1], System_Font, TE_Center ) ;
  149.   Button[2]:=Add_DItem(Box,G_Button,Selectable|Exit_Btn,15,6,10,1,0,0);
  150.   Set_DText(Box, Button[2], Button_String[2], System_Font, TE_Center ) ;
  151.   Center_Dialog(Box);
  152.   X :=Do_Dialog(Box,Item);
  153.   Get_DEdit(Box,Item,input);
  154.   upcase_string(input);
  155.   Cancel := (X = Button[2]);
  156.   if (not cancel) and (length(input) = 0) then cancel := true;
  157.   End_Dialog(Box);
  158.   Delete_Dialog(Box);
  159. End;
  160.  
  161. Procedure Non_Exist_Prompt;
  162. var x : integer;
  163. begin
  164.   X := Do_alert('[3][ | Nothing in memory!     ][ Continue ]',1);
  165. end;
  166.  
  167.  
  168. Procedure Do_Menu( title, item : integer ) ;
  169. Var
  170.   Alert : Str255 ;
  171.  
  172. Begin
  173.   If Title = 3 then About_Program;
  174.   Menu_Normal( Menu, Title ) ;
  175.   Choice := Item - 15;
  176. End;
  177.  
  178. Procedure Event_Loop ;
  179. Var
  180.   Which : Integer ;
  181.   Msg : Message_Buffer ;
  182.   dummy : integer;
  183.  
  184. Begin
  185.   which := Get_Event( E_Message, 0, 0, 0, 0,
  186.            false, 0, 0, 0, 0, false, 0, 0, 0, 0, msg,
  187.            dummy, dummy, dummy, dummy, dummy, dummy ) ;
  188.   Case Msg[0] of
  189.      MN_Selected :  Do_Menu( msg[3], msg[4] ) ;
  190.   End;
  191. End;
  192.  
  193.  
  194. Procedure set_dta( Var buf : frec );
  195. Gemdos($1a);
  196.  
  197.  
  198. Function get_first(Var path : path_type;
  199.                        search_attrib :integer ) : integer ;
  200. Gemdos($4e) ;
  201.  
  202.  
  203. Function get_next : integer;
  204. Gemdos($4f) ;
  205.  
  206. Procedure Do_Folder(Path_String : Str255);
  207. Var
  208.     dummy_string : Str255;
  209.     r : frec;
  210.     i : integer;
  211.     p : integer;
  212.  
  213.  
  214.     Procedure add_file(r : frec);
  215.     Var
  216.       i : integer;
  217.       end_string : boolean;
  218.     Begin
  219.       end_string := false;
  220.       Catalog[Rec_Count].fname := '';
  221.       i := 1 ;
  222.       while (i <= 12) and (not end_string) do
  223.       Begin
  224.         if (r.name[i] = chr(0)) then end_string := true
  225.          else
  226.           Catalog[Rec_Count].fname := concat(Catalog[rec_count].fname,
  227.              r.name[i]);
  228.         i := i + 1;
  229.       End;
  230.       Catalog[Rec_Count].folder_num := folder_max;
  231.       Catalog[Rec_Count].desc := '';
  232.       rec_count := rec_count + 1;
  233.     End;
  234.  
  235.  
  236. Begin
  237.   For i := 1 to length(path_string) do path[i] := path_string[i];
  238.   path[length(path_string)+1] := chr(0);
  239.   set_dta(r);
  240.   If get_first( path, $10 ) > -1 then
  241.   Repeat
  242.     if (r.attrib = $10) and (r.name[1] <> '.') then
  243.     begin
  244.       dummy_string := path_string;
  245.       i := 1;
  246.       While (i <= 14) AND (r.name[i] <> chr(0)) do
  247.       Begin
  248.         p:= pos('*.*',dummy_string);
  249.         insert(r.name[i],dummy_string,p);
  250.         i := i + 1
  251.       End;
  252.       p:= pos('*.*',dummy_string);
  253.       insert('\',dummy_string,p);
  254.       folder_array[folder_count] := dummy_string;
  255.       folder_count := folder_count + 1;
  256.     end else if r.name[1] <> '.' then add_file(r);
  257.   until get_next < 0 ;
  258. End;
  259.  
  260.  
  261. Procedure Log_Disk;
  262. var Log_drive : Str255;
  263.     cancel : boolean;
  264.  
  265. begin
  266.   Get_Entry(' Log which drive? ',Log_drive,1,cancel);
  267.   if (not cancel) and (Log_drive[1] in ['A'..'P']) then
  268.   begin
  269.     Set_Mouse(M_Bee);
  270.     Log_drive := Concat(Log_Drive,':\*.*');
  271.     folder_count := 1;
  272.     rec_count := 1;
  273.     folder_max := 1;
  274.     folder_array[1] := Log_drive;
  275.     folder_count := folder_count + 1;
  276.     do_folder(Log_drive);
  277.     if folder_count-1 > 1 then
  278.     begin
  279.       folder_max := folder_max + 1;
  280.       repeat
  281.         do_folder(folder_array[folder_max]);
  282.         folder_max := folder_max + 1;
  283.       until  folder_max = folder_count;
  284.     end;
  285.     Set_Mouse(M_Arrow);
  286.     If Rec_Count <= 1 then Non_Exist_Prompt;
  287.   end;
  288. end;
  289.  
  290.  
  291. Procedure Load_file;
  292. var log_drive,fil,pat : Str255;
  293.     x : integer;
  294.     cancel : boolean;
  295.     outfile : text;
  296. Begin
  297.   Get_Entry(' Data files are on which drive? ',Log_drive,1,cancel);
  298.   if not (Log_drive[1] in ['A'..'P']) then cancel:= true;
  299.   if not cancel then
  300.   begin
  301.     pat:=concat(log_drive,':\CATALOG.INF\*.*');
  302.     fil:='';
  303.     if get_in_file(pat,fil) then
  304.     begin
  305.       set_mouse(M_bee);
  306.       IO_check(false);
  307.       Reset(outfile,fil);
  308.       if IO_result = 0 then
  309.       begin
  310.         readln(outfile,Disk_name);
  311.         readln(outfile,folder_count);
  312.         for x := 1 to folder_count do readln(outfile,folder_array[x]);
  313.         readln(outfile,rec_count);
  314.         for x := 1 to rec_count -1 do
  315.         begin
  316.           readln(outfile,catalog[x].folder_num);
  317.           readln(outfile,catalog[x].fname);
  318.           readln(outfile,catalog[x].desc);
  319.         end;
  320.         close(outfile);
  321.         disk_name :=concat(fil,', ',disk_name);
  322.         x := pos('\CATALOG.INF',disk_name);
  323.         delete(disk_name,x,12);
  324.       end
  325.       else X := Do_alert('[2][ | Disk problem...        ][ Abort ]',1);
  326.       set_mouse(M_Arrow);
  327.       IO_Check(True);
  328.     end;
  329.   end;
  330. End;
  331.  
  332.  
  333. Procedure Save_file;
  334. var cancel : boolean;
  335.     name,fil,pat,prompt,log_drive : Str255;
  336.     x : integer;
  337.     outfile : text;
  338. Begin
  339.   prompt :=' Description of disk contents: ';
  340.   Get_Entry(prompt,name,30,cancel);
  341.   if not cancel then
  342.   begin
  343.     disk_name := name;
  344.     Get_Entry(' Data files are on which drive? ',Log_drive,1,cancel);
  345.     if not (Log_drive[1] in ['A'..'P']) then cancel:= true;
  346.   end;
  347.   if (not cancel) then
  348.   begin
  349.     pat:=concat(Log_drive,':\CATALOG.INF\*.*');
  350.     fil:='';
  351.     if (get_in_file(pat,fil)) and (Get_Out_file('Are you sure?',fil)) then
  352.     begin
  353.       IO_Check(false);
  354.       Rewrite(outfile,fil);
  355.       if IO_Result = 0 then
  356.       begin
  357.         set_mouse(M_bee);
  358.         writeln(outfile,name);
  359.         writeln(outfile,folder_count);
  360.         for x := 1 to folder_count do writeln(outfile,folder_array[x]);
  361.         writeln(outfile,rec_count);
  362.         for x := 1 to rec_count -1 do
  363.         begin
  364.           writeln(outfile,catalog[x].folder_num);
  365.           writeln(outfile,catalog[x].fname);
  366.           writeln(outfile,catalog[x].desc);
  367.         end;
  368.         close(outfile);
  369.         disk_name :=concat(fil,', ',disk_name);
  370.         x := pos('\CATALOG.INF',disk_name);
  371.         delete(disk_name,x,12);
  372.         set_mouse(M_arrow);
  373.       end else X := Do_alert('[3][ | Disk problem...     ][ Abort ]',1);
  374.       IO_Check(true);
  375.     End;
  376.   End;
  377. End;
  378.  
  379.  
  380. Procedure Print_file;
  381. Var I,
  382.     prev_folder : integer;
  383.     F : Text;
  384. Begin
  385.   I := Do_alert('[2][ | Hardcopy...            ][ Yes | No ]',1);
  386.   If i = 1 then
  387.   begin
  388.     Set_Mouse(M_Bee);
  389.     rewrite(F,'LST:');
  390.     prev_folder := 0;
  391.     writeln(f,disk_name);
  392.     writeln(f);
  393.     for i := 1 to rec_count -1 do
  394.     begin
  395.        if prev_folder <> Catalog[i].folder_num then
  396.        writeln(F,Folder_array[Catalog[i].folder_num]);
  397.        writeln(F,'   ',Catalog[i].fname,'   ',Catalog[i].desc);
  398.        prev_folder := Catalog[i].folder_num;
  399.     end;
  400.     Set_Mouse(M_arrow);
  401.   end;
  402. End;
  403.  
  404. Procedure Locate_file;
  405. var i, x : integer;
  406.     Log_drive,fspec,prompt,search_string,inline : str255;
  407.     cancel,found,error : boolean;
  408.     infile : text;
  409. Begin
  410.    Get_Entry(' Data files are on which drive? ',Log_drive,1,cancel);
  411.    if (not cancel) and (Log_drive[1] in ['A'..'P']) then
  412.    begin
  413.      folder_count := 1;
  414.      rec_count := 1;
  415.      Log_drive := Concat(Log_Drive,':\CATALOG.INF\*.*');
  416.      folder_array[1] := Log_drive;
  417.      folder_count := folder_count + 1;
  418.      do_folder(Log_drive);
  419.      folder_max := folder_max + 1;
  420.      found := false;
  421.      X := 1;
  422.      prompt := 'Search for filespec/Description: ';
  423.      Get_Entry(prompt,search_string,30,cancel);
  424.      if not cancel then
  425.      begin
  426.        IO_Check(False);
  427.        set_mouse(M_Bee);
  428.        error := false;
  429.        while (X < rec_count) and (not found) and (not error) do
  430.        begin
  431.          fspec := concat(Folder_array[1],catalog[x].fname);
  432.          i := pos('*.*',fspec);
  433.          delete(fspec,i,3);
  434.          reset(infile,fspec);
  435.          if IO_Result <> 0 then error := true else
  436.          while not eof(infile) do
  437.          begin
  438.            readln(infile,inline);
  439.            while (inline[length(inline)] = ' ') do
  440.            begin
  441.              i := length(inline);
  442.              delete(inline,i,1);
  443.            end;
  444.            if pos(search_string,inline) > 0 then found := true;
  445.          end;
  446.          X := X + 1;
  447.        end;
  448.        set_mouse(M_arrow);
  449.        IO_Check(True);
  450.        if error then x := do_alert('[2][ | Disk problem...   ][ Abort ]',1)
  451.        else if found then
  452.        begin
  453.          prompt := concat('[1][ | Found ', search_string,
  454.             '| in ',fspec,'][Done]');
  455.          X := Do_alert(prompt,1);
  456.        end
  457.        else
  458.        begin
  459.          prompt := concat('[1][ | Could not find:| ',search_string,'][Done]');
  460.          X := Do_alert(prompt,1);
  461.        end;
  462.        rec_count := 0;
  463.      End;
  464.    end;
  465. End;
  466.  
  467.  
  468.  
  469. Procedure Edit_Routine(start : integer; var button_choice: integer);
  470. Var
  471.     Left,
  472.     Top,
  473.     Height,
  474.     X,
  475.     Dummy  : Integer;
  476.     Dummy_String : Str255;
  477.     ct : integer;
  478.     Item_String,Edit_String,Default: Array[1..17] of Str255;
  479.     Edit,Item : Array [1..17] of Integer;
  480.     Button : Array [1..8] of Integer;
  481.     Button_String : Array[1..8] of Str255;
  482.     Box : Dialog_Ptr;
  483.     End_Folder : Boolean;
  484.     Current_Folder : integer;
  485.     Start_dialog, Edit_max : integer;
  486. Begin
  487.   Box := New_Dialog(60,0,0,78,23);
  488.   Start_Dialog := 0;
  489.   edit_max := 0;
  490.   ct := 1;
  491.   Current_folder :=  Catalog[ct+start-1].folder_num;
  492.   end_folder := false;
  493.   while (CT < 15) and (CT < rec_count) and (not end_folder) do
  494.   begin
  495.     if current_folder = Catalog[CT+Start-1].folder_num then
  496.     begin
  497.       if start_dialog = 0 then start_dialog := Edit[CT];
  498.       Item_String[CT]:=Concat('  ',Catalog[CT+start-1].fname);
  499.       Default[CT] := Catalog[ct+start-1].desc;
  500.       Item[ct] := Add_DItem(Box,G_String,None,1,ct+1,0,1,0,0);
  501.       Set_DText(Box,Item[ct],Item_String[ct],System_Font,Te_Left);
  502.       Dummy_String := '________________________________________';
  503.       Edit[CT]:= Add_DItem(Box,G_FText,None,35,CT+1,50,1,0,$1180);
  504.       Set_DEdit(Box,Edit[CT],Dummy_String,
  505.                 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
  506.                 Default[CT], System_Font,Te_Left);
  507.       CT := CT + 1;
  508.       edit_max := edit_max + 1;
  509.     end else end_folder := true;
  510.   end;
  511.   Button_String[1] := '<<';
  512.   Button_String[2] := '>>';
  513.   Button_String[3] := 'Exit';
  514.   Button_String[4] := 'Prev Dir';
  515.   Button_String[5] := 'Next Dir';
  516.   Button_String[6] := 'Search';
  517.   Button_String[7] := 'Add';
  518.   Button_String[8] := 'Delete';
  519.   x:=Add_DItem(Box,G_String,None,1,1,0,1,0,0);
  520.   Dummy_String := Concat('Description of files in directory: ',
  521.                  Folder_array[Catalog[start].folder_num]);
  522.   Set_DText(Box,x,Dummy_String,System_Font,Te_Left);
  523.   Dummy_String := Concat('  Contents: ',disk_name);
  524.   x:=Add_DItem(Box,G_String,None,1,17,0,1,0,0);
  525.   Set_DText(Box,x,Dummy_String,System_Font,Te_left);
  526.  
  527.   For X := 1 to 3 do
  528.   Begin
  529.     Button[x]:=Add_DItem(Box,G_Button,
  530.      Selectable|Touch_Exit,((x-1)*12)+3,19,10,1,0,0);
  531.     Set_DText(Box, Button[x], Button_String[x], System_Font, TE_Center ) ;
  532.   End;
  533.   For X := 4 to 8 do
  534.   Begin
  535.     Button[x]:=Add_DItem(Box,G_Button,
  536.      Selectable|Touch_Exit,((x-4)*12)+3,21,10,1,0,0);
  537.     Set_DText(Box, Button[x], Button_String[x], System_Font, TE_Center ) ;
  538.   End;
  539.  
  540.  Center_Dialog(Box);
  541.   X :=Do_Dialog(Box,Start_dialog);
  542.   for ct := 1 to 8 do if x = button[ct] then button_choice := ct;
  543.   if edit_max <> 0 then
  544.   for ct := 1 to Edit_Max do
  545.   begin
  546.     Get_DEdit(Box,Edit[CT],dummy_string);
  547.     upcase_string(dummy_string);
  548.     Catalog[Start+CT-1].desc := copy(dummy_string,1,length(Dummy_String));
  549.   end;
  550.   End_Dialog(Box);
  551.   Delete_Dialog(Box);
  552. End;
  553.  
  554. Procedure Edit_File;
  555. var ct, edit_start,prev_folder,button : integer;
  556.     dummy_string : str255;
  557.     search_result : boolean;
  558.  
  559.  
  560.     Procedure Next_Dir;
  561.     begin
  562.       ct := edit_start;
  563.       prev_folder := catalog[ct].folder_num;
  564.       while (Prev_folder = catalog[ct].folder_num) and (ct<rec_count-1) do
  565.         ct := ct + 1;
  566.       if (prev_folder <> catalog[ct].folder_num) then edit_start := ct;
  567.     end;
  568.  
  569.     Procedure Prev_Dir;
  570.     var folder_found : boolean;
  571.     begin
  572.       ct := edit_start;
  573.       prev_folder := catalog[ct].folder_num;
  574.       folder_found := false;
  575.       while (not folder_found) and (CT > 1) do
  576.        if (prev_folder <> catalog[ct].folder_num) then folder_found:=true else
  577.           ct := ct - 1;
  578.       if folder_found then
  579.       begin
  580.         prev_folder := catalog[ct].folder_num;
  581.         folder_found := false;
  582.         while (not folder_found) and (CT > 1) do
  583.         if (prev_folder<> catalog[ct].folder_num) then folder_found:=true else
  584.            ct := ct - 1;
  585.         edit_start := ct+1;
  586.       end;
  587.     end;
  588.  
  589.  
  590.     Procedure Down_Page;
  591.     var s : integer;
  592.     begin
  593.       s := edit_start;
  594.       edit_start:=edit_start +14;
  595.       if edit_start > rec_count-1 then edit_start := s;
  596.       if catalog[s].folder_num <> catalog[edit_start].folder_num then
  597.         begin
  598.           edit_start := s;
  599.           next_dir;
  600.         end;
  601.     end;
  602.  
  603.     Procedure Up_Page;
  604.     var s : integer;
  605.     begin
  606.       s := edit_start;
  607.       edit_start:=edit_Start-14;
  608.       if edit_start < 1 then edit_start := 1;
  609.       if catalog[s].folder_num <> catalog[edit_start].folder_num then
  610.         begin
  611.           edit_start := s;
  612.           prev_dir;
  613.         end;
  614.     end;
  615.  
  616.     Procedure search_spec(prompt : str255; var found : boolean);
  617.     var cancel : boolean;
  618.         search_string : Str255;
  619.     begin
  620.       found := false;
  621.       Get_Entry(prompt,search_string,12,cancel);
  622.       if not cancel then
  623.       begin
  624.         search_string :=concat(search_string,'                    ');
  625.         CT := Edit_start;
  626.         while (CT < rec_count ) and (not found) do
  627.           if pos(catalog[ct].fname,search_string) > 0 then found := true
  628.               else ct := ct + 1;
  629.         if found then edit_start := ct
  630.            else Ct := Do_alert('[1][ | Spec not found.     ][ Continue ]',1);
  631.       end;
  632.     end;
  633.  
  634.     Procedure add_spec;
  635.     var fil,pat : str255;
  636.         i : integer;
  637.         exit_loop, newfolder : boolean;
  638.     Begin
  639.        fil := '';
  640.        pat := folder_array[catalog[edit_start].folder_num];
  641.        if get_in_file(pat,fil) then
  642.        begin
  643.          pat[1]:=folder_array[catalog[edit_start].folder_num,1];
  644.          i := length(fil);
  645.          exit_loop := false;
  646.          while (I >0) and (not exit_loop) do
  647.           if (fil[I]='\') or (fil[i]=':') then exit_loop := true
  648.            else i := i - 1;
  649.          if i <> 0 then delete(fil,1,i);
  650.          fil := concat(fil,'            ');
  651.          newfolder := true;
  652.          for i := 1 to folder_count-1 do
  653.            if pat = folder_array[i] then newfolder := false;
  654.          if newfolder then
  655.          begin
  656.            folder_array[folder_count] := pat;
  657.            catalog[rec_count].folder_num := folder_count;
  658.            catalog[rec_count].fname := copy(fil,1,12);
  659.            catalog[rec_count].desc := '';
  660.            edit_start := rec_count;
  661.            rec_count := rec_count + 1;
  662.            folder_count := folder_count + 1;
  663.          end
  664.          else
  665.          begin
  666.            exit_loop := false;
  667.            i := 1;
  668.            while (I < rec_count) and (not exit_loop) do
  669.             if folder_array[catalog[i].folder_num] = pat then exit_loop:=true
  670.                 else I := I + 1;
  671.            edit_start := i;
  672.           for i:= rec_count downto edit_start+1 do catalog[i] := catalog[i-1];
  673.            catalog[i].fname := copy(fil,1,12);
  674.            catalog[i].desc := '';
  675.            rec_count := rec_count + 1;
  676.          end;
  677.        end;
  678.    end;
  679.  
  680.    Procedure delete_spec;
  681.    var dummy_string : str255;
  682.        found : boolean;
  683.        i : integer;
  684.  
  685.    begin
  686.      dummy_string := ' Delete filespec : ';
  687.      search_spec(dummy_string,found);
  688.      if found then
  689.      begin
  690.        for i := edit_start to rec_count-1 do catalog[i]:= catalog[i+1];
  691.        rec_count := rec_count-1;
  692.        if edit_start > rec_count-1 then edit_start := rec_count-1;
  693.      end;
  694.    end;
  695.  
  696.  
  697. Begin
  698.   Edit_start := 1;
  699.   dummy_string := ' Search for filespec: ';
  700.   repeat
  701.     Edit_routine(edit_start,button);
  702.     Case button of
  703.             1 : up_page;
  704.             2 : down_page;
  705.             4 : if (edit_start > 1) then prev_dir;
  706.             5 : next_dir;
  707.             6 : search_spec(dummy_string,search_result);
  708.             7 : add_spec;
  709.             8 : delete_spec;
  710.          end;
  711.   until button = 3;
  712. end;
  713.  
  714. Begin { Main Program }
  715.   Gem_Initialize;
  716.   About_Program;
  717.   Disk_name :='Unknown';
  718.   Rec_count := 0;
  719.   While 1=1 Do
  720.   Begin
  721.     Draw_Menu (Menu);
  722.     Event_loop;
  723.     Erase_menu( menu );
  724.     if Choice = 7 then
  725.     if do_alert('[2][ | Exit Program...       |][ Yes | No ]',1) = 1 then
  726.     Begin
  727.       Erase_menu(menu);
  728.       Exit_Gem;
  729.       Halt;
  730.     End;
  731.     If Choice = 1 then Log_disk;
  732.     If Choice = 2 then Load_file;
  733.     If Choice = 3 then Locate_file;
  734.     If (Choice in [4..6]) and (Rec_count <= 1) then Non_Exist_prompt
  735.     else
  736.     begin
  737.       If Choice = 4 then Save_file;
  738.       If Choice = 5 then Edit_file;
  739.       If Choice = 6 then Print_file;
  740.     end;
  741.     Choice := 0;
  742.   End;
  743. End.
  744.  
  745.  
  746.  
  747.  
  748.  
  749.  
  750.  
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.  
  761.  
  762.  
  763.  
  764.  
  765.  
  766.  
  767.  
  768.  
  769.  
  770.  
  771.  
  772.  
  773.  
  774.  
  775.  
  776.  
  777.  
  778.  
  779.  
  780.  
  781.  
  782.  
  783.  
  784.  
  785.  
  786.  
  787.  
  788.  
  789.  
  790.  
  791.  
  792.  
  793.