Open main menu

CDOT Wiki β

User:Minooz/OSD600/FF/patch565031

< User:Minooz‎ | OSD600‎ | FF
Revision as of 15:54, 17 April 2011 by Minooz (talk | contribs) (Apr16)

Apr16

void Area::ParseCoords(const nsAString& aSpec)
{
  char* cp = ToNewCString(aSpec);
  if (!&aSpec) {
    return;
  }
    char *tptr;
    char *n_str;
    PRInt32 i, cnt;
    PRInt32 *value_list;
    PRBool negated = false;
    PRBool started = false;
    PRBool gotNumber = false;
    PRBool finished = false;
    PRBool bogus = false;

    /*
     * Nothing in an empty list
     */
    mNumCoords = 0;
    mCoords = nsnull;

    /*
     * Skip beginning whitespace, all whitespace is empty list.
     */
    n_str = cp;
    while (is_separator(*n_str))
    {
      n_str++;
    }
    if (*n_str == '\0')
    {
      return;
    }

    /*
     * Make a pass where any two numbers separated by just whitespace
     * are given a comma separator.  Count entries while passing.
     */
    cnt = 0;
    while (*n_str != '\0')
    {
      tptr = n_str;
      if (*n_str == '-')
      {
        if (gotNumber)
        {
          finished = true;
          break;
        }
        if (started)
          negated = false;
        else
        {
          if (!bogus)
            negated = true;
        }
        started = true;
        tptr++;
        cnt++;
      }
      else if (*n_str >= '0' && *n_str <= '9')
      {
        if (finished)
          break;
        *tptr += *tptr * 10;
        started = gotNumber = true;
        tptr++;
        cnt++;
      }
      else if (is_separator(*n_str))
      {
        if (!gotNumber)
          break;
        if (!negated)
        *tptr += *tptr;
       
      }
      else
      {
      }
     
    }
    /*
     * count the last entry in the list.
     */
    cnt++;

    /*
     * Allocate space for the coordinate array.
     */
    value_list = new nscoord[cnt];
    if (!value_list)
    {
      return;
    }

    /*
     * Second pass to copy integer values into list.
     */
    tptr = cp;
    for (i=0; i<cnt; i++)
    {
      char *ptr;

      ptr = strchr(tptr, ',');
      if (ptr)
      {
        *ptr = '\0';
      }
      /*
       * Strip whitespace in front of number because I don't
       * trust atoi to do it on all platforms.
       */
      while (*tptr == ' ')
      {
        tptr++;
      }
      if (*tptr == '\0')
      {
        value_list[i] = 0;
      }
      else
      {
        value_list[i] = (nscoord) ::atoi(tptr);
      }
      if (ptr)
      {
        *ptr = ',';
        tptr = ptr + 1;
      }
    }

    mNumCoords = cnt;
    mCoords = value_list;

    NS_Free(cp);

Apr6

// Modified based on Matt Postil's Version
diff -r e6b318aca788 layout/generic/nsImageMap.cpp
--- a/layout/generic/nsImageMap.cpp	Wed Apr 06 17:38:21 2011 -0700
+++ b/layout/generic/nsImageMap.cpp	Sat Apr 09 20:50:51 2011 -0400
@@ -112,12 +112,7 @@
 inline PRBool
 is_space(char c)
 {
-  return (c == ' ' ||
-          c == '\f' ||
-          c == '\n' ||
-          c == '\r' ||
-          c == '\t' ||
-          c == '\v');
+  return c == ' ';
 }
 
 static void logMessage(nsIContent*      aContent,
@@ -186,12 +181,17 @@
        * Skip to a separator
        */
       tptr = n_str;
-      while (!is_space(*tptr) && *tptr != ',' && *tptr != '\0')
+      while (!is_space(*tptr) && *tptr != ',' &&  *tptr != ';' && *tptr != '\0')
       {
         tptr++;
       }
       n_str = tptr;
 
       /*
        * If no more entries, break out here
        */
@@ -205,7 +205,7 @@
        * comma.
        */
       has_comma = PR_FALSE;
-      while (is_space(*tptr) || *tptr == ',')
+      while (is_space(*tptr) || *tptr == ',' || *tptr == ';')
       {
         if (*tptr == ',')
         {