home *** CD-ROM | disk | FTP | other *** search
/ Total Destruction / Total_Destruction.iso / addons / Lccwin32.exe / Lccwin32 / lccpub / make / RULES.C < prev   
Encoding:
C/C++ Source or Header  |  1996-09-16  |  2.5 KB  |  131 lines

  1. /*
  2.  *    Control of the implicit suffix rules
  3.  */
  4.  
  5.  
  6. #include "h.h"
  7.  
  8.  
  9. /*
  10.  *    Return a pointer to the suffix of a name
  11.  */
  12. char *suffix(char *name)
  13. {
  14.   return strrchr(name, '.');
  15. }
  16.  
  17.  
  18. /*
  19.  *    Dynamic dependency.  This routine applies the suffis rules
  20.  *    to try and find a source and a set of rules for a missing
  21.  *    target.  If found, np is made into a target with the implicit
  22.  *    source name, and rules.  Returns TRUE if np was made into
  23.  *    a target.
  24.  */
  25. bool
  26. dyndep(np)
  27. struct name *        np;
  28. {
  29.   register char *        p;
  30.   register char *        q;
  31.   register char *        suff;        /*  Old suffix  */
  32.   register char *        basename;    /*  Name without suffix  */
  33.   struct name *        op;        /*  New dependent  */
  34.   struct name *        sp;        /*  Suffix  */
  35.   struct line *        lp;
  36.   struct depend *        dp;
  37.   char *            newsuff;
  38.   
  39.   
  40.   p = str1;
  41.   q = np->n_name;
  42.   if (!(suff = suffix(q)))
  43.     return FALSE;        /* No suffix */
  44.   while (q < suff)
  45.     *p++ = *q++;
  46.   *p = '\0';
  47.   basename = setmacro("*", str1)->m_val;
  48.   
  49.   if (!((sp = newname(".SUFFIXES"))->n_flag & N_TARG))
  50.     return FALSE;
  51.   
  52.   for (lp = sp->n_line; lp; lp = lp->l_next)
  53.     for (dp = lp->l_dep; dp; dp = dp->d_next)
  54.       {
  55.     newsuff = dp->d_name->n_name;
  56.     if (strlen(suff)+strlen(newsuff)+1 >= LZ)
  57.       fatal("Suffix rule too long");
  58.     p = str1;
  59.     q = newsuff;
  60.     while (*p++ = *q++)
  61.       ;
  62.     p--;
  63.     q = suff;
  64.     while (*p++ = *q++)
  65.       ;
  66.     sp = newname(str1);
  67.     if (sp->n_flag & N_TARG)
  68.       {
  69.         p = str1;
  70.         q = basename;
  71.         if (strlen(basename) + strlen(newsuff)+1 >= LZ)
  72.           fatal("Implicit name too long");
  73.         while (*p++ = *q++)
  74.           ;
  75.         p--;
  76.         q = newsuff;
  77.         while (*p++ = *q++)
  78.           ;
  79.         op = newname(str1);
  80.         if (!op->n_time)
  81.           modtime(op);
  82.         if (op->n_time)
  83.           {
  84.         dp = newdep(op, 0);
  85.         newline(np, dp, sp->n_line->l_cmd, 0);
  86.         setmacro("<", op->n_name);
  87.         return TRUE;
  88.           }
  89.       }
  90.       }
  91.   return FALSE;
  92. }
  93.  
  94.  
  95. /*
  96.  *    Make the default rules
  97.  */
  98. void
  99. makerules()
  100. {
  101.   struct cmd *cp;
  102.   struct name *np;
  103.   struct depend *dp;
  104.   
  105.   setmacro("CC", "lcc");
  106.   setmacro("CFLAGS", "-O");
  107.   np = newname(".c.obj");
  108.   cp = newcmd("$(CC) $(CFLAGS) $<", 0);
  109.   newline(np, 0, cp, 0);
  110.   
  111.   setmacro("AS", "lcc");
  112.   np = newname(".asm.obj");
  113.   cp = newcmd("$(AS) $<", 0);
  114.   newline(np, 0, cp, 0);
  115.  
  116.   np = newname(".obj");
  117.   dp = newdep(np, 0);
  118.  
  119.   np = newname(".asm");
  120.   dp = newdep(np, dp);
  121.  
  122.   np = newname(".c");
  123.   dp = newdep(np, dp);
  124.  
  125.   np = newname(".SUFFIXES");
  126.   newline(np, dp, 0, 0);
  127.  
  128.   setmacro ("MAKE",myname);
  129. }
  130.  
  131.