home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 549a.lha / M2P_v1.0 / mods.lzh / M2P.mod < prev    next >
Text File  |  1991-08-10  |  9KB  |  361 lines

  1. (*======================================================================*)
  2. (*                    Modula-2 Preprocessor Driver                      *)
  3. (*======================================================================*)
  4. (*  Version:  1.00              Author:   Dennis Brueni                 *)
  5. (*  Date:     07-07-91          Changes:  original                      *)
  6. (*======================================================================*)
  7. (*  This program simply sets everything up and calls the Parser,        *)
  8. (*  who takes over and does the rest.                                   *)
  9. (*======================================================================*)
  10.  
  11. MODULE M2P;
  12.  
  13. IMPORT
  14.     LexAn,FSM,Err;
  15. IMPORT
  16.     FIO,Args,Env;
  17. IMPORT
  18.     Strings,FStorage,SYSTEM;
  19. IMPORT
  20.     Parser,SymTab,SymLists,MacLists;
  21.  
  22. (* error catcher *)
  23.  
  24.  
  25.  
  26.  
  27.  
  28. (*----------------------------------------------------------------------*)
  29. VAR
  30.     i: CARDINAL;
  31.     Suppress: BOOLEAN;
  32.  
  33.     SrcName: Strings.BigString;
  34.     DestName: Strings.BigString;
  35.  
  36.     lparen: Strings.String1;
  37.     rparen: Strings.String1;
  38.     minus : Strings.String1;
  39.  
  40. (*----------------------------------------------------------------------*)
  41. (*  SUPPRESS    Function TO determine IF writes TO standard OUTPUT      *)
  42. (*              should be supressed since OUTPUT is going there         *)
  43. (*----------------------------------------------------------------------*)
  44.  
  45. PROCEDURE CheckSuppress;
  46.  
  47. VAR
  48.     i: CARDINAL;
  49.  
  50. BEGIN
  51.     Suppress:=FALSE;
  52.     i:=2;
  53.     WHILE i+1<Args.argc DO
  54.         Suppress:=Suppress OR (Strings.Equal(Args.argv[i]^,'TO') AND Strings.Equal(Args.argv[i+1]^,minus));
  55.         INC(i);
  56.     END;
  57. END CheckSuppress;
  58.  
  59.  
  60. (*----------------------------------------------------------------------*)
  61. (*  CHECKSWITCHES       Looks for command line switches                 *)
  62. (*----------------------------------------------------------------------*)
  63.  
  64. PROCEDURE CheckSwitches;
  65.  
  66. BEGIN
  67.     WHILE (Args.argc > i) DO
  68.         IF (Args.argc > i+1) AND Strings.Equal(Args.argv[i]^,'INCLUDE') THEN
  69.             MacLists.Insert(Parser.IncludeList, Args.argv[i+1]^,FSM.M2ID);
  70.             INC(i);
  71.         ELSIF Strings.Equal(Args.argv[i]^,'STRIP') THEN
  72.             FSM.StripFlag:=TRUE;
  73.         ELSIF Strings.Equal(Args.argv[i]^,'NOSTRIP') THEN
  74.             FSM.StripFlag:=FALSE;
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.  
  82.  
  83.  
  84.  
  85.         ELSE
  86.             RETURN;
  87.         END;
  88.         INC(i);
  89.     END;
  90. END CheckSwitches;
  91.  
  92. (*----------------------------------------------------------------------*)
  93. (*  CHECKINFILE     Attempts to open the input file                     *)
  94. (*----------------------------------------------------------------------*)
  95.  
  96. PROCEDURE CheckInFile;
  97.  
  98. BEGIN
  99.     Strings.Assign(Args.argv[i]^,SrcName);
  100.     IF Strings.Equal(SrcName,minus) THEN
  101.         IF NOT Suppress THEN
  102.             FIO.WriteString(FIO.OUTPUT,'Reading from standard INPUT.');
  103.             FIO.WriteLn(FIO.OUTPUT);
  104.         END;
  105.         FIO.SetPrompt(FIO.INPUT,'M2P> ');
  106.         FSM.SourceFile:=FIO.INPUT;
  107.     ELSE
  108.         IF LexAn.SetSourceFile(SrcName) THEN
  109.             IF NOT Suppress THEN
  110.                 FIO.WriteString(FIO.OUTPUT,'Processing  : ');
  111.                 FIO.WriteString(FIO.OUTPUT,SrcName);
  112.                 FIO.WriteLn(FIO.OUTPUT);
  113.             END;
  114.         ELSE
  115.             FIO.WriteString(FIO.OUTPUT,'Could not open:  ');
  116.             FIO.WriteString(FIO.OUTPUT,SrcName);
  117.             FIO.WriteLn(FIO.OUTPUT);
  118.             Err.Fatal(Err.IOError);
  119.         END;
  120.     END;
  121.     INC(i);
  122. END CheckInFile;
  123.  
  124. (*----------------------------------------------------------------------*)
  125. (*  CHECKARGS     Check local bindings for input file                   *)
  126. (*----------------------------------------------------------------------*)
  127.  
  128. PROCEDURE CheckArgs;
  129.  
  130. VAR
  131.     temp: SymTab.SymRecPtr;
  132.     list: SymLists.SymList;
  133. BEGIN
  134.     SymLists.Create(list);
  135.     IF i < Args.argc THEN
  136.         IF Strings.Equal(Args.argv[i]^,lparen) THEN
  137.             INC(i);
  138.             WHILE (i<Args.argc) AND NOT Strings.Equal(Args.argv[i]^,rparen) DO
  139.                 temp:=SymTab.LookUp(Args.argv[i]^);
  140.                 IF temp # NIL THEN
  141.                     Err.Message(Err.FlagReDefined);
  142.                 END;
  143.                 SymTab.Insert(Args.argv[i]^,FALSE,list,list);
  144.                 INC(i);
  145.             END;
  146.             IF (i < Args.argc) THEN
  147.                 INC(i);
  148.             END;
  149.         END;
  150.     END;
  151. END CheckArgs;
  152.  
  153. (*----------------------------------------------------------------------*)
  154. (*  CHECKOUTFILE    Attempts to open the output FILE                    *)
  155. (*----------------------------------------------------------------------*)
  156.  
  157. PROCEDURE CheckOutFile;
  158.  
  159. VAR
  160.     len: CARDINAL;
  161.  
  162. BEGIN
  163.     IF (Args.argc > i+1) AND Strings.Equal(Args.argv[i]^,'TO') THEN
  164.         INC(i);
  165.         Strings.Assign(Args.argv[i]^,DestName);
  166.         IF Strings.Equal(DestName,minus)
  167.                     (* standard output  *)
  168.         THEN
  169.             FSM.DestFile:=FIO.OUTPUT;
  170.         ELSE
  171.             IF LexAn.SetDestFile(DestName) THEN
  172.                 FIO.WriteString(FIO.OUTPUT,'Output file : ');
  173.                 FIO.WriteString(FIO.OUTPUT,DestName);
  174.                 FIO.WriteLn(FIO.OUTPUT);
  175.             ELSE
  176.                 FIO.WriteString(FIO.OUTPUT,'Could not open:  ');
  177.                 FIO.WriteString(FIO.OUTPUT,DestName);
  178.                 FIO.WriteLn(FIO.OUTPUT);
  179.                 Err.Fatal(Err.IOError);
  180.             END;
  181.         END;
  182.         INC(i)
  183.     ELSE
  184.         Strings.Assign(SrcName,DestName);
  185.         len:=Strings.Length(DestName);
  186.         IF (CAP(DestName[len-1])='P') AND
  187.                     (* Known Preprocessor   *)
  188.         (CAP(DestName[len-2])='P') AND
  189.                     (* extensions           *)
  190.         (CAP(DestName[len-4])='.') THEN
  191.             CASE CAP(DestName[len-3]) OF
  192.             'M':
  193.                 DestName[len-2]:='o';
  194.                     (* .MPP => .mod *)
  195.                 DestName[len-1]:='d';
  196.             |'D':
  197.                 DestName[len-2]:='e';
  198.                     (* .DPP => .def *)
  199.                 DestName[len-1]:='f';
  200.             |'C',
  201.        (* .CPP => .c   *)
  202.             'H':
  203.                 DestName[len-2]:=0C;
  204.                     (* .HPP => .h   *)
  205.             |'A':
  206.                 DestName[len-2]:='s';
  207.                     (* .APP => .asm *)
  208.                 DestName[len-1]:='m';
  209.             |'L':
  210.                 DestName[len-2]:='s';
  211.                     (* .LPP => .lsp *)
  212.                 DestName[len-1]:='p';
  213.             |'T':
  214.                 DestName[len-2]:='x';
  215.                     (* .TPP => .txt *)
  216.                 DestName[len-1]:='t';
  217.             |'P':
  218.                 DestName[len-2]:='a';
  219.                     (* .PPP => .pas *)
  220.                 DestName[len-1]:='s';
  221.             |'O':
  222.                 DestName[len-3]:='m';
  223.                     (* .OPP => .mod *)
  224.                 DestName[len-2]:='o';
  225.                     (*----oberon----*)
  226.                 DestName[len-1]:='d';
  227.             |'F':
  228.                 DestName[len-2]:='o';
  229.                     (* .FPP => .for *)
  230.                 DestName[len-1]:='r';
  231.             |'S':
  232.                 DestName[len-2]:='c';
  233.                     (* .SPP => .scm *)
  234.                 DestName[len-1]:='m';
  235.             ELSE
  236.                 FIO.WriteString(FIO.OUTPUT,'Unrecognized extension:  .');
  237.                 FIO.WriteChar(FIO.OUTPUT,DestName[len-3]);
  238.                 FIO.WriteChar(FIO.OUTPUT,DestName[len-2]);
  239.                 FIO.WriteChar(FIO.OUTPUT,DestName[len-1]);
  240.                 FIO.WriteLn(FIO.OUTPUT);
  241.                 Err.Fatal(Err.BadParams);
  242.             END;
  243.             IF LexAn.SetDestFile(DestName) THEN
  244.                 FIO.WriteString(FIO.OUTPUT,'Output file : ');
  245.                 FIO.WriteString(FIO.OUTPUT,DestName);
  246.                 FIO.WriteLn(FIO.OUTPUT);
  247.             ELSE
  248.                 FIO.WriteString(FIO.OUTPUT,'Could not open:  ');
  249.                 FIO.WriteString(FIO.OUTPUT,DestName);
  250.                 FIO.WriteLn(FIO.OUTPUT);
  251.                 Err.Fatal(Err.IOError);
  252.             END;
  253.         ELSE
  254.             FIO.WriteString(FIO.OUTPUT,'Unrecognized input file extension');
  255.             FIO.WriteLn(FIO.OUTPUT);
  256.             Err.Fatal(Err.BadParams);
  257.         END;
  258.     END;
  259. END CheckOutFile;
  260.  
  261. (*----------------------------------------------------------------------*)
  262. (* CHECKENV     Checks the environment variable, ENV:M2PFlags           *)
  263. (*----------------------------------------------------------------------*)
  264.  
  265. PROCEDURE CheckEnv;
  266.  
  267. VAR
  268.     list: SymLists.SymList;
  269.     M2PEnv: ARRAY [0..1023] OF CHAR;
  270.     String: ARRAY [0.. 255] OF CHAR;
  271.  
  272. BEGIN
  273.     SymLists.Create(list);
  274.     Env.GetEnv('M2PFlags',M2PEnv);
  275.     WHILE Env.ParseEnv(M2PEnv,String) DO
  276.         SymTab.Insert(String,FALSE,list,list);
  277.     END;
  278. END CheckEnv;
  279.  
  280. (************************************************************************)
  281.  
  282. PROCEDURE FinalTerminate;
  283.  
  284. BEGIN
  285.     FIO.CloseAllFiles;
  286.     FStorage.DISPOSEALL;
  287.     Args.TermProc;
  288. END FinalTerminate;
  289.  
  290. (************************************************************************)
  291. (*  Main Line CODE                                                      *)
  292. (************************************************************************)
  293.  
  294. BEGIN
  295.  
  296.     lparen[0]:='(';
  297.     rparen[0]:=')';
  298.     minus [0]:='-';
  299.  
  300.  
  301.  
  302.  
  303.  
  304.     CheckSuppress;
  305.     IF NOT Suppress THEN
  306.  
  307.  
  308.  
  309.  
  310.  
  311.  
  312.  
  313.  
  314.  
  315.         FIO.WriteString(FIO.OUTPUT,'M2P 1.00 -- by Dennis Brueni -- Written in Modula-2');
  316.  
  317.         FIO.WriteLn(FIO.OUTPUT);
  318.     END;
  319.  
  320.     IF Args.argc < 2 THEN
  321.         FIO.WriteString(FIO.OUTPUT,'Usage: ');
  322.         FIO.WriteString(FIO.OUTPUT,Args.argv[0]^);
  323.         FIO.WriteString(FIO.OUTPUT,' <switches> { [<infile> | -] [( {flag} )] [TO <outfile> | TO -] }');
  324.         FIO.WriteLn(FIO.OUTPUT);
  325.         FIO.WriteString(FIO.OUTPUT,'       where <switches> = { STRIP | NOSTRIP | INCLUDE <path> ');
  326.  
  327.  
  328.  
  329.  
  330.         FIO.WriteChar(FIO.OUTPUT,'}');
  331.         FIO.WriteLn(FIO.OUTPUT);
  332.     ELSE
  333.         i:=1;
  334.         CheckSwitches;
  335.         WHILE i < Args.argc DO
  336.             IF NOT Suppress THEN
  337.                 FIO.WriteLn(FIO.OUTPUT);
  338.             END;
  339.             SymTab.Initialize;
  340.             Err.LineNum:=1;
  341.             CheckEnv;
  342.             CheckInFile;
  343.             CheckArgs;
  344.             CheckOutFile;
  345.             Parser.Parse();
  346.             IF NOT Suppress THEN
  347.                 Err.LastMessage;
  348.             END;
  349.             IF SYSTEM.ADDRESS(FSM.SourceFile) # SYSTEM.ADDRESS(FIO.INPUT) THEN
  350.                 FIO.Close(FSM.SourceFile);
  351.             END;
  352.             IF SYSTEM.ADDRESS(FSM.DestFile) # SYSTEM.ADDRESS(FIO.OUTPUT) THEN
  353.                 FIO.Close(FSM.DestFile);
  354.             END;
  355.         END;
  356.     END;
  357.  
  358.     FinalTerminate;
  359.  
  360. END M2P.
  361.