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); }
const char* csTinyDocWrapper::Parse (const char* buf, bool collapse) { // Skip any UTF8 BOM if (HasUTF8Bom (buf)) buf += 3; const char* b = buf; while ((*b == ' ') || (*b == '\n') || (*b == '\t') || (*b == '\r')) b++; if (*b == '<') { return tinydoc->Parse (buf, collapse); } else { return "Data does not seem to be XML."; } }
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); }