home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 9 / 09.iso / l / l041 / 2.ddi / MISC.ARC / TAEDIT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-12-31  |  13.4 KB  |  483 lines

  1. (****************************************************************)
  2. (*                     DATABASE TOOLBOX 4.0                     *)
  3. (*     Copyright (c) 1984, 87 by Borland International, Inc.    *)
  4. (*                                                              *)
  5. (*                           TAEdit                             *)
  6. (*                                                              *)
  7. (*    Purpose:  Editing routines for TABuild that use BINED     *)
  8. (*                                                              *)
  9. (****************************************************************)
  10. unit TAEdit;
  11.  
  12. interface
  13. uses DOS,
  14.      CRT,
  15.      BinEd,
  16. {    If a compiler error occurs here, you need the unit BINED.TPU
  17.      from the Turbo Pascal Editor Toolbox 4.0.  See the documentation
  18.      at the beginning of TABUILD.PAS for detailed instructions. }
  19.  
  20.      MiscTool,
  21. {    If a compiler error occurs here, you need to unpack the source
  22.      to the MiscTool unit from the archived file Tools.arc.  See the
  23.      README file on disk 1 for detailed instructions. }
  24.  
  25.      EditLn,
  26.      FileUtil;
  27.  
  28. function CreateTypeFile(var UserFileSpec : FileSpec) : boolean;
  29.  
  30. function EditTypeFile(var UserFileSpec : FileSpec) : boolean;
  31.  
  32. function FixError(var CompErrors : text;
  33.                   MainFileNm : FileName;
  34.                   var OutputFile,
  35.                       UserFileSpec : FileSpec) : boolean;
  36.  
  37. implementation
  38. {$V-}
  39. const
  40.   F2  = #60;
  41.   F10 = #68;
  42.   {Commands other than ^K^D to exit editor}
  43.   ExitCommands : array[0..9] of Char = (#2, #0, F10,
  44.                                         #2, #0, F2,
  45.                                         #2, ^K, ^Q, #0);
  46.   MakeBackup = True;
  47.   {Initial Coordinates of the editor window}
  48.   Windx1 = 2;
  49.   Windy1 = 2;
  50.   Windx2 = 78;
  51.   Windy2 = 19;
  52.  
  53. var
  54.   EdData : EdCB;              {Editor control block}
  55.   ExitCode : integer;
  56.   ExitCommand : Word;         {Code for command used to leave editor}
  57.   Fname : String;             {Input name of file being edited}
  58.  
  59. type
  60.   BorderElements = (topleft, topright, botleft, botright, horiz, vert);
  61.   BorderChars = array[BorderElements] of Char;
  62. const
  63.   Border :   BorderChars = '┌┐└┘─│';
  64.   NoBorder : BorderChars = '      ';
  65.  
  66.   {Procedures and functions used as part of the demo}
  67.  
  68. procedure DrawBox(Border : BorderChars; x1, y1, x2, y2 : byte);
  69. {-Draw a box around an editor window}
  70. var
  71.   i : Word;
  72.   bar : String;
  73.   barlen : Byte absolute bar;
  74.  
  75. begin                       {DrawBox}
  76.   {Build horizontal bar}
  77.   barlen := 3+X2-X1;
  78.   FillChar(bar[1], barlen, Border[horiz]);
  79.   {Draw top bar}
  80.   bar[1] := Border[topleft];
  81.   bar[barlen] := Border[topright];
  82.   CRTputFast(X1, Y1, bar);
  83.   {Draw bottom bar}
  84.   bar[1] := Border[botleft];
  85.   bar[barlen] := Border[botright];
  86.   CRTputFast(X1, Y2+2, bar);
  87.  
  88. {Vertical bars}
  89.   for i := Succ(Y1) to Succ(Y2) do
  90.   begin
  91.     CRTputFast(X1, i, Border[vert]);
  92.     CRTputFast(X2+2, i, Border[vert]);
  93.   end;
  94. end;                        {DrawBox}
  95.  
  96. procedure WriteStatus(msg : String);
  97. {-Write a status message to the bottom line of the screen}
  98. var
  99.   msglen : Byte absolute msg;
  100.  
  101. begin                       {WriteStatus}
  102.   FillChar(msg[Succ(msglen)], 80-msglen, #32);
  103.   msglen := 80;
  104.   CRTputFast(1, 25, CAerr+msg);
  105. end;                        {WriteStatus}
  106.  
  107. procedure CheckInitBinary(ExitCode : Word);
  108. {-Check the results of the editor load operation}
  109. begin                       {CheckInitBinary}
  110.   if ExitCode <> 0 then
  111.   begin
  112.     {Couldn't initialize editor}
  113.     GoToXY(1, 25);
  114.     case ExitCode of
  115.       1 : WriteLn('Insufficient heap space for text buffer');
  116.     else
  117.       WriteLn('Unknown load error');
  118.     end;
  119.     Halt(1);
  120.   end;
  121. end;                        {CheckInitBinary}
  122.  
  123. procedure CheckReadFile(ExitCode : Word; Fname : String);
  124. {-Check the results of the file read}
  125. var
  126.   f : file;
  127.  
  128. begin                       {CheckReadFile}
  129.   if ExitCode <> 0 then
  130.   begin
  131.     {Couldn't read file}
  132.     case ExitCode of
  133.       1 : begin
  134.             {New file, assure valid file name}
  135.             {$I-}
  136.             Assign(f, Fname);
  137.             Rewrite(f);
  138.             if IOResult <> 0 then
  139.             begin
  140.               Close(f);
  141.               WriteStatus('Illegal file name '+Fname);
  142.             end
  143.             else
  144.             begin
  145.               Close(f);
  146.               Erase(f);
  147.               Write('New File');
  148.               Delay(2000);
  149.               Write(^M);
  150.               ClrEol;
  151.               GoToXY(1, 1);
  152.               ClrEol;
  153.               Exit;
  154.             end;
  155.             {$I+}
  156.           end;
  157.           2 : WriteStatus('Insufficient text buffer size');
  158.         else
  159.           WriteStatus('Unknown read error');
  160.       end;
  161.       GoToXY(1, 25);
  162.       Halt(1);
  163.   end;
  164.   GoToXY(1, 1);
  165.   ClrEol;
  166. end;                        {CheckReadFile}
  167.  
  168. procedure CheckSaveFile(ExitCode : Word; Fname : String);
  169. {-Check the results of a file save}
  170. begin                       {CheckSaveFile}
  171.   if ExitCode <> 0 then
  172.   begin
  173.     {Couldn't save file}
  174.     case ExitCode of
  175.       1 : WriteStatus('Unable to create output file '+Fname);
  176.       2 : WriteStatus('Error while writing output to '+Fname);
  177.       3 : WriteStatus('Unable to close output file '+Fname);
  178.       else
  179.         WriteStatus('Unknown write error');
  180.     end;
  181.     GoToXY(1, 25);
  182.     Halt(1);
  183.   end;
  184. end;                        {CheckSaveFile}
  185.  
  186. procedure WriteKeyboardToggles(info : Word);
  187. {-Write the status of the keyboard toggles}
  188. var
  189.   s : String;
  190.  
  191. begin                       {WriteKeyboardToggles}
  192.   s := CAerr;
  193.   if (info and $40) <> 0 then
  194.     s := s+'CL'
  195.   else
  196.     s := s+'  ';
  197.   if (info and $20) <> 0 then
  198.     s := s+' NL'
  199.   else
  200.     s := s+'   ';
  201.   if (info and $10) <> 0 then
  202.     s := s+' SL'
  203.   else
  204.     s := s+'   ';
  205.   CRTputFast(72, 25, s);
  206. end;                        {WriteKeyboardToggles}
  207.  
  208. {$F+}
  209. procedure UserEventCheck(EventNo, KbdFlagInfo : Word);
  210.     {-User hook for a background process called at every keypressed check}
  211. begin                       {UserEventCheck}
  212.   {Update keyboard toggles whenever changed}
  213.   WriteKeyboardToggles(kbdflaginfo);
  214. end;                        {UserEventCheck}
  215. {$F-}
  216.  
  217. procedure InitWindow(var EdData : EdCB);
  218. {-Draw a nice screen frame around the editor window}
  219. var
  220.   MsgPos : Byte;
  221.   DemoMsg : String;
  222.  
  223. begin                       {InitWindow}
  224.   {Draw a frame around the editor window}
  225.   with EdData do
  226.   begin
  227.     DrawBox(Border, x1, y1, x2, y2);
  228.     DemoMsg := ' Enter your database record and key type definitions ';
  229.     MsgPos := 2+((X2+X1-Length(DemoMsg)) shr 1);
  230.     CRTputFast(MsgPos, Y2+2, CAerr+DemoMsg);
  231.   end;
  232. end;                        {InitWindow}
  233.  
  234. procedure InitStatusLine;
  235. {-Draw a status/prompt line for the editor demo}
  236. begin                       {InitStatusLine}
  237.   WriteStatus('        F10-Start Build          F2-saves file          ^K^Q - quit');
  238. end;
  239.  
  240. const
  241.   Save1 = -1;
  242.   StartBuild = 0;
  243.   Save2 =  1;
  244.   Quit = 2;
  245.  
  246.  
  247. function ExitBinaryEditor(var EdData : EdCB; ExitCommand : Integer)
  248.     : Boolean;
  249. {-Handle an editor exit - save or abandon file}
  250. var
  251.   ExitCode : Word;
  252.  
  253. begin                       {ExitBinaryEditor}
  254.   case ExitCommand of
  255.     StartBuild : begin                 {F10}
  256.                    if ModifiedFileBinaryEditor(EdData) then
  257.                    begin
  258.                      ExitCode := SaveFileBinaryEditor(EdData, MakeBackup);
  259.                      CheckSaveFile(ExitCode, FilenameBinaryEditor(eddata));
  260.                    end;
  261.                    ExitBinaryEditor := true;
  262.                   GoToXY(1, 25);
  263.                 end;
  264.     Save1,
  265.     Save2 : begin {^K^D, F2 }
  266.                ExitCode := SaveFileBinaryEditor(EdData, MakeBackup);
  267.                CheckSaveFile(ExitCode, FilenameBinaryEditor(eddata));
  268.                ExitBinaryEditor := false;
  269.              end;
  270.     Quit : begin   {^K^Q}
  271.              ExitBinaryEditor := true;
  272.              GoToXY(1, 25);
  273.              Abort('User Terminated');
  274.            end;
  275.   end;
  276. end;                        {ExitBinaryEditor}
  277.  
  278.  
  279. function EditTypeFile(var UserFileSpec : FileSpec) : boolean;
  280. begin
  281.   EditTypeFile := false;
  282.   {Initialize a window for the file}
  283.   ExitCode :=
  284.   InitBinaryEditor(
  285.   EdData,                     {Editor control block, initialized by InitBinaryEditor}
  286.   MaxFileSize,                {Size of data area to reserve for binary editor text buffer, $FFE0 max}
  287.   Windx1,                     {Coordinates of editor window, upper left 1..80}
  288.   Windy1,                     {Coordinates of editor window, upper left 1..25}
  289.   Windx2,                     {Coordinates of editor window, lower right}
  290.   Windy2,                     {Coordinates of editor window, lower right}
  291.   True,                       {True to wait for retrace on color cards}
  292.   EdOptInsert+EdOptIndent,    {Initial editor toggles}
  293.   '.TYP',                     {Default extension for file names}
  294.   ExitCommands,               {Commands to exit editor}
  295.   @UserEventCheck);                       {Address of user event handler}
  296.   CheckInitBinary(ExitCode);
  297.  
  298.   {Read the file}
  299.   with UserFileSpec do
  300.     ExitCode := ReadFileBinaryEditor(EdData, Path + Name + Ext);
  301.   CheckReadFile(ExitCode, FilenameBinaryEditor(eddata));
  302.  
  303.   {Reset the editor for the new file}
  304.   ResetBinaryEditor(EdData);
  305.  
  306.   {Write a status and prompt line}
  307.   InitStatusLine;
  308.  
  309.   repeat
  310.     {Set up the window border and title}
  311.     InitWindow(EdData);
  312.  
  313.     {Edit the file}
  314.     ExitCommand := UseBinaryEditor(EdData, '');
  315.  
  316.     {Handle the exit by saving the file or whatever}
  317.   until ExitBinaryEditor(EdData, ExitCommand);
  318.   TextBackground(Black);
  319.   if ExitCommand = StartBuild then
  320.   begin
  321.     EditTypeFile := true;
  322.     ClrScr;
  323.     ReleaseBinaryEditorHeap(EdData);
  324.   end
  325.   else
  326.     Halt;
  327. end; { EditTypeFile }
  328.  
  329. const
  330.   TPCOUT = 'TPC.OUT';
  331. var
  332.   CompErrors : text;
  333.  
  334. type
  335.   ErrorRec = record
  336.                LineNum,
  337.                Column : integer;
  338.                FN : FileName;
  339.                Message,
  340.                ErrLine : string;
  341.              end;
  342.  
  343. procedure DisplayError(E : ErrorRec; Y : integer;
  344.                        MainFileNm : FileNm;
  345.                        var UserFileSpec : FileSpec);
  346. const
  347.   RecTypeStr = 'MaxDataType';
  348.   KeyTypeStr = 'MaxKeyType';
  349. var
  350.   ErrorSpotted : boolean;
  351. begin
  352.   ErrorSpotted := false;
  353.   ClrScr;
  354.   GotoXY(1, Y);
  355.   with E do
  356.   begin
  357.     if Pos(MainFileNm, FN) > 0 then
  358.     begin
  359.       if Pos(RecTypeStr, ErrLine) > 0 then
  360.       begin
  361.         Writeln;
  362.         Writeln('TABuild Error: You did not define ', RecTypeStr);
  363.         ErrorSpotted := true
  364.       end;
  365.       if not ErrorSpotted and
  366.          (Pos(KeyTypeStr, ErrLine) > 0) then
  367.       begin
  368.         Writeln;
  369.         Writeln('Tabuild Error: You did not define ', KeyTypeStr);
  370.         ErrorSpotted := true;
  371.       end;
  372.     end;
  373.     if not ErrorSpotted then
  374.     begin
  375.       if Pos(UpCaseStr('TAccess.typ'), FN) = 0 then
  376.         Writeln('File ', FN);
  377.       Writeln('Line number ', LineNum);
  378.       Writeln(ErrLine);
  379.       Write(' ':Column - 1,'^', Message);
  380.     end;
  381.   end;
  382. end;
  383.  
  384. function ParseError(MsgFileNm : FileName;
  385.                      var E : ErrorRec) : boolean;
  386. var
  387.   LastTwo : array[1..2] of string;
  388.   MsgFile : text;
  389.   CurLine : string;
  390.   found : boolean;
  391.  
  392. procedure StripOut(var Dest, Source : String; Target : char);
  393. var
  394.   i : integer;
  395. begin
  396.   i := Pos(Target, Source);
  397.   Dest := Copy(Source, 1, i - 1);
  398.   Delete(Source, 1, i);
  399. end;
  400.  
  401. var
  402.   temp : string;
  403.   code : integer;
  404.  
  405. begin { ParseError }
  406.   Assign(MsgFile, MsgFileNm);
  407.   Reset(MsgFile);
  408.   FillChar(LastTwo, SizeOf(LastTwo), 0);
  409.   found := false;
  410.   while not eof(MsgFile) and not found do
  411.   begin
  412.     Readln(MsgFile, CurLine);
  413.     E.Column := Pos('^', CurLine );
  414.     if E.Column > 0 then
  415.       found := true
  416.     else
  417.     begin
  418.       LastTwo[1] := LastTwo[2];
  419.       LastTwo[2] := CurLine;
  420.     end;
  421.   end;
  422.   Close(MsgFile);
  423.   if found then
  424.     with E do
  425.     begin
  426.       ErrLine := LastTwo[2];
  427.       StripOut(FN, LastTwo[1], '(');
  428.       StripOut(temp, LastTwo[1], ')');
  429.       Val(temp, LineNum, Code);
  430.       Message := LastTwo[1];
  431.       Delete(Message, 1, 2);
  432.     end;
  433.   ParseError := found;
  434. end; { ParseError }
  435.  
  436. function FixError(var CompErrors : text;
  437.                   MainFileNm : FileName;
  438.                   var OutputFile,
  439.                       UserFileSpec : FileSpec) : boolean;
  440.  
  441. var
  442.   TypeError : ErrorRec;
  443. begin
  444.   with OutPutFile do
  445.     if not ParseError(Path + Name + Ext, TypeError) then
  446.       Abort('Not enough memory to compile/run TASizes');
  447.   ClrScr;
  448.   DisplayError(TypeError, WindY2 + 2, MainFileNm, UserFileSpec);
  449.   FixError := EditTypeFile(UserFileSpec);
  450.   Erase(CompErrors);
  451. end;
  452.  
  453. function CreateTypeFile(var UserFileSpec : FileSpec): boolean;
  454. const
  455.   NumLines = 1;
  456.   TypeDefTemplate : array[1..NumLines] of String[70] =
  457.     ('{ Turbo Access Record and Key type for ');
  458. var
  459.   NewTypeFile : Text;
  460.   CurLine : integer;
  461. begin
  462.   CreateTypeFile := false;
  463.   with UserFileSpec do
  464.     Assign(NewTypeFile, Path + Name + Ext);
  465.   {$I-}
  466.   Rewrite(NewTypeFile);
  467.   {$I+}
  468.   if IOResult <> 0 then
  469.     Exit;
  470.   for CurLine := 1 to NumLines do
  471.   begin
  472.     Write(NewTypeFile, TypeDefTemplate[CurLine]);
  473.     if CurLine = 1 then
  474.       Write(NewTypeFile, UserFileSpec.Name, ' }');
  475.     Writeln(NewTypeFile);
  476.   end;
  477.   Close(NewTypeFile);
  478.   CreateTypeFile := true;
  479. end; { CreateTypeFile }
  480.  
  481. end.
  482.  
  483.