home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 10 / Fresh_Fish_10_2352.bin / new / dev / c / dice / cc / main.c < prev    next >
C/C++ Source or Header  |  1994-02-01  |  30KB  |  1,557 lines

  1.  
  2. /*
  3.  *  MAIN.C
  4.  *
  5.  *  (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  6.  *
  7.  *  dcc <options> <files>
  8.  */
  9.  
  10. #include "defs.h"
  11.  
  12. #ifndef AZLAT_COMPAT
  13. #define DoLink_Dice    DoLink
  14. #define DoCompile_Dice    DoCompile
  15. #define DoAssemble_Dice DoAssemble
  16. #define DoPrelink_Dice    DoPrelink
  17. #endif
  18.  
  19. #ifdef _DCC
  20. IDENT("DCC",".37");
  21. DCOPYRIGHT;
  22. #endif
  23.  
  24. Prototype   void    myexit(void);
  25. Prototype   int     main(int, char **);
  26. Prototype   void    AddFile(char *);
  27. Prototype   void    help(int);
  28. Prototype   char    *TmpFileName(char *);
  29. Prototype   char    *MungeFile(char *, char *, char *);
  30. Prototype   void    AddName(LIST *, char *, char *);
  31. Prototype   void    AddOpt(LIST *, char *, char *);
  32. Prototype   char    *Tailer(char *);
  33. Prototype   char    *XFilePart(char *);
  34. Prototype   char    *OptListToStr(LIST *);
  35. Prototype   char    *OptListToStr2(LIST *, char *);
  36. Prototype   void    run_cmd(char *);
  37. Prototype   int     OutOfDate(char *, char *);
  38. Prototype   void    HandleCFile(char *, int);
  39. Prototype   void    HandleAFile(char *, int);
  40. Prototype   void    PushTmpFile(char *);
  41. Prototype   void    PopTmpFile(char *);
  42. Prototype   long    LoadSegLock(long);
  43.  
  44. Prototype   int     DoCompile(char *, char *);
  45. Prototype   int     DoCompile_Dice(char *, char *);
  46. Prototype   int     DoCompile_Aztec(char *, char *);
  47. Prototype   int     DoCompile_Lattice(char *, char *);
  48. Prototype   int     DoAssemble(char *, char *);
  49. Prototype   int     DoAssemble_Dice(char *, char *);
  50. Prototype   int     DoAssemble_Aztec(char *, char *);
  51. Prototype   int     DoAssemble_Lattice(char *, char *);
  52. Prototype   char    *DoPrelink(void);
  53. Prototype   char    *DoPrelink_Dice(void);
  54. Prototype   char    *DoPrelink_Aztec(void);
  55. Prototype   char    *DoPrelink_Lattice(void);
  56. Prototype   int     DoLink(char *);
  57. Prototype   int     DoLink_Dice(char *);
  58. Prototype   int     DoLink_Aztec(char *);
  59. Prototype   int     DoLink_Lattice(char *);
  60.  
  61. void OrderApp(char *);
  62. void AddLibApp(char *, char);
  63. void DelLibApp(char *, char);
  64.  
  65. /*
  66.  *  Note that we use exec_dcc if DCC, which only works with 'dcc' programs
  67.  *  thus, the executables are renamed to prevent problems.
  68.  */
  69.  
  70. Prototype __aligned char Buf[512];
  71.  
  72.  
  73. __aligned char Buf[512];
  74. char TmpFile[64];
  75. char ErrOptStr[128];
  76. char *ErrFile;
  77. char *OutFile;
  78. char *OutDir = "T:";
  79. char *TmpDir = "T:";
  80. char *AmigaLib = "dlib:amiga";
  81. char *CLib = "dlib:c";
  82. char ALibOS[4];
  83. char ALibApp[32] = { "s" };
  84. char CLibApp[32] = { "s" };
  85. LIST TmpList;
  86. short NewOpt;
  87. short FastOpt;
  88. short FragOpt;
  89. short ChipOpt;
  90. short MC68020Opt;
  91. short MC68881Opt;
  92. short FFPOpt;
  93. short DDebug;
  94. short RegCallOpt;
  95. short NoHeirOpt;
  96. short NoEnvOpt;
  97. short SlashSlashOpt;
  98. short ProfOpt;
  99. short DLinkPostFixOpt;
  100.  
  101. char DLINK[32];
  102. char DAS[32];
  103. char DC1[32];
  104. char DCPP[32];
  105.  
  106. typedef struct NameNode {
  107.     struct Node n_Node;
  108.     char    *n_In;
  109.     char    *n_Out;
  110.     short   n_IsTmp;
  111. } NameNode;
  112.  
  113. LIST   CList;
  114. LIST   AList;
  115. LIST   OList;
  116. LIST   LList;
  117.  
  118. LIST   CppOptList;
  119. LIST   LinkOptList;
  120.  
  121. short    NoLink;
  122. short    NoAsm;
  123. short    SmallCode = 1;
  124. short    SmallData = 1;
  125. short    ConstCode;        /*    -ms            */
  126. short    AbsData;        /*    -mw, -ma        */
  127. short    ResOpt;
  128. short    AltSectOpt;
  129. short    SymOpt;
  130. short    RomOpt;
  131. short    ProtoOnlyOpt;
  132. short    NoIntermediateAssembly;
  133. short    PIOpt;
  134. short    GenStackOpt;
  135. short    GenLinkOpt;
  136. short    Verbose;
  137. short    NoDefaultLibs;
  138. short    CompilerOpt = DICE_C;
  139. long    AbsDataStart;        /*    -mw <addr>  */
  140. char    DebugOpts[64];
  141.  
  142. extern struct Library *SysBase;
  143.  
  144. void
  145. myexit()
  146. {
  147.     NODE *node;
  148.  
  149.     while (node = RemHead(&TmpList)) {
  150.     remove(node->ln_Name);
  151.     free(node);
  152.     }
  153. }
  154.  
  155. int
  156. main(xac, xav)
  157. int xac;
  158. char *xav[];
  159. {
  160.     int fc = 0;
  161.     int ac;
  162.     char **av;
  163.  
  164. #ifdef LATTICE
  165.     {
  166.     long n = (long)Buf;
  167.     if (n & 3) {
  168.         puts("software error, Buf not aligned");
  169.         exit(1);
  170.     }
  171.     }
  172. #endif
  173. #ifdef NOTDEF
  174.     expand_args(xac, xav, &ac, &av);
  175. #else
  176.     ac = xac;
  177.     av = xav;
  178. #endif
  179.  
  180.     NewList(&CList);
  181.     NewList(&AList);
  182.     NewList(&OList);
  183.     NewList(&LList);
  184.  
  185.     NewList(&TmpList);
  186.  
  187.     NewList(&CppOptList);
  188.     NewList(&LinkOptList);
  189.  
  190.     atexit(myexit);
  191.  
  192.     if (ac == 1)
  193.     help(0);
  194.  
  195.     {
  196.     char *ptr = av[0];    /*  cmd name */
  197.     char prefix[32];
  198.     short i;
  199.  
  200.     for (i = strlen(ptr); i >= 0 && ptr[i] != ':' && ptr[i] != '/'; --i);
  201.     ++i;
  202.  
  203.     ptr = ptr + i;        /*  base name */
  204.     for (i = 0; ptr[i] && ptr[i] != '_'; ++i);
  205.     if (ptr[i] == '_') {
  206.         strncpy(prefix, ptr, i + 1);
  207.         prefix[i+1] = 0;
  208.     } else {
  209.         prefix[0] = 0;
  210.     }
  211.     sprintf(DLINK, "%s%s", prefix, "dlink");
  212.     sprintf(DAS  , "%s%s", prefix, "das");
  213.     sprintf(DC1  , "%s%s", prefix, "dc1");
  214.     sprintf(DCPP , "%s%s", prefix, "dcpp");
  215.     }
  216.  
  217.     /*
  218.      *    check for -no-env option before processing DCCOPTS
  219.      */
  220.  
  221.     {
  222.     long i;
  223.  
  224.     for (i = 1; i < ac; ++i) {
  225.         if (strcmp(av[i], "-no-env") == 0) {
  226.         NoEnvOpt = 1;
  227.         break;
  228.         }
  229.     }
  230.     }
  231.  
  232.     if (NoEnvOpt == 0) {
  233.     char **argv = av;
  234.     ac = ExtArgsEnv(ac, &argv, "DCCOPTS");
  235.     av = argv;
  236.     }
  237.  
  238.     {
  239.     long i;
  240.     char *dummy;
  241.  
  242.     for (i = 1; i < ac; ++i) {
  243.         char *ptr = av[i];
  244.  
  245.         if (*ptr == '-') {
  246.         ptr += 2;
  247.  
  248.         switch(ptr[-1]) {
  249.         case '0':       /*  -020        */
  250.             MC68020Opt = 1;
  251.             break;
  252.         case '1':       /*  1.4, 1.3    */
  253.         case '2':       /*  2.0, 2.1..  */
  254.             if (ptr[0] != '.')
  255.             help(1);
  256.             AddOpt(&CppOptList, ptr - 2, "");
  257.             ALibOS[0] = ptr[-1];
  258.             ALibOS[1] = ptr[1];
  259.             break;
  260.         case '8':
  261.             MC68881Opt = 1;
  262.             break;
  263.         case 'f':
  264.             if (*ptr == 0)
  265.             FastOpt = 1;
  266.             else if (*ptr == 'r')
  267.             FragOpt = 1;
  268.             else if (*ptr == 'f')
  269.             FFPOpt = 1;
  270.             break;
  271.         case 'r':
  272.             if (strcmp(ptr, "om") == 0) {
  273.             RomOpt = 1;
  274.             } else {
  275.             if (PIOpt && ResOpt == 0)
  276.                 puts("DCC: Warning, -r -pi = -pr");
  277.             ResOpt = 1;
  278.             }
  279.             break;
  280.         case 'c':
  281.             if (*ptr == 0)
  282.             NoLink = 1;
  283.             else if (stricmp(ptr, "hip") == 0)
  284.             ChipOpt = 1;
  285.             else
  286.             help(1);
  287.             break;
  288.         case 'a':
  289.             if (strcmp(ptr, "ztec") == 0) {
  290.             CompilerOpt = AZTEC_C;
  291.             break;
  292.             }
  293.             NoAsm = 1;
  294.             NoLink= 1;
  295.             break;
  296.         case 'g':
  297.             switch (*ptr) {
  298.             case 's':
  299.             GenStackOpt = 1;
  300.             break;
  301.             case 'l':
  302.             GenLinkOpt = 1;
  303.             break;
  304.             default:
  305.             help(1);
  306.             }
  307.             break;
  308.         case 'l':
  309.             if (strcmp(ptr, "attice") == 0) {
  310.             CompilerOpt = LATTICE_C;
  311.             break;
  312.             }
  313.             if (ptr[0] == '0' && ptr[1] == 0) {
  314.             NoDefaultLibs = 1;
  315.             break;
  316.             }
  317.             if (*ptr == 0)
  318.             ptr = av[++i];
  319.             AddName(&LList, ".lib", ptr);
  320.             DLinkPostFixOpt = 1;
  321.             break;
  322.         case 'L':   /*  -Idir   */
  323.             if (ptr[0] == '0' && ptr[1] == 0) {
  324.             AddOpt(&LinkOptList, "-L0", "");
  325.             break;
  326.             }
  327.             if (*ptr == 0)
  328.             ptr = av[++i];
  329.             AddOpt(&LinkOptList, "-L", ptr);
  330.             break;
  331.         case 'I':   /*  -Idir   */
  332.             if (ptr[0] == '0' && ptr[1] == 0) {
  333.             AddOpt(&CppOptList, "-I0", "");
  334.             break;
  335.             }
  336.             if (*ptr == 0)
  337.             ptr = av[++i];
  338.             AddOpt(&CppOptList, "-I", ptr);
  339.             break;
  340.         case 'd':   /*  -dice -d<n> -d<debug_opts>  */
  341.             if (strcmp(ptr, "ice") == 0) {
  342.             CompilerOpt = DICE_C;
  343.             break;
  344.             }
  345.             if (atoi(ptr)) {
  346.             DDebug = atoi(ptr);
  347.             break;
  348.             }
  349.             sprintf(DebugOpts, " -d%s", ptr);
  350.             break;
  351.         case 'D':   /*  -Ddefine[=str] */
  352.             if (*ptr == 0)
  353.             ptr = av[++i];
  354.             AddOpt(&CppOptList, "-D", ptr);
  355.             break;
  356.         case 'H':   /*  -H<path>=<include_name>    */
  357.             if (*ptr == 0)
  358.             ptr = av[++i];
  359.             AddOpt(&CppOptList, "-H", ptr);
  360.             break;
  361.         case 'U':   /*  -U      -undefine certain symbols */
  362.             AddOpt(&CppOptList, "-U", ptr);
  363.             break;
  364.         case 'o':
  365.             if (*ptr)
  366.             OutFile = ptr;
  367.             else
  368.             OutFile = av[++i];
  369.             {
  370.             short idx = strlen(OutFile) - 2;
  371.             if (idx >= 0) {
  372.                 if (stricmp(OutFile + idx, ".h") == 0 || stricmp(OutFile + idx, ".c") == 0) {
  373.                 puts("ERROR! -o output file may not end in .c or .h!");
  374.                 exit(20);
  375.                 }
  376.             }
  377.             }
  378.             break;
  379.         case 'O':
  380.             if (*ptr)
  381.             OutDir = ptr;
  382.             else
  383.             OutDir = av[++i];
  384.             break;
  385.         case 'E':   /*  error output append */
  386.             if (*ptr == 0)
  387.             ptr = av[++i];
  388.  
  389.             if (freopen(ptr, "a", stderr)) {
  390.             ErrFile = ptr;
  391.             sprintf(ErrOptStr," -E %s", ptr);
  392.             } else {
  393.             printf("unable to append to %s\n", ptr);
  394.             }
  395.             break;
  396.         case 'p':
  397.             if (str