PRUnichar* start = (PRUnichar*)(const PRUnichar*)aAttributes.GetUnicode();
PRUnichar* start = (PRUnichar*)(const PRUnichar*)aAttributes.get();
SetOperator(OperatorData*   aOperatorData,            nsOperatorFlags aForm,            nsString        aOperator,            nsString        aAttributes){  // aOperator is in the expanded format \uNNNN\uNNNN ...  // First compress these Unicode points to the internal nsString format  PRInt32 i = 0;  nsAutoString name, value;  PRInt32 len = aOperator.Length();  PRUnichar c = aOperator[i++];  PRUint32 state  = 0;  PRUnichar uchar = 0;  while (i <= len) {    if (0 == state) {      if (c != '\\')        return PR_FALSE;      if (i < len)        c = aOperator[i];      i++;      if (('u' != c) && ('U' != c))        return PR_FALSE;      if (i < len)        c = aOperator[i];      i++;      state++;    }    else {      if (('0' <= c) && (c <= '9'))         uchar = (uchar << 4) | (c - '0');      else if (('a' <= c) && (c <= 'f'))         uchar = (uchar << 4) | (c - 'a' + 0x0a);      else if (('A' <= c) && (c <= 'F'))         uchar = (uchar << 4) | (c - 'A' + 0x0a);      else return PR_FALSE;      if (i < len)        c = aOperator[i];      i++;      state++;      if (5 == state) {        value.Append(uchar);        uchar = 0;        state = 0;      }    }  }  if (0 != state) return PR_FALSE;  // Quick return when the caller doesn't care about the attributes and just wants  // to know if this is a valid operator (this is the case at the first pass of the  // parsing of the dictionary in InitOperators())  if (!aForm) return PR_TRUE;  // Add operator to hash table (symmetric="true" by default for all operators)  aOperatorData->mFlags |= aForm | NS_MATHML_OPERATOR_SYMMETRIC;  aOperatorData->mStr.Assign(value);  value.AppendInt(aForm, 10);  nsStringKey key(value);  gOperatorTable->Put(&key, aOperatorData);#ifdef NS_DEBUG  char str[200];  aAttributes.ToCString(str, sizeof(str));#endif  // Loop over the space-delimited list of attributes to get the name:value pairs  aAttributes.Append(kNullCh);  // put an extra null at the end  PRUnichar* start = (PRUnichar*)(const PRUnichar*)aAttributes.GetUnicode();  PRUnichar* end   = start;  while ((kNullCh != *start) && (kDashCh != *start)) {    name.SetLength(0);    value.SetLength(0);    // skip leading space, the dash amounts to the end of the line    while ((kNullCh!=*start) && (kDashCh!=*start) && nsCRT::IsAsciiSpace(*start)) {      ++start;    }    end = start;    // look for ':' or '='    while ((kNullCh!=*end) && (kDashCh!=*end) && (kColonCh!=*end) && (kEqualCh!=*end)) {      ++end;    }    if ((kColonCh!=*end) && (kEqualCh!=*end)) {#ifdef NS_DEBUG      printf("Bad MathML operator: %s\n", str);#endif      return PR_TRUE;    }    *end = kNullCh; // end segment here    // this segment is the name    if (start < end) {      name.Assign(start);    }    start = ++end;    // look for space or end of line    while ((kNullCh!=*end) && (kDashCh!=*start) && !nsCRT::IsAsciiSpace(*end)) {      ++end;    }    *end = kNullCh; // end segment here    // this segment is the value    if (start < end) {      value.Assign(start);    }    SetProperty(aOperatorData, name, value);    start = ++end;  }  return PR_TRUE;}