Ignore:
Timestamp:
May 23, 2007, 7:31:19 AM (18 years ago)
Author:
bird
Message:

Merged with the 2007-05-23 CVS. Added rsort and fixed a couple of windows build issues.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/gmakenew/implicit.c

    r503 r903  
    2626#include "commands.h" /* set_file_variables */
    2727
    28 static int
    29 pattern_search PARAMS ((struct file *file, int archive,
    30                         unsigned int depth, unsigned int recursions));
     28static int pattern_search (struct file *file, int archive,
     29                           unsigned int depth, unsigned int recursions);
    3130
    3231
     
    7271{
    7372  struct idep *next;              /* struct dep -compatible interface */
    74   char *name;                     /* name of the prerequisite */
     73  const char *name;               /* name of the prerequisite */
    7574  struct file *intermediate_file; /* intermediate file, 0 otherwise */
    76   char *intermediate_pattern;    /* pattern for intermediate file */
     75  const char *intermediate_pattern; /* pattern for intermediate file */
    7776  unsigned char had_stem;         /* had % substituted with stem */
    7877  unsigned char ignore_mtime;     /* ignore_mtime flag */
     
    8786    {
    8887      n = p->next;
    89 
    90       if (p->name)
    91         {
    92           struct file *f = p->intermediate_file;
    93 
    94           if (f != 0
    95               && (f->stem < f->name || f->stem > f->name + strlen (f->name)))
    96             free (f->stem);
    97 
    98           free (p->name);
    99         }
    100 
    10188      free (p);
    10289    }
     
    10996
    11097static char *
    111 get_next_word (char *buffer, unsigned int *length)
     98get_next_word (const char *buffer, unsigned int *length)
    11299{
    113   char *p = buffer, *beg;
     100  const char *p = buffer, *beg;
    114101  char c;
    115102
     
    182169    *length = p - beg;
    183170
    184   return beg;
     171  return (char *)beg;
    185172}
    186173
     
    204191{
    205192  /* Filename we are searching for a rule for.  */
    206   char *filename = archive ? strchr (file->name, '(') : file->name;
     193  const char *filename = archive ? strchr (file->name, '(') : file->name;
    207194
    208195  /* Length of FILENAME.  */
     
    226213
    227214  /* Names of possible dependencies are constructed in this buffer.  */
    228   register char *depname = (char *) alloca (namelen + max_pattern_dep_length);
     215  char *depname = alloca (namelen + max_pattern_dep_length);
    229216
    230217  /* The start and length of the stem of FILENAME for the current rule.  */
    231   register char *stem = 0;
    232   register unsigned int stemlen = 0;
    233   register unsigned int fullstemlen = 0;
     218  const char *stem = 0;
     219  unsigned int stemlen = 0;
     220  unsigned int fullstemlen = 0;
    234221
    235222  /* Buffer in which we store all the rules that are possibly applicable.  */
    236   struct rule **tryrules
    237     = (struct rule **) xmalloc (num_pattern_rules * max_pattern_targets
    238                                 * sizeof (struct rule *));
     223  struct rule **tryrules = xmalloc (num_pattern_rules * max_pattern_targets
     224                                    * sizeof (struct rule *));
    239225
    240226  /* Number of valid elements in TRYRULES.  */
     
    243229  /* The numbers of the rule targets of each rule
    244230     in TRYRULES that matched the target file.  */
    245   unsigned int *matches
    246     = (unsigned int *) alloca (num_pattern_rules * sizeof (unsigned int));
     231  unsigned int *matches = alloca (num_pattern_rules * sizeof (unsigned int));
    247232
    248233  /* Each element is nonzero if LASTSLASH was used in
    249234     matching the corresponding element of TRYRULES.  */
    250   char *checked_lastslash
    251     = (char *) alloca (num_pattern_rules * sizeof (char));
     235  char *checked_lastslash = alloca (num_pattern_rules * sizeof (char));
    252236
    253237  /* The index in TRYRULES of the rule we found.  */
     
    261245  int specific_rule_matched = 0;
    262246
    263   unsigned int i = 0;  /* uninit checks OK */
     247  unsigned int ri;  /* uninit checks OK */
    264248  struct rule *rule;
    265249  struct dep *dep, *expl_d;
    266 
    267   char *p, *vname;
    268250
    269251  struct idep *d;
     
    296278          lastslash = bslash;
    297279        if (lastslash == 0 && filename[0] && filename[1] == ':')
    298           lastslash = filename + 1;
     280          lastslash = (char *)filename + 1;
    299281      }
    300282#endif
     
    310292  for (rule = pattern_rules; rule != 0; rule = rule->next)
    311293    {
     294      unsigned int ti;
     295
    312296      /* If the pattern rule has deps but no commands, ignore it.
    313297         Users cancel built-in rules by redefining them without commands.  */
     
    323307        }
    324308
    325       for (i = 0; rule->targets[i] != 0; ++i)
     309      for (ti = 0; ti < rule->num; ++ti)
    326310        {
    327           char *target = rule->targets[i];
    328           char *suffix = rule->suffixes[i];
     311          const char *target = rule->targets[ti];
     312          const char *suffix = rule->suffixes[ti];
    329313          int check_lastslash;
    330314
     
    335319            continue;
    336320
    337           if (rule->lens[i] > namelen)
     321          if (rule->lens[ti] > namelen)
    338322            /* It can't possibly match.  */
    339323            continue;
     
    342326             find the stem: the part of the filename that matches the %.  */
    343327          stem = filename + (suffix - target - 1);
    344           stemlen = namelen - rule->lens[i] + 1;
     328          stemlen = namelen - rule->lens[ti] + 1;
    345329
    346330          /* Set CHECK_LASTSLASH if FILENAME contains a directory
     
    408392             that rule will be in TRYRULES more than once.  */
    409393          tryrules[nrules] = rule;
    410           matches[nrules] = i;
     394          matches[nrules] = ti;
    411395          checked_lastslash[nrules] = check_lastslash;
    412396          ++nrules;
     
    417401     retroactively reject any non-"terminal" rules that do always match.  */
    418402  if (specific_rule_matched)
    419     for (i = 0; i < nrules; ++i)
    420       if (!tryrules[i]->terminal)
     403    for (ri = 0; ri < nrules; ++ri)
     404      if (!tryrules[ri]->terminal)
    421405        {
    422           register unsigned int j;
    423           for (j = 0; tryrules[i]->targets[j] != 0; ++j)
    424             if (tryrules[i]->targets[j][1] == '\0')
    425               break;
    426           if (tryrules[i]->targets[j] != 0)
    427             tryrules[i] = 0;
     406          unsigned int j;
     407          for (j = 0; j < tryrules[ri]->num; ++j)
     408            if (tryrules[ri]->targets[j][1] == '\0')
     409              {
     410                tryrules[ri] = 0;
     411                break;
     412              }
    428413        }
    429414
     
    439424         and chain them in DEPS.  */
    440425
    441       for (i = 0; i < nrules; i++)
     426      for (ri = 0; ri < nrules; ri++)
    442427        {
    443428          struct file *f;
     
    446431          int file_variables_set = 0;
    447432
    448           rule = tryrules[i];
     433          rule = tryrules[ri];
    449434
    450435          remove_explicit_deps = 0;
     
    467452             find the stem: the part of the filename that matches the %.  */
    468453          stem = filename
    469             + (rule->suffixes[matches[i]] - rule->targets[matches[i]]) - 1;
    470           stemlen = namelen - rule->lens[matches[i]] + 1;
    471           check_lastslash = checked_lastslash[i];
     454            + (rule->suffixes[matches[ri]] - rule->targets[matches[ri]]) - 1;
     455          stemlen = namelen - rule->lens[matches[ri]] + 1;
     456          check_lastslash = checked_lastslash[ri];
    472457          if (check_lastslash)
    473458            {
     
    491476            {
    492477              unsigned int len;
     478              char *p;
    493479              char *p2;
    494480              unsigned int order_only = 0; /* Set if '|' was seen. */
     
    536522                      if (p2 < p + len)
    537523                        {
    538                           register unsigned int i = p2 - p;
    539                           bcopy (p, depname, i);
    540                           bcopy ("$*", depname + i, 2);
    541                           bcopy (p2 + 1, depname + i + 2, len - i - 1);
     524                          unsigned int i = p2 - p;
     525                          memcpy (depname, p, i);
     526                          memcpy (depname + i, "$*", 2);
     527                          memcpy (depname + i + 2, p2 + 1, len - i - 1);
    542528                          depname[len + 2 - 1] = '\0';
    543529
     
    549535                      else
    550536                        {
    551                           bcopy (p, depname, len);
     537                          memcpy (depname, p, len);
    552538                          depname[len] = '\0';
    553539                        }
     
    568554                       if (p2 < p + len)
    569555                        {
    570                           register unsigned int i = p2 - p;
    571                           bcopy (p, depname, i);
    572                           bcopy (stem_str, depname + i, stemlen);
    573                           bcopy (p2 + 1, depname + i + stemlen, len - i - 1);
     556                          unsigned int i = p2 - p;
     557                          memcpy (depname, p, i);
     558                          memcpy (depname + i, stem_str, stemlen);
     559                          memcpy (depname + i + stemlen, p2 + 1, len - i - 1);
    574560                          depname[len + stemlen - 1] = '\0';
    575561
     
    581567                      else
    582568                        {
    583                           bcopy (p, depname, len);
     569                          memcpy (depname, p, len);
    584570                          depname[len] = '\0';
    585571                        }
     
    619605                              if (add_dir)
    620606                                {
    621                                   char *p = d->name;
    622 
    623                                   d->name = xmalloc (strlen (p) + l + 1);
    624 
    625                                   bcopy (filename, d->name, l);
    626                                   bcopy (p, d->name + l, strlen (p) + 1);
    627 
    628                                   free (p);
     607                                  char *n = alloca (strlen (d->name) + l + 1);
     608                                  memcpy (n, filename, l);
     609                                  memcpy (n+l, d->name, strlen (d->name) + 1);
     610                                  d->name = strcache_add (n);
    629611                                }
    630612
     
    658640          for (d = deps; d != 0; d = d->next)
    659641            {
    660               char *name = d->name;
     642              const char *name = d->name;
    661643
    662644              if (file_impossible_p (name))
     
    670652                        : _("Rejecting impossible rule prerequisite `%s'.\n"),
    671653                        name));
    672                   tryrules[i] = 0;
     654                  tryrules[ri] = 0;
    673655
    674656                  failed = 1;
     
    706688              /* This code, given FILENAME = "lib/foo.o", dependency name
    707689                 "lib/foo.c", and VPATH=src, searches for "src/lib/foo.c".  */
    708               vname = name;
    709               if (vpath_search (&vname, (FILE_TIMESTAMP *) 0))
    710                 {
    711                   DBS (DB_IMPLICIT,
    712                        (_("Found prerequisite `%s' as VPATH `%s'\n"),
    713                         name,
    714                         vname));
    715 
    716                   free (vname);
    717                   continue;
    718                 }
     690              {
     691                const char *vname = vpath_search (name, 0);
     692                if (vname)
     693                  {
     694                    DBS (DB_IMPLICIT,
     695                         (_("Found prerequisite `%s' as VPATH `%s'\n"),
     696                          name, vname));
     697                    continue;
     698                  }
     699              }
    719700
    720701
     
    726707                {
    727708                  if (intermediate_file == 0)
    728                     intermediate_file
    729                       = (struct file *) alloca (sizeof (struct file));
     709                    intermediate_file = alloca (sizeof (struct file));
    730710
    731711                  DBS (DB_IMPLICIT,
     
    733713                        name));
    734714
    735                   bzero ((char *) intermediate_file, sizeof (struct file));
     715                  memset (intermediate_file, '\0', sizeof (struct file));
    736716                  intermediate_file->name = name;
    737717                  if (pattern_search (intermediate_file,
     
    740720                                      recursions + 1))
    741721                    {
     722                      d->intermediate_pattern = intermediate_file->name;
     723                      intermediate_file->name = strcache_add (name);
    742724                      d->intermediate_file = intermediate_file;
    743                       d->intermediate_pattern = intermediate_file->name;
    744 
    745                       intermediate_file->name = xstrdup (name);
    746725                      intermediate_file = 0;
    747726
     
    781760      /* If we found an applicable rule without
    782761         intermediate files, don't try with them.  */
    783       if (i < nrules)
     762      if (ri < nrules)
    784763        break;
    785764
     
    792771    goto done;
    793772
    794   foundrule = i;
     773  foundrule = ri;
    795774
    796775  /* If we are recursing, store the pattern that matched
     
    825804  for (d = deps; d != 0; d = d->next)
    826805    {
    827       register char *s;
     806      const char *s;
    828807
    829808      if (d->intermediate_file != 0)
     
    845824            f->precious = 1;
    846825          else
    847             f = enter_file (imf->name);
     826            f = enter_file (strcache_add (imf->name));
    848827
    849828          f->deps = imf->deps;
     
    865844            {
    866845              dep->file = enter_file (dep->name);
    867               /* enter_file uses dep->name _if_ we created a new file.  */
    868               if (dep->name != dep->file->name)
    869                 free (dep->name);
    870846              dep->name = 0;
    871847              dep->file->tried_implicit |= dep->changed;
     
    881857          dep->file = lookup_file (s);
    882858          if (dep->file == 0)
    883             /* enter_file consumes S's storage.  */
    884859            dep->file = enter_file (s);
    885           else
    886             /* A copy of S is already allocated in DEP->file->name.
    887                So we can free S.  */
    888             free (s);
    889860        }
    890861      else
    891         {
    892           dep->name = s;
    893         }
     862        dep->name = s;
    894863
    895864      if (d->intermediate_file == 0 && tryrules[foundrule]->terminal)
     
    916885      /* Always allocate new storage, since STEM might be
    917886         on the stack for an intermediate file.  */
    918       file->stem = savestring (stem, stemlen);
     887      file->stem = strcache_add_len (stem, stemlen);
    919888      fullstemlen = stemlen;
    920889    }
     
    922891    {
    923892      int dirlen = (lastslash + 1) - filename;
     893      char *sp;
    924894
    925895      /* We want to prepend the directory from
    926896         the original FILENAME onto the stem.  */
    927897      fullstemlen = dirlen + stemlen;
    928       file->stem = (char *) xmalloc (fullstemlen + 1);
    929       bcopy (filename, file->stem, dirlen);
    930       bcopy (stem, file->stem + dirlen, stemlen);
    931       file->stem[fullstemlen] = '\0';
     898      sp = alloca (fullstemlen + 1);
     899      memcpy (sp, filename, dirlen);
     900      memcpy (sp + dirlen, stem, stemlen);
     901      sp[fullstemlen] = '\0';
     902      file->stem = strcache_add (sp);
    932903    }
    933904
     
    945916     `also_make' member.  */
    946917
    947   if (rule->targets[1] != 0)
    948     for (i = 0; rule->targets[i] != 0; ++i)
    949       if (i != matches[foundrule])
     918  if (rule->num > 1)
     919    for (ri = 0; ri < rule->num; ++ri)
     920      if (ri != matches[foundrule])
    950921        {
     922          char *p = alloca (rule->lens[ri] + fullstemlen + 1);
    951923          struct file *f;
    952924          struct dep *new = alloc_dep ();
    953925
    954926          /* GKM FIMXE: handle '|' here too */
    955           new->name = p = (char *) xmalloc (rule->lens[i] + fullstemlen + 1);
    956           bcopy (rule->targets[i], p,
    957                  rule->suffixes[i] - rule->targets[i] - 1);
    958           p += rule->suffixes[i] - rule->targets[i] - 1;
    959           bcopy (file->stem, p, fullstemlen);
     927          memcpy (p, rule->targets[ri],
     928                  rule->suffixes[ri] - rule->targets[ri] - 1);
     929          p += rule->suffixes[ri] - rule->targets[ri] - 1;
     930          memcpy (p, file->stem, fullstemlen);
    960931          p += fullstemlen;
    961           bcopy (rule->suffixes[i], p,
    962                  rule->lens[i] - (rule->suffixes[i] - rule->targets[i]) + 1);
     932          memcpy (p, rule->suffixes[ri],
     933                  rule->lens[ri] - (rule->suffixes[ri] - rule->targets[ri])+1);
     934          new->name = strcache_add (p);
    963935          new->file = enter_file (new->name);
    964936          new->next = file->also_make;
    965937
    966938          /* Set precious flag. */
    967           f = lookup_file (rule->targets[i]);
     939          f = lookup_file (rule->targets[ri]);
    968940          if (f && f->precious)
    969941            new->file->precious = 1;
Note: See TracChangeset for help on using the changeset viewer.