home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / C / SASC6571.LZX / extras / ucc / ucc.c < prev   
Encoding:
C/C++ Source or Header  |  1996-12-24  |  3.4 KB  |  143 lines

  1. /*-------------------------------------------------------------------*/
  2. /*                                                                   */
  3. /* Copyright (c) 1992 by Doug Walker.  All Rights Reserved.          */
  4. /*                                                                   */
  5. /*-------------------------------------------------------------------*/
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <proto/exec.h>
  9. #include <proto/dos.h>
  10.  
  11. char version[] = "$VER: UCC 1.0";
  12.  
  13. #define ALLOC(x) AllocMem(x, 0)
  14. #define FREE(x,s) FreeMem(x, s)
  15. #define MSG(x) if(Output()) {Write(Output(), x, strlen(x));}
  16.  
  17. struct CMD
  18. {
  19.    char *cmd;
  20.    int used;
  21.    int max;
  22. };
  23. #define CMDINCR 512
  24.  
  25. static void cmdadd(struct CMD *cmd, char *add, int dquote)
  26. {
  27.    int addlen;
  28.    char *new;
  29.    addlen = strlen(add);
  30.    if(cmd->used + addlen + 4 > cmd->max)
  31.    {
  32.       if(!(new = ALLOC(addlen+CMDINCR)))
  33.       {
  34.          MSG("ERROR: Not enough memory!\n");
  35.          exit(20);
  36.       }
  37.       memcpy(new, cmd->cmd, cmd->used);
  38.       FREE(cmd->cmd, cmd->max);
  39.       cmd->cmd = new;
  40.       cmd->max += addlen+CMDINCR;
  41.    }
  42.    if(dquote) cmd->cmd[cmd->used++] = '"';
  43.    memcpy(cmd->cmd+cmd->used, add, addlen);
  44.    cmd->used += addlen;
  45.    if(dquote) cmd->cmd[cmd->used++] = '"';
  46.    cmd->cmd[cmd->used++] = ' ';
  47. }
  48.  
  49. static int cmdargadd(struct CMD *cmd, char *add, char *opt, char *next)
  50. {
  51.    int rc = 0;
  52.    if(opt[2]) next = opt+2;
  53.    else if(!next || next[0] == '-') return(0);
  54.    else rc = 1;
  55.    cmdadd(cmd, add, 0);
  56.    cmdadd(cmd, next, 1);
  57.    return(rc);
  58. }
  59.  
  60. int main(int argc, char *argv[])
  61. {
  62.    struct CMD cmd;
  63.    int verbose = 0;
  64. #if DODEBUG
  65.    int docmd = 1;
  66. #endif
  67.  
  68.    memset(&cmd, 0, sizeof(cmd));
  69.    cmdadd(&cmd, "SC NOVER LINK", 0);
  70.    argc--, argv++;
  71.    while(argc>0)
  72.    {
  73.       if(argv[0][0] == '-')
  74.       {
  75.          switch(argv[0][1])
  76.          {
  77.             case 'c': cmdadd(&cmd, "NoLink", 0);                 break;
  78.             case 'O': cmdadd(&cmd, "Opt", 0);                    break;
  79.             case 'g': cmdadd(&cmd, "Debug=SF", 0);               break;
  80.  
  81.             case 'I':
  82.                if(cmdargadd(&cmd, "idir", argv[0], argv[1]))
  83.                   argv++, argc--;
  84.                break;
  85.  
  86.             case 'D':
  87.                if(cmdargadd(&cmd, "def", argv[0], argv[1]))
  88.                   argv++, argc--;
  89.                break;
  90.  
  91.             case 'P':
  92.             case 'E': cmdadd(&cmd, "PPonly", 0);                 break;
  93.  
  94.             case 'l':
  95.                switch(argv[0][2])
  96.                {
  97.                   case 'm':
  98.                      cmdadd(&cmd, "Math=S", 0);
  99.                      break;
  100.                }
  101.                break;
  102.  
  103.             case 'o':
  104.                if(cmdargadd(&cmd, "To", argv[0], argv[1]))
  105.                   argc--, argv++;
  106.                break;
  107.  
  108.             case 'v': 
  109.                cmdadd(&cmd, "Verbose Version", 0);         
  110.                verbose = 1;
  111.                break;
  112.  
  113.             case 'w': cmdadd(&cmd, "Nowarn", 0);                  break;
  114. #if DODEBUG
  115.             case 'n': docmd = 0; break;
  116. #endif
  117.             default:
  118.                MSG("ERROR: Unknown option \"");
  119.                MSG(argv[0])
  120.                MSG("\"\n");
  121.                return(20);
  122.          }
  123.       }
  124.       else
  125.          cmdadd(&cmd, argv[0], 1);
  126.       argc--, argv++;
  127.    }
  128.    if(cmd.cmd)
  129.    {
  130.       cmd.cmd[cmd.used++] = 0;
  131.       if(verbose)
  132.       {
  133.          MSG(cmd.cmd);
  134.          MSG("\n");
  135.       }
  136. #if DODEBUG
  137.       if(docmd)
  138. #endif
  139.       system(cmd.cmd);
  140.    }
  141.    return(0);
  142. }
  143.