char* token = nsCRT::strtok( str, ", ", &newStr );
char* token = nsCRT::strtok( str, "| ", &newStr );
nsXBLBinding::BuildInsertionTable(){  if (!mInsertionPointTable)     mInsertionPointTable = new nsSupportsHashtable;    nsCOMPtr<nsISupportsArray> childrenElements;  NS_NewISupportsArray(getter_AddRefs(childrenElements));  GetNestedChildren(kChildrenAtom, mContent, childrenElements);  PRUint32 count;  childrenElements->Count(&count);  for (PRUint32 i = 0; i < count; i++) {    nsCOMPtr<nsISupports> supp;    childrenElements->GetElementAt(i, getter_AddRefs(supp));    nsCOMPtr<nsIContent> child(do_QueryInterface(supp));    if (child) {      nsCOMPtr<nsIContent> parent;       child->GetParent(*getter_AddRefs(parent));      nsAutoString includes;      child->GetAttribute(kNameSpaceID_None, kIncludesAtom, includes);      if (includes.IsEmpty()) {        nsISupportsKey key(kChildrenAtom);        mInsertionPointTable->Put(&key, parent);      }      else {        // The user specified at least one attribute.        char* str = includes.ToNewCString();        char* newStr;        // XXX We should use a strtok function that tokenizes PRUnichar's        // so that we don't have to convert from Unicode to ASCII and then back        char* token = nsCRT::strtok( str, ", ", &newStr );        while( token != NULL ) {          // Build an atom out of this string.          nsCOMPtr<nsIAtom> atom;                      nsAutoString tok; tok.AssignWithConversion(token);          atom = getter_AddRefs(NS_NewAtom(tok.GetUnicode()));                     nsISupportsKey key(atom);          mInsertionPointTable->Put(&key, parent);                    token = nsCRT::strtok( newStr, ", ", &newStr );        }        nsMemory::Free(str);      }    }  }}