User:Minooz/OSD600/FF/patch565031

From CDOT Wiki
< User:Minooz‎ | OSD600‎ | FF
Revision as of 16:58, 17 April 2011 by Minooz (talk | contribs) (Apr16)
Jump to: navigation, search

Apr16

The review of the bug suggests to start over the function based on the HTML5 specs.
However, the spec is using an integer list to add the valid values dynamically. There are memory allocation problems with that in c++.
Seems the existing method is more reasonable for doing the same concept but not following exact same steps.
Also I'm not sure how using aSpec of type nsAString is doable instead of converting it using ToNewCString(aSpec)
So, still working on these issues...
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 == ',')
         {