char* s_tag = node.get_nodeName().toC();
char* s_tag = NULL;  if (node.get_namespaceURI() == 0) s_tag = node.get_nodeName().toC(); else s_tag = node.get_localName().toC();
  assert(node != 0);  assert(parent != NULL);  // TODO: namespaces  //  if (node->ns != NULL && xmlStrcmp(node->ns->prefix, XMLSTRING(MATHML_NS_PREFIX))) {  //  if (verbose) fprintf(stderr, "WARNING: skipping element with namespace `%s'\n", node->ns->prefix);  //  return;  //}#if defined(HAVE_MINIDOM)  if (!mdom_node_is_element(node)) {    MathEngine::logger(LOG_WARNING, "skipping unrecognized node (type %d)\n", mdom_node_get_type(node));    return;  }  TagId tag = TagIdOfName(C_CONST_STRING(mdom_node_get_name(node)));  MathMLElement* elem = NULL;#elif defined(HAVE_GMETADOM)  if (node.get_nodeType() != GMetaDOM::Node::ELEMENT_NODE) {    MathEngine::logger(LOG_WARNING, "skipping unrecognized node (type %d)\n", node.get_nodeType());    return;  }  char* s_tag = node.get_nodeName().toC();  TagId tag = TagIdOfName(s_tag);  delete [] s_tag;  MathMLElement* elem = NULL;#endif // HAVE_GMETADOM  switch (tag) {  case TAG_MATH:    elem = new MathMLmathElement(node);    break;  case TAG_MI:  case TAG_MN:    elem = new MathMLTokenElement(node, tag);    break;  case TAG_MO:    elem = new MathMLOperatorElement(node);    break;  case TAG_MTEXT:    elem = new MathMLTextElement(node);    break;  case TAG_MSPACE:    elem = new MathMLSpaceElement(node);    break;  case TAG_MS:    elem = new MathMLStringLitElement(node);    break;  case TAG_MROW:    elem = new MathMLRowElement(node);    break;  case TAG_MFRAC:    elem = new MathMLFractionElement(node);    break;  case TAG_MSQRT:  case TAG_MROOT:    elem = new MathMLRadicalElement(node, tag);    break;  case TAG_MSTYLE:    elem = new MathMLStyleElement(node);    break;  case TAG_MERROR:    elem = new MathMLErrorElement(node);    break;  case TAG_MPADDED:    elem = new MathMLPaddedElement(node);    break;  case TAG_MPHANTOM:    elem = new MathMLPhantomElement(node);    break;  case TAG_MFENCED:    elem = new MathMLFencedElement(node);    break;  case TAG_MSUB:  case TAG_MSUP:  case TAG_MSUBSUP:    elem = new MathMLScriptElement(node, tag);    break;  case TAG_MUNDER:  case TAG_MOVER:  case TAG_MUNDEROVER:    elem = new MathMLUnderOverElement(node, tag);    break;  case TAG_MMULTISCRIPTS:    elem = new MathMLMultiScriptsElement(node);    break;  case TAG_MPRESCRIPTS:  case TAG_NONE:    if (parent != NULL && parent->IsA() == TAG_MMULTISCRIPTS)      elem = new MathMLElement(node, tag);    break;  case TAG_MTABLE:    elem = new MathMLTableElement(node);    break;  case TAG_MTR:  case TAG_MLABELEDTR:    if (parent != NULL && parent->IsA() == TAG_MTABLE)      elem = new MathMLTableRowElement(node, tag);    break;  case TAG_MTD:    if (parent != NULL && (parent->IsA() == TAG_MTR || parent->IsA() == TAG_MLABELEDTR || parent->IsA() == TAG_MTABLE))      elem = new MathMLTableCellElement(node);    break;  case TAG_MALIGNGROUP:    elem = new MathMLAlignGroupElement(node);    break;  case TAG_MALIGNMARK:    elem = new MathMLAlignMarkElement(node);    break;  case TAG_MACTION:    elem = new MathMLActionElement(node);    break;  case TAG_MENCLOSE:    elem = new MathMLEncloseElement(node);    break;  case TAG_SEMANTICS:    elem = new MathMLSemanticsElement(node);    break;  case TAG_MCHAR:    MathEngine::logger(LOG_WARNING, "`mchar' is not a valid MathML element (ignored)");    break;  case TAG_NOTVALID:  default:    break;  }