Exemple #1
0
const char* csXmlReadDocument::Parse (iFile* file, bool collapse)
{
  size_t want_size = file->GetSize ();
  char *data = (char*)cs_malloc (want_size + 1);
  char* parse_data = data;
  if (want_size >= 3)
  {
    if (file->Read (data, 3) != 3)
    {
      cs_free (parse_data);
      return "Unexpected EOF encountered";
    }
    want_size -= 3;
    if (!HasUTF8Bom (data))
      // Not a BOM - keep the read sata
      data += 3;
  }
  size_t real_size = file->Read (data, want_size);
  if (want_size != real_size)
  {
    cs_free (parse_data);
    return "Unexpected EOF encountered";
  }
  data[real_size] = '\0';
#ifdef CS_DEBUG
  if (strlen (data) != real_size)
  {
    cs_free (parse_data);
    return "File contains one or more null characters";
  }
#endif

  const char* b = parse_data;
  while ((*b == ' ') || (*b == '\n') || (*b == '\t') || 
    (*b == '\r')) b++;
  if (*b != '<')
  {
    cs_free (parse_data);
    return "Data does not seem to be XML.";
  }
  
  /* Note: it's okay if want_size is a bit too small;
   * it's not used as the actual data size in ParseInPlace,
   * only to choose between 'small' and 'large' docs. */
  return ParseInPlace (parse_data, want_size, collapse);
}
Exemple #2
0
const char* csXmlReadDocument::Parse (const char* buf, size_t bufSize, bool collapse)
{
  // Skip any UTF8 BOM
  if ((bufSize >= 3) && HasUTF8Bom (buf))
  {
    buf += 3;
    bufSize -= 3;
  }

  const char* b = buf;
  while ((*b == ' ') || (*b == '\n') || (*b == '\t') || 
    (*b == '\r')) b++;
  if (*b != '<')
  {
    return "Data does not seem to be XML.";
  }

  size_t want_size = bufSize;
  char *data = (char*)cs_malloc (want_size + 1);
  memcpy (data, buf, bufSize);
  data[bufSize] = 0;
  return ParseInPlace (data, bufSize, collapse);
}
HtmlElement *HtmlParser::Parse(const char *s, UINT codepage)
{
    HtmlElement *root = ParseInPlace(str::Dup(s), codepage);
    freeHtml = true;
    return root;
}