VirtualBox

Changeset 1831 in kBuild for trunk/src/kmk


Ignore:
Timestamp:
Oct 11, 2008 1:11:16 PM (16 years ago)
Author:
bird
Message:

kmk: find_char_unquote optimizations, some cleanup and a fix.

Location:
trunk/src/kmk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/expand.c

    r1830 r1831  
    505505      o = variable_buffer_output (o, "\0", 2);
    506506      *eolp = o - 2;
     507      assert (strchr (variable_buffer + line_offset, '\0') == *eolp);
    507508      return (variable_buffer + line_offset);
    508509    }
     
    706707  o = variable_buffer_output (o, "\0", 2); /* KMK: compensate for the strlen + 1 that was removed above. */
    707708  *eolp = o - 2;
     709  assert (strchr (variable_buffer + line_offset, '\0') == *eolp);
    708710  return (variable_buffer + line_offset);
    709711}
  • trunk/src/kmk/kbuild.c

    r1827 r1831  
    19031903    kbuild_put_sdks(&Sdks);
    19041904    (void)pszFuncName;
    1905     return variable_buffer_output(o, "", 1); /** @todo not right. */
     1905    return variable_buffer_output(o, "", 1) - 1; /** @todo why? */
    19061906}
    19071907
  • trunk/src/kmk/read.c

    r1827 r1831  
    158158#ifndef CONFIG_WITH_VALUE_LENGTH
    159159static void remove_comments (char *line);
    160 #else
    161 static char *remove_comments (char *line, char *eol);
    162 #endif
    163160static char *find_char_unquote (char *string, int stop1, int stop2,
    164161                                int blank, int ignorevars);
     162#else
     163__inline static char *remove_comments (char *line, char *eol);
     164__inline static char *find_char_unquote_0 (char *string, int stop1, char **eosp);
     165static char * find_char_unquote_2 (char *string, int stop1, int stop2,
     166                                   int blank, int ignorevars,
     167                                   unsigned int string_len);
     168__inline static char *
     169find_char_unquote (char *string, int stop1, int stop2, int blank, int ignorevars)
     170{
     171    if (!stop2 && !blank && !ignorevars)
     172      {
     173        char *p = strchr (string, stop1);
     174        if (!p)
     175          return NULL;
     176        if (p <= string || p[-1] != '\\')
     177          return p;
     178        /* fall back on find_char_unquote_2 */
     179      }
     180    return find_char_unquote_2 (string, stop1, stop2, blank, ignorevars, 0);
     181}
     182#endif
    165183
    166184
     
    536554  struct floc *fstart;
    537555  struct floc fi;
     556#ifdef CONFIG_WITH_VALUE_LENGTH
     557  unsigned int tmp_len;
     558#endif
    538559
    539560#define record_waiting_files()                                                \
     
    10681089        /* Search the line for an unquoted ; that is not after an
    10691090           unquoted #.  */
     1091#ifndef CONFIG_WITH_VALUE_LENGTH
    10701092        cmdleft = find_char_unquote (line, ';', '#', 0, 1);
     1093#else
     1094        cmdleft = find_char_unquote_2 (line, ';', '#', 0, 1, ebuf->eol - line);
     1095#endif
    10711096        if (cmdleft != 0 && *cmdleft == '#')
    10721097          {
     
    11111136          }
    11121137
     1138
     1139#ifndef CONFIG_WITH_VALUE_LENGTH
    11131140        p2 = variable_expand_string(NULL, lb_next, wlen);
     1141#else
     1142        p2 = variable_expand_string_2 (NULL, lb_next, wlen, &eol);
     1143        assert (strchr (p2, '\0') == eol);
     1144#endif
    11141145
    11151146        while (1)
     
    11191150              {
    11201151                /* Look for a semicolon in the expanded line.  */
     1152#ifndef CONFIG_WITH_VALUE_LENGTH
    11211153                cmdleft = find_char_unquote (p2, ';', 0, 0, 0);
     1154#else
     1155                cmdleft = find_char_unquote_0 (p2, ';', &eol);
     1156#endif
    11221157
    11231158                if (cmdleft != 0)
     
    11251160                    unsigned long p2_off = p2 - variable_buffer;
    11261161                    unsigned long cmd_off = cmdleft - variable_buffer;
     1162#ifndef CONFIG_WITH_VALUE_LENGTH
    11271163                    char *pend = p2 + strlen(p2);
     1164#endif
    11281165
    11291166                    /* Append any remnants of lb, then cut the line short
     
    11391176                       expand below once we know we don't have a
    11401177                       target-specific variable. */
     1178#ifndef CONFIG_WITH_VALUE_LENGTH
    11411179                    (void)variable_expand_string(pend, lb_next, (long)-1);
    11421180                    lb_next += strlen(lb_next);
     1181#else
     1182                    tmp_len = strlen (lb_next);
     1183                    variable_expand_string_2 (eol, lb_next, tmp_len, &eol);
     1184                    lb_next += tmp_len;
     1185#endif
    11431186                    p2 = variable_buffer + p2_off;
    11441187                    cmdleft = variable_buffer + cmd_off + 1;
     
    11461189              }
    11471190
     1191#ifndef CONFIG_WITH_VALUE_LENGTH
    11481192            colonp = find_char_unquote(p2, ':', 0, 0, 0);
     1193#else
     1194            colonp = find_char_unquote_0 (p2, ':', &eol);
     1195#endif
    11491196#ifdef HAVE_DOS_PATHS
    11501197            /* The drive spec brain-damage strikes again...  */
     
    11551202                   colonp > p2 && isalpha ((unsigned char)colonp[-1]) &&
    11561203                   (colonp == p2 + 1 || strchr (" \t(", colonp[-2]) != 0))
     1204# ifndef CONFIG_WITH_VALUE_LENGTH
    11571205              colonp = find_char_unquote(colonp + 1, ':', 0, 0, 0);
     1206# else
     1207              colonp = find_char_unquote_0 (colonp + 1, ':', &eol);
     1208# endif
    11581209#endif
    11591210            if (colonp != 0)
     
    11641215              break;
    11651216
     1217#ifndef CONFIG_WITH_VALUE_LENGTH
    11661218            p2 += strlen(p2);
    11671219            *(p2++) = ' ';
    11681220            p2 = variable_expand_string(p2, lb_next, wlen);
     1221#else
     1222            *(eol++) = ' ';
     1223            p2 = variable_expand_string_2 (eol, lb_next, wlen, &eol);
     1224#endif
    11691225            /* We don't need to worry about cmdleft here, because if it was
    11701226               found in the variable_buffer the entire buffer has already
     
    12771333          {
    12781334            unsigned int l = p2 - variable_buffer;
     1335#ifndef CONFIG_WITH_VALUE_LENGTH
    12791336            (void) variable_expand_string (p2 + plen, lb_next, (long)-1);
     1337#else
     1338            char *eos;
     1339            (void) variable_expand_string_2 (p2 + plen, lb_next, (long)-1, &eos);
     1340#endif
    12801341            p2 = variable_buffer + l;
    12811342
     
    12831344            if (cmdleft == 0)
    12841345              {
     1346#ifndef CONFIG_WITH_VALUE_LENGTH
    12851347                cmdleft = find_char_unquote (p2, ';', 0, 0, 0);
     1348#else
     1349                cmdleft = find_char_unquote_0 (p2, ';', &eos);
     1350#endif
    12861351                if (cmdleft != 0)
    12871352                  *(cmdleft++) = '\0';
     
    14941559static void
    14951560remove_comments (char *line)
    1496 #else
    1497 static char *
    1498 remove_comments (char *line, char *eol)
    1499 #endif
    15001561{
    15011562  char *comment;
     
    15061567    /* Cut off the line at the #.  */
    15071568    *comment = '\0';
    1508 
    1509 #ifdef CONFIG_WITH_VALUE_LENGTH
    1510   if (comment)
    1511     eol = comment;
    1512   assert (strchr (line, '\0') == eol);
    1513   return eol;
    1514 #endif
    15151569}
     1570#else  /* CONFIG_WITH_VALUE_LENGTH */
     1571__inline static char *
     1572remove_comments (char *line, char *eol)
     1573{
     1574  unsigned int string_len = eol - line;
     1575  register int ch;
     1576  char *p;
     1577
     1578  /* Hope for simple (no comments). */
     1579  p = memchr (line, '#', string_len);
     1580  if (!p)
     1581    return eol;
     1582
     1583  /* Found potential comment, enter the slow route. */
     1584  for (;;)
     1585    {
     1586      if (p > line && p[-1] == '\\')
     1587        {
     1588          /* Search for more backslashes.  */
     1589          int i = -2;
     1590          while (&p[i] >= line && p[i] == '\\')
     1591            --i;
     1592          ++i;
     1593
     1594          /* The number of backslashes is now -I.
     1595             Copy P over itself to swallow half of them.  */
     1596          memmove (&p[i], &p[i/2], (string_len - (p - line)) - (i/2) + 1);
     1597          p += i/2;
     1598          if (i % 2 == 0)
     1599            {
     1600              /* All the backslashes quoted each other; the STOPCHAR was
     1601                 unquoted.  */
     1602              *p = '\0';
     1603              return p;
     1604            }
     1605
     1606          /* The '#' was quoted by a backslash.  Look for another.  */
     1607        }
     1608      else
     1609        {
     1610          /* No backslash in sight.  */
     1611          *p = '\0';
     1612          return p;
     1613        }
     1614
     1615      /* lazy, string_len isn't correct so do it the slow way. */
     1616      while ((ch = *p) != '#')
     1617        {
     1618          if (ch == '\0')
     1619            return p;
     1620          ++p;
     1621        }
     1622    }
     1623  /* won't ever get here. */
     1624}
     1625#endif /* CONFIG_WITH_VALUE_LENGTH */
    15161626
    15171627/* Execute a `define' directive.
     
    25402650   STOPCHAR _cannot_ be '$' if IGNOREVARS is true.  */
    25412651
     2652#ifndef CONFIG_WITH_VALUE_LENGTH
    25422653static char *
    25432654find_char_unquote (char *string, int stop1, int stop2, int blank,
    25442655                   int ignorevars)
     2656#else
     2657static char *
     2658find_char_unquote_2 (char *string, int stop1, int stop2, int blank,
     2659                     int ignorevars, unsigned int string_len)
     2660#endif
    25452661{
     2662#ifndef CONFIG_WITH_VALUE_LENGTH
    25462663  unsigned int string_len = 0;
     2664#endif
    25472665  char *p = string;
    25482666  register int ch; /* bird: 'optimiziations' */
     2667#ifdef CONFIG_WITH_VALUE_LENGTH
     2668  assert (string_len == 0 || string_len == strlen (string));
     2669#endif
    25492670
    25502671  if (ignorevars)
     
    26312752  return 0;
    26322753}
     2754
     2755#ifdef CONFIG_WITH_VALUE_LENGTH
     2756/* Special case version of find_char_unquote that only takes stop1.
     2757   This is so common that it makes a lot of sense to specialize this.
     2758   */
     2759__inline static char *
     2760find_char_unquote_0 (char *string, int stop1, char **eosp)
     2761{
     2762  unsigned int string_len = *eosp - string;
     2763  char *p = (char *)memchr (string, stop1, string_len);
     2764  assert (strlen (string) == string_len);
     2765  if (!p)
     2766    return NULL;
     2767  if (p <= string || p[-1] != '\\')
     2768    return p;
     2769
     2770  p = find_char_unquote_2 (string, stop1, 0, 0, 0, string_len);
     2771  *eosp = memchr (string, '\0', string_len);
     2772  return p;
     2773}
     2774#endif
    26332775
    26342776/* Search PATTERN for an unquoted % and handle quoting.  */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette