home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / utility / crossref / pxl / pxlmenu.pas < prev    next >
Pascal/Delphi Source File  |  1988-05-04  |  19KB  |  551 lines

  1. {$R-}    {Range checking off}                                         {.CP13}
  2. {$B+}    {Boolean complete evaluation on}
  3. {$S+}    {Stack checking on}
  4. {$I+}    {I/O checking on}
  5. {$N-}    {No numeric coprocessor}
  6.  
  7. Unit PXLMENU;
  8.  
  9. Interface
  10.  
  11. Uses
  12.   Crt,
  13.   Dos,
  14.   PXLINIT;
  15.  
  16.  
  17. procedure Menu;
  18.  
  19. procedure SetStyle;
  20.  
  21. procedure LoadReserv(var Reserv: ResArr);    {See comments in Implementation}
  22.  
  23. procedure Initialize;
  24.  
  25. {===========================================================================}
  26.  
  27. Implementation
  28.  
  29. procedure Menu;                                                        {.CP7}
  30. var
  31.    Answer: char;
  32.    Ext,NameFirm,
  33.    Instructed,
  34.    NameInComLine,
  35.    GotFile:        boolean;
  36.  
  37.    procedure EnterName;                                               {.CP10}
  38.    begin
  39.       Blank(10,17);
  40.       CenterCRT('What File do you want to list?',10,Bright,0);
  41.       GotoXY(34,12); Filename := EditTrm(40);  {instead of read for neat Esc}
  42.       if (FileName[1]=#27) or (FileName[1]=#3) then
  43.          GetOutOfHere;
  44.       FixupFileName(FileName);
  45.       Command := #0;
  46.    end; {EnterName}
  47.  
  48.    procedure GetInstructions(Ans: CMD);                               {.CP16}
  49.    var
  50.       B:   byte;
  51.    begin
  52.       Instructed := False;
  53.       Ans := InCapitals(Ans);
  54.       if pos('X',Ans)<>0 then XRef := True else XRef := False;
  55.       if pos('W',Ans)<>0 then Wide := True else Wide := False;
  56.       if (pos('F',Ans)<>0) and (Inst[FF,1]=12) then
  57.          FFeed := True else FFeed := False;
  58.       if pos('P',Ans)<>0 then begin
  59.          Plain := True;
  60.          Ans := 'P'  { P blanks L and M }
  61.       end {if P}
  62.       else {not plain}
  63.          Plain := False;
  64.       if pos('L',Ans)<>0                                              {.CP14}
  65.          then NumberLines := True
  66.          else Numberlines := False;
  67.       if pos('M',Ans)<>0 then Mrk  := True else Mrk  := False;
  68.       if XRef and not (Plain or NumberLines or Mrk)
  69.          then XRefOnly := True
  70.          else XRefOnly := False;
  71.       if Plain or NumberLines or XRef or Mrk or Wide then
  72.          Instructed := True;
  73.       if InABatch and (not Instructed) then begin
  74.          Plain := True;
  75.          Instructed := True
  76.       end {if InABatch &c}
  77.    end; {GetInstructions}
  78.  
  79.    procedure ReadComLine;                                             {.CP20}
  80.    var
  81.       B:      byte;
  82.    begin  {ReadComLine}
  83.       Command := '';
  84.       Instructed := False;
  85.       if ParamCount=0 then
  86.          FileName := ''
  87.       else begin
  88.          FileName := InCapitals(ParamStr(1));
  89.          FixupFileName(FileName);
  90.          if ParamCount>1 then begin
  91.             for B := 2 to ParamCount do
  92.                Command := Command + InCapitals(ParamStr(B));
  93.             if pos('BAT',Command)<>0 then InABatch := True;
  94.             if Escape then GetOutOfHere;
  95.             GetInstructions(Command);
  96.          end {else if got more params}
  97.       end; {else got params)}
  98.     end; {ReadComLine}
  99.  
  100.    function LongDate(Day,Month,Year: word): Str20;                     {.CP9}
  101.    const
  102.       Months: array[1..12] of Str5 = (
  103.               'Jan.','Feb.','March','April','May','June',
  104.               'July','Aug.','Sept.','Oct.','Nov.','Dec.');
  105.    begin {FileDate}
  106.       LongDate := Months[Month] + ' ' + StrgI(Day,1) + ', '
  107.                 + StrgI(Year,1);
  108.    end; {LongDate}
  109.  
  110.    function ShortDate(Day,Month,Year: word): Str9;                     {.CP5}
  111.    begin {FileDate}
  112.       ShortDate := StrgI(Month,1) + '/' + StrgI(Day,1) + '/'
  113.                 + StrgI(Year-1900,1);
  114.    end; {ShortDate}
  115.  
  116.    function LongTime(Hour,Min,Sec: word): Str20;                      {.CP23}
  117.    var
  118.       Temp: Str20;
  119.    begin
  120.       if Sec>=30 then inc(Min);
  121.       if Min>59 then begin
  122.          inc(Hour);
  123.          Min := 0;
  124.       end; {if Min}
  125.       Temp := ' pm';
  126.       case hour of
  127.          0:      begin
  128.                     Hour := 12;
  129.                     Temp := ' am'
  130.                  end; {midnight-1 am}
  131.          13..24: Hour := Hour - 12;
  132.          else    Temp := ' am'
  133.       end; {case hour}
  134.       Temp := StrgI(Min,1) + Temp;
  135.       if Min<10
  136.          then LongTime := StrgI(Hour,1) + ':0' + Temp
  137.          else LongTime := StrgI(Hour,1) + ':' + Temp
  138.    end; {LongTime}
  139.  
  140.    function MilTime(Hour,Min,Sec: word): Str10;
  141.    begin
  142.       if Sec>29 then inc(Min);
  143.       if Min>59 then begin
  144.          inc(Hour);
  145.          Min := 0;
  146.       end; {if Min}
  147.       if Hour>23 then Hour := 0;
  148.       if Min<10
  149.          then MilTime := StrgI(Hour,1) + ':0' + StrgI(Min,1)
  150.          else MilTime := StrgI(Hour,1) + ':'  + StrgI(Min,1)
  151.    end; {MilTime}
  152.  
  153.    procedure MakeFileDateAndTime(FilName: LineType);
  154.    {Returns Date of file}
  155.    var
  156.       DTInt:          longint;
  157.       DT:             DateTime;
  158.       Fil:            file;
  159.       GotFile:        boolean;
  160.  
  161.    begin {MakeFileDateAndTime}
  162.       assign(Fil,FilName);
  163.       {$I-}
  164.       reset(Fil);
  165.       {$I+}
  166.       GetFTime(Fil,DTint);
  167.       close(Fil);
  168.       UnpackTime(DTint,DT);
  169.       FileDate := LongDate(DT.Day,DT.Month,DT.Year);
  170.       FileTime := LongTime(DT.Hour,DT.Min,DT.Sec);
  171.    end; {FileDateAndTime}
  172.  
  173.    function PresentDate: LineType;                                     {.CP7}
  174.    var
  175.       Mon,Day,Year,DayOWeek:word;
  176.    begin
  177.       GetDate(Year,Mon,Day,DayOWeek);
  178.       PresentDate := ShortDate(Day,Mon,Year);
  179.    end; {PresentDate}
  180.  
  181.    function PresentTime: LineType;                                     {.CP8}
  182.    var
  183.       Hr,Min,Sec,Sec100: word;
  184.    begin
  185.       GetTime(Hr,Min,Sec,Sec100);
  186.       if Sec100>49 then inc(Sec);
  187.       PresentTime := MilTime(Hr,Min,Sec);
  188.    end; {PresentTime}
  189.  
  190.    procedure GetFileAndDate;                                          {.CP17}
  191.    var
  192.       Local:  LineType;
  193.    begin
  194.       GotFile := FindFile(FileName);     {returns FALSE or openable filename}
  195.       if GotFile then begin
  196.          MakeFileDateandTime(FileName);
  197.          Local := FileName;
  198.          PathSign := '';
  199.          while (pos(':',Local)<>0) or (pos('\',Local)<>0) do begin
  200.             PathSign := PathSign + Local[1];
  201.             delete(Local,1,1)
  202.         end {while}
  203.      end {if GotFile}
  204.      else
  205.         if InABatch then GetOutOfHere;
  206.    end; {GetFileAndDate}
  207.  
  208.    procedure PostFile;                                                 {.CP4}
  209.    begin
  210.       CenterCRT(FileName + ', Created ' + FileTime + ', ' + FileDate, 7,Bright,Inside);
  211.    end; {PostFile}
  212.  
  213.    function OptionsOK: boolean;                                       {.CP20}
  214.    const
  215.       Yes: set of char = [#13,'Y','y'];
  216.    var
  217.       Yep: char;
  218.       Row: byte;
  219.  
  220.       procedure CheckBill;
  221.       const
  222.          Col = 29;
  223.       var
  224.          ShortName: LineType;
  225.       begin
  226.          ShortName := Shortened(FileName);
  227.          Blank(8,16);
  228.          if XRefOnly then begin
  229.             CenterCRT('You want to cross-reference '+ShortName,11,Bright,0);
  230.             if Wide or FFeed then
  231.                CenterCRT('without printing the source code and',12,Bright,0)
  232.             else
  233.                CenterCRT('without printing the source code',12,Bright,0);
  234.             Row := 13;
  235.          end {if XRefOnly}
  236.          else begin                                                    {.CP9}
  237.             Row := 10;
  238.             WriteCRT('You want to print '+ShortName+' and',Row,24,Bright);
  239.             inc(Row);
  240.             if Mrk then
  241.                WriteCRT('M  Mark the key words',Row,Col,Bright)
  242.             else
  243.                WriteCRT('P  Leave the key words plain',Row,Col,Bright);
  244.             inc(Row);
  245.             if NumberLines then begin                                 {.CP15}
  246.                WriteCRT('L  Number the lines',Row,Col,Bright);
  247.                inc(Row);
  248.                if Mrk
  249.                   then WriteCRT('   & count B/E pairs',Row,Col,Bright)
  250.                   else dec(Row);
  251.             end {if NumberLines}
  252.             else
  253.                WriteCRT('   NOT numbering the lines',Row,Col,Bright);
  254.             if XRef then begin
  255.                inc(Row);
  256.                WriteCRT('X  Cross-Reference the Identifiers  ',
  257.                           Row,Col,Bright);
  258.             end; {if XRef}
  259.          end; {else --not XRefOnly}
  260.          if Wide then begin                                           {.CP11}
  261.             inc(Row);
  262.             WriteCRT('W  Print the text very small        ',
  263.                       Row,Col,Bright);
  264.          end; {if Wide}
  265.          if FFeed then begin
  266.             inc(Row);
  267.             WriteCRT('F  Feed out a blank page first      ',
  268.                       Row,Col,Bright);
  269.          end {if FFeed}
  270.       end; {CheckBill}
  271.  
  272.    begin {OptionsOK}                                                  {.CP19}
  273.       if InABatch then
  274.          OptionsOK := True
  275.       else begin
  276.          CheckBill;
  277.          inc(Row);
  278.          if Row<17 then inc(Row);
  279.          WriteCRT('Is that correct? ',Row,24,Bright);
  280.          GotoXY(41,Row);
  281.          CursorOn;
  282.          Yep := KBin(Ext);
  283.          CursorOff;
  284.          if Yep in Triggers
  285.             then GetOutOfHere
  286.             else write(Yep);
  287.          Blank(16,Row);
  288.          OptionsOK := Yep in Yes
  289.       end {else not InABatch}
  290.    end; {OptionsOK}
  291.  
  292.    procedure Options;                                                 {.CP16}
  293.    var
  294.       Ans: CMD;
  295.  
  296.       procedure OptionsBillboard;
  297.       begin
  298.          GotoXY(23,10);
  299.          WriteCRT('Options: L for Line Numbering              '
  300.                   ,10,23,Bright);
  301.          WriteCRT('   M for Mark KeyWords               ',11,29,Bright);
  302.          WriteCRT('   X for X-Ref (Cross-reference)     ', 12,29,Bright);
  303.          WriteCRT('   W for Wide text (>79 columns)     ', 13,29,Bright);
  304.          if Inst[FF,1]=12 then begin
  305.             WriteCRT('   F for Feed out a blank page       ', 14,29,Bright)
  306.          end; {if Inst}
  307.       end; {OptionsBillboard}
  308.  
  309.    begin {Options}                                                    {.CP11}
  310.       Blank(8,16);
  311.       OptionsBillboard;
  312.       GotoXY(37,15); Ans := EditTrm(5);
  313.       if Ans='' then
  314.          Ans := 'P'
  315.       else if Ans[1] in triggers then
  316.          GetOutOfHere;
  317.       delay(200);
  318.       GetInstructions(Ans);
  319.    end; {Options}
  320.  
  321.    function NameOK: boolean;                                          {.CP20}
  322.    begin
  323.       Blank(7,16);
  324.       CenterCRT('Listing: ' + Filename + ', OK? ',11,Bright,0);
  325.       GotoXY(39,13);
  326.       CursorOn;
  327.       Answer := KBin(Ext);
  328.       CursorOff;
  329.       if Answer in Triggers then
  330.          GetOutOfHere
  331.       else if Answer=#13 then
  332.          Answer := 'Y';
  333.       write(Answer);
  334.       if Answer in [#13,'Y','y'] then begin
  335.          NameOK := True;
  336.          PostFile
  337.       end {if Y}
  338.       else
  339.          NameOK := False;
  340.    end; {NameOK}
  341.  
  342.    procedure NoSuchFile;                                               {.CP9}
  343.    begin
  344.       Beep;
  345.       Blank(8,12);
  346.       CenterCRT('Can''t find ' + Filename,7,Bright,0);
  347.       Bop;
  348.       if InABatch
  349.          then GetOutOfHere
  350.    end; {NoSuchFile}
  351.  
  352.    procedure GetID;                                                   {.CP16}
  353.    var
  354.       IDFile:      text;
  355.       FilNam:      LineType;
  356.    begin
  357.       FilNam := 'PXL.ID';
  358.       if FindFile(FilNam) then begin
  359.          assign(IDFile,FilNam);
  360.          reset(IDFile);
  361.          read(IDFile,UserID);
  362.          close(IDFile);
  363.          (* if Length(UserID)<24 then UserID := '[' + UserID + ']'*)
  364.       end {if no error}
  365.       else
  366.          UserID := ''
  367.    end; {GetID}
  368.  
  369.    procedure FirmUpName;                                              {.CP12}
  370.    begin
  371.       repeat
  372.          repeat
  373.             EnterName;
  374.             GetFileAndDate;              {Get creation date & set GotFile}
  375.             if not GotFile then NoSuchFile;            {Execute EnterName}
  376.          until GotFile;
  377.          NameFirm := NameOK=True;
  378.       until NameFirm;
  379.       PostFile
  380.    end; {FirmUpName}
  381.  
  382.    procedure FirmUpInstructions;                                       {.CP10}
  383.    var
  384.       Firm: boolean;
  385.    begin
  386.       Firm := False;
  387.       while not Firm do begin
  388.          Options;
  389.          if OptionsOK then Firm := True
  390.       end {while}
  391.    end; {FirmUpInstructions}
  392.  
  393. begin  {Menu}                                                         {.CP18}
  394.    Mrk := False; NumberLines := False; Wide := False; Enough := False;
  395.    XRef := False; XRefOnly := False; NRes := 48; InABatch := False;
  396.    NameInComLine := False; NameFirm := False; GotFile := False;
  397.    GetPrinterData;                           {Get printer specs from PXL.PRN}
  398.    ReadComLine;                      {Seek FileName, InABatch & Instructions}
  399.    if (FileName='') then
  400.       FirmUpName
  401.    else begin                      {Name in ComLine, maybe Instructions, too}
  402.       NameInComLine := True;
  403.       GetFileAndDate;                     {Exits on InABatch and Not GotFile}
  404.       if GotFile then
  405.          PostFile
  406.       else begin
  407.          NoSuchFile;
  408.          FirmUpName;
  409.       end; {else not GotFile}
  410.    end; {else FileName}
  411.    if Instructed then                   {instructed by ComLine}       {.CP19}
  412.       if not OptionsOK then begin
  413.          Instructed := False;
  414.          if not NameFirm then
  415.               if not NameOK then FirmUpName;
  416.          FirmUpInstructions
  417.       end; {if not OptionsOK}
  418.    if not Instructed then begin
  419.       Options;
  420.       if not OptionsOK then begin
  421.          if NameInComLine and not NameFirm then
  422.             if not NameOK then FirmUpName;
  423.          FirmUpInstructions;
  424.       end; {if not OptionsOK}
  425.       Instructed := True
  426.    end; {if not Instructed}
  427.    GetID;
  428.    PrintTime := PresentTime;
  429.    PrintDate := PresentDate
  430. end;  {Menu}
  431.  
  432. procedure SetStyle;                                                   {.CP20}
  433. var
  434.    I:              integer;
  435.    T:              TpFace;
  436. begin
  437.    for T := MrkB to CondE do begin               {if nothing in Inst[T] then}
  438.       Istring[T] := '';                                  {Istring[T] is null}
  439.       for I := 1 to Inst[T,0] do Istring[T] := Istring[T] + Chr(Inst[T,I])
  440.    end; {for T}
  441.    if Inst[FF,1]<>12 then  {can't FF w/o #12 -dunno where on 1st page we are}
  442.       FFeed := False;
  443.    if Mrk then begin
  444.       Opening := Istring[MrkB];                           {Start underlining}
  445.       Closing := Istring[MrkE]                             {Stop underlining}
  446.    end {if Mrk}
  447.    else begin
  448.       Opening := '';
  449.       Closing := ''
  450.    end {else --not Mrk}
  451. end; {SetStyle}
  452.  
  453. procedure LoadReserv(var Reserv: ResArr);                              {.CP9}
  454.    {If constant DataFiles is set = True, this procedure will load the list  }
  455.    {of reserved words from file PXL.WDS, which must be on the default       }
  456.    {drive, and NRes (number of reserved words) will be set automatically    }
  457.    {below.  If you're adapting this to a Pascal other than Turbo 2 or 3, put}
  458.    {your list of reserved words in file, PXL.WDS, make sure Type Str10 is   }
  459.    {as long as your longest reserved word and Type ResArr has room enough,  }
  460.    {and set DataFiles = True.  If you want to load internally, set Data-    }
  461.    {Files = False, and (in Menu Procedure) make NRes = number of words.     }
  462.  
  463. procedure ReadWds; {from PXL.WDS}                                     {.CP24}
  464.    var
  465.       Fil:            text;
  466.       FilNam:         LineType;
  467.       Res:            Str10;
  468.       K,J:            integer;
  469.    begin
  470.       FilNam := 'PXL.WDS';
  471.       if FindFile(FilNam) then begin
  472.          assign(Fil,FilNam);
  473.          reset(Fil);
  474.          K := 0;
  475.          while not Eof(Fil) do begin
  476.             K := succ(K);
  477.             readln(Fil,Res);
  478.             for J := 1 to ord(Res[0]) do
  479.                Res[J] := UpCase(Res[J]);
  480.             Reserv[K] := Res
  481.          end; {while}
  482.          NRes := K;
  483.          close(Fil)
  484.       end {if no error}
  485.       else CantCont('PXL.WDS','Can''t find it on path.')
  486.    end; {ReadWds}
  487.  
  488.    procedure IntWds; {Set here for Turbo 2 or 3}                      {.CP28}
  489.    begin
  490.       {if DataFiles = False (& NRes = 48), reserved words will be set thus:}
  491.       Reserv[1]  := 'ABSOLUTE';       Reserv[2]  := 'AND';
  492.       Reserv[3]  := 'ARRAY';          Reserv[4]  := 'BEGIN';
  493.       Reserv[5]  := 'CASE';           Reserv[6]  := 'CONST';
  494.       Reserv[7]  := 'DIV';            Reserv[8]  := 'DO';
  495.       Reserv[9]  := 'DOWNTO';         Reserv[10] := 'ELSE';
  496.       Reserv[11] := 'END';            Reserv[12] := 'EXTERNAL';
  497.       Reserv[13] := 'FILE';           Reserv[14] := 'FOR';
  498.       Reserv[15] := 'FORWARD';        Reserv[16] := 'FUNCTION';
  499.       Reserv[17] := 'GOTO';           Reserv[18] := 'IF';
  500.       Reserv[19] := 'IMPLEMENTATION'; Reserv[20] := 'IN';
  501.       Reserv[21] := 'INLINE';         Reserv[22] := 'INTERFACE';
  502.       Reserv[23] := 'INTERRUPT';      Reserv[24] := 'LABEL';
  503.       Reserv[25] := 'MOD';            Reserv[26] := 'NIL';
  504.       Reserv[27] := 'NOT';            Reserv[28] := 'OF';
  505.       Reserv[29] := 'OR';             Reserv[30] := 'PACKED';
  506.       Reserv[31] := 'PROCEDURE';      Reserv[32] := 'PROGRAM';
  507.       Reserv[33] := 'RECORD';         Reserv[34] := 'REPEAT';
  508.       Reserv[35] := 'SET';            Reserv[36] := 'SHL';
  509.       Reserv[37] := 'SHR';            Reserv[38] := 'STRING';
  510.       Reserv[39] := 'THEN';           Reserv[40] := 'TO';
  511.       Reserv[41] := 'TYPE';           Reserv[42] := 'UNIT';
  512.       Reserv[43] := 'UNTIL';          Reserv[44] := 'USES';
  513.       Reserv[45] := 'VAR';            Reserv[46] := 'WHILE';
  514.       Reserv[47] := 'WITH';           Reserv[48] := 'XOR';
  515.    end; {IntWds}
  516.  
  517. begin {LoadReserv}                                                     {.CP6}
  518.    if DataFiles then
  519.       ReadWds
  520.    else
  521.       IntWds
  522. end; {LoadReserv}
  523.  
  524. procedure Initialize;                                                {.CP24}
  525. var C: char;
  526. begin
  527. (*   CursorOff; *)
  528.    CheckBreak := True;
  529. (*   if Escape then begin end; {dummy to clear keyboard buffer} *)
  530.    FileName := '';
  531.    if Monitor=MDA then begin
  532.       ScrSeg := $B000;
  533.       Normalcolor := 15;
  534.       FrameColor := 7;
  535.       BackGround := 0;
  536.    end {if MDA}
  537.    else begin
  538.       ScrSeg := $B800;
  539.       NormalColor := ForegroundOf(NormalColor);      {in case of user dumbth}
  540.       FrameColor := ForegroundOf(FrameColor);
  541.       Background := Background and 7;
  542.    end; {else color board}
  543.    Bright := CombinedAttributeOf(NormalColor,Background);
  544.    Dim := CombinedAttributeOf(FrameColor,Background);
  545.    TextColor(NormalColor); TextBackground(Background);
  546.    BlnkLn[0] := char(Inside);
  547.    PXLRectangle;
  548. end; {Initialize}
  549.  
  550. End.
  551.