10 #ifndef _CRT_SECURE_NO_DEPRECATE 11 #define _CRT_SECURE_NO_DEPRECATE 13 #undef _UNICODE // JLBC 16 #define WIN32_LEAN_AND_MEAN 37 inline int mmin(
const int t1,
const int t2) {
return t1 < t2 ? t1 : t2; }
55 {
nullptr, 0,
nullptr}};
72 {
_CXML(
"'"), 6,
_CXML(
'\'')}, {
nullptr, 0,
'\0'}};
78 #define INDENTCHAR _CXML('\t') 88 return _CXML(
"No error");
90 return _CXML(
"Warning: Unmatched end tag");
92 return _CXML(
"Warning: No XML tag found");
94 return _CXML(
"Error: No XML data");
96 return _CXML(
"Error: Missing start tag name");
98 return _CXML(
"Error: Missing end tag name");
100 return _CXML(
"Error: Unmatched end tag");
102 return _CXML(
"Error: Unmatched clear tag end");
104 return _CXML(
"Error: Unexpected token found");
106 return _CXML(
"Error: No elements found");
108 return _CXML(
"Error: File not found");
110 return _CXML(
"Error: First Tag not found");
112 return _CXML(
"Error: Unknown character entity");
115 "Error: Character code above 255 is forbidden in MultiByte " 119 "Error: unable to convert between WideChar and MultiByte " 122 return _CXML(
"Error: unable to open file for writing");
124 return _CXML(
"Error: cannot write into file");
128 "Warning: Base64-string length is not a multiple of 4");
130 return _CXML(
"Warning: Base64-string is truncated");
132 return _CXML(
"Error: Base64-string contains an illegal character");
134 return _CXML(
"Error: Base64 decode output buffer is too small");
136 return _CXML(
"Unknown");
151 #ifdef XML_NO_WIDE_CHAR 154 #if defined(UNDER_CE) || !defined(_XMLWINDOWS) 156 const void*
b,
int len)
161 if ((((
unsigned long)
b) %
sizeof(
wchar_t)) != 0)
return FALSE;
163 const wchar_t*
s = (
const wchar_t*)
b;
166 if (
len < (
int)
sizeof(wchar_t))
return FALSE;
175 if (*((
unsigned short*)
s) == 0xFFFE)
177 if (*((
unsigned short*)
s) == 0xFEFF)
182 for (i = 0; i <
len; i++)
183 if (
s[i] <= (
unsigned short)255) stats++;
184 if (stats >
len / 2)
return TRUE;
187 for (i = 0; i <
len; i++)
188 if (!
s[i])
return TRUE;
195 return (
char)IsTextUnicode((CONST LPVOID)
b, l,
nullptr);
208 i = (int)MultiByteToWideChar(CP_UTF8, 0,
s, -1,
nullptr, 0);
210 i = (int)MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
s, -1,
nullptr, 0);
211 if (i < 0)
return nullptr;
212 wchar_t* d = (
wchar_t*)malloc((i + 1) *
sizeof(
XMLCHAR));
214 i = (int)MultiByteToWideChar(CP_UTF8, 0,
s, -1, d, i);
216 i = (int)MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED,
s, -1, d, i);
222 return _wfopen(filename,
mode);
227 return _wcsnicmp(c1, c2, l);
231 return wcsncmp(c1, c2, l);
236 return (
XMLSTR)wcsstr(c1, c2);
240 return (
XMLSTR)wcscpy(c1, c2);
245 UINT codePage = CP_ACP;
247 int i = (int)WideCharToMultiByte(
257 if (i < 0)
return nullptr;
258 char* d = (
char*)malloc(i + 1);
280 return strnicmp(c1, c2, l);
292 return strncmp(c1, c2, l);
296 return (
XMLSTR)strstr(c1, c2);
305 #ifdef XML_NO_WIDE_CHAR 310 const wchar_t* ss =
s;
311 int i = (int)wcsrtombs(
nullptr, &ss, 0,
nullptr);
312 if (i < 0)
return nullptr;
313 char* d = (
char*)malloc(i + 1);
314 wcsrtombs(d, &
s, i,
nullptr);
323 int i = (int)mbsrtowcs(
nullptr, &ss, 0,
nullptr);
324 if (i < 0)
return nullptr;
325 wchar_t* d = (
wchar_t*)malloc((i + 1) *
sizeof(wchar_t));
326 mbsrtowcs(d, &
s, i,
nullptr);
336 return wsncasecmp(c1, c2, l);
340 return wsncmp(c1, c2, l);
347 return wcsncasecmp(c1, c2, l);
351 return wcsncmp(c1, c2, l);
355 return wcscasecmp(c1, c2);
360 return (
XMLSTR)wcsstr(c1, c2);
364 return (
XMLSTR)wcscpy(c1, c2);
371 f =
fopen(filenameAscii,
"rb");
373 f =
fopen(filenameAscii,
"wb");
385 return strncasecmp(c1, c2, l);
389 return strncmp(c1, c2, l);
393 return strcasecmp(c1, c2);
397 return (
XMLSTR)strstr(c1, c2);
405 #pragma clang diagnostic push 406 #pragma clang diagnostic ignored "-Wunused-function" 407 static inline int _strnicmp(
const char* c1,
const char* c2,
int l)
409 return strncasecmp(c1, c2, l);
411 #pragma clang diagnostic pop 427 if (
t && (*
t))
return (
char)_wtoi(
t);
432 if (
t && (*
t))
return _wtoi(
t);
437 if (
t && (*
t))
return _wtol(
t);
442 if (
t && (*
t)) wscanf(
t,
"%f", &
v);
451 if (
t)
return (
char)wstol(
t,
nullptr, 10);
456 if (
t)
return (
int)wstol(
t,
nullptr, 10);
461 if (
t)
return wstol(
t,
nullptr, 10);
468 if (
t)
return (
char)wcstol(
t,
nullptr, 10);
473 if (
t)
return (
int)wcstol(
t,
nullptr, 10);
478 if (
t)
return wcstol(
t,
nullptr, 10);
484 if (
t && (*
t)) wscanf(
t,
"%f", &
v);
491 if (
t && (*
t))
return (
char)atoi(
t);
496 if (
t && (*
t))
return atoi(
t);
501 if (
t && (*
t))
return atol(
t);
506 if (
t && (*
t))
return atof(
t);
517 if (
t && (*
t))
return *
t;
537 int l = (int)fread(bb, 1, 200, f);
552 char message[2000], *s1 = (
char *)
"", *s3 = (
char *)
"";
556 s1 = (
char*)
"First Tag should be '";
563 "XML Parsing error inside file '%S'.\n%S\nAt line %i, column " 566 "XML Parsing error inside file '%s'.\n%s\nAt line %i, column " 574 #if defined(_XMLWINDOWS) && !defined(UNDER_CE) && \ 575 !defined(_XMLPARSER_NO_MESSAGEBOX_) 577 nullptr, message,
"XML Parsing error",
578 MB_OK | MB_ICONERROR | MB_TOPMOST);
580 printf(
"%s", message);
606 0, 1, 1, 1, 1, 1, 1, 1,
607 1, 1, 1, 1, 1, 1, 1, 1,
608 1, 1, 1, 1, 1, 1, 1, 1,
609 1, 1, 1, 1, 1, 1, 1, 1,
610 1, 1, 1, 1, 1, 1, 1, 1,
611 1, 1, 1, 1, 1, 1, 1, 1,
612 1, 1, 1, 1, 1, 1, 1, 1,
613 1, 1, 1, 1, 1, 1, 1, 1,
614 1, 1, 1, 1, 1, 1, 1, 1,
615 1, 1, 1, 1, 1, 1, 1, 1,
616 1, 1, 1, 1, 1, 1, 1, 1,
617 1, 1, 1, 1, 1, 1, 1, 1,
618 1, 1, 1, 1, 1, 1, 1, 1,
619 1, 1, 1, 1, 1, 1, 1, 1,
620 1, 1, 1, 1, 1, 1, 1, 1,
621 1, 1, 1, 1, 1, 1, 1, 1,
622 1, 1, 1, 1, 1, 1, 1, 1,
623 1, 1, 1, 1, 1, 1, 1, 1,
624 1, 1, 1, 1, 1, 1, 1, 1,
625 1, 1, 1, 1, 1, 1, 1, 1,
626 1, 1, 1, 1, 1, 1, 1, 1,
627 1, 1, 1, 1, 1, 1, 1, 1,
628 1, 1, 1, 1, 1, 1, 1, 1,
629 1, 1, 1, 1, 1, 1, 1, 1,
630 1, 1, 2, 2, 2, 2, 2, 2,
631 2, 2, 2, 2, 2, 2, 2, 2,
632 2, 2, 2, 2, 2, 2, 2, 2,
633 2, 2, 2, 2, 2, 2, 2, 2,
634 3, 3, 3, 3, 3, 3, 3, 3,
635 3, 3, 3, 3, 3, 3, 3, 3,
636 4, 4, 4, 4, 4, 1, 1, 1,
637 1, 1, 1, 1, 1, 1, 1, 1
640 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
641 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
642 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
643 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
644 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
645 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
646 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
647 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
648 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
649 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
650 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
653 0, 1, 1, 1, 1, 1, 1, 1,
654 1, 1, 1, 1, 1, 1, 1, 1,
655 1, 1, 1, 1, 1, 1, 1, 1,
656 1, 1, 1, 1, 1, 1, 1, 1,
657 1, 1, 1, 1, 1, 1, 1, 1,
658 1, 1, 1, 1, 1, 1, 1, 1,
659 1, 1, 1, 1, 1, 1, 1, 1,
660 1, 1, 1, 1, 1, 1, 1, 1,
661 1, 1, 1, 1, 1, 1, 1, 1,
662 1, 1, 1, 1, 1, 1, 1, 1,
663 1, 1, 1, 1, 1, 1, 1, 1,
664 1, 1, 1, 1, 1, 1, 1, 1,
665 1, 1, 1, 1, 1, 1, 1, 1,
666 1, 1, 1, 1, 1, 1, 1, 1,
667 1, 1, 1, 1, 1, 1, 1, 1,
668 1, 1, 1, 1, 1, 1, 1, 1,
669 1, 2, 2, 2, 2, 2, 2, 2,
670 2, 2, 2, 2, 2, 2, 2, 2,
671 2, 2, 2, 2, 2, 2, 2, 2,
672 2, 2, 2, 2, 2, 2, 2, 2,
673 1, 1, 1, 1, 1, 1, 1, 1,
674 1, 1, 1, 1, 1, 1, 1, 1,
675 1, 1, 1, 1, 1, 1, 1, 1,
676 1, 1, 1, 1, 1, 1, 1, 1,
677 1, 1, 1, 1, 1, 1, 1, 1,
678 1, 1, 1, 1, 1, 1, 1, 1,
679 1, 1, 1, 1, 1, 1, 1, 1,
680 1, 1, 1, 1, 1, 1, 1, 1,
681 2, 2, 2, 2, 2, 2, 2, 2,
682 2, 2, 2, 2, 2, 2, 2, 2,
683 1, 1, 1, 1, 1, 1, 1, 1,
684 1, 1, 1, 1, 1, 1, 1, 1
688 0, 1, 1, 1, 1, 1, 1, 1,
689 1, 1, 1, 1, 1, 1, 1, 1,
690 1, 1, 1, 1, 1, 1, 1, 1,
691 1, 1, 1, 1, 1, 1, 1, 1,
692 1, 1, 1, 1, 1, 1, 1, 1,
693 1, 1, 1, 1, 1, 1, 1, 1,
694 1, 1, 1, 1, 1, 1, 1, 1,
695 1, 1, 1, 1, 1, 1, 1, 1,
696 1, 1, 1, 1, 1, 1, 1, 1,
697 1, 1, 1, 1, 1, 1, 1, 1,
698 1, 1, 1, 1, 1, 1, 1, 1,
699 1, 1, 1, 1, 1, 1, 1, 1,
700 1, 1, 1, 1, 1, 1, 1, 1,
701 1, 1, 1, 1, 1, 1, 1, 1,
702 1, 1, 1, 1, 1, 1, 1, 1,
703 1, 1, 1, 1, 1, 1, 1, 1,
704 1, 1, 1, 1, 1, 1, 1, 1,
705 1, 1, 1, 1, 1, 1, 1, 1,
706 1, 1, 1, 1, 1, 1, 1, 1,
707 1, 1, 1, 1, 1, 1, 1, 1,
708 1, 2, 2, 2, 2, 2, 2, 2,
709 2, 2, 2, 2, 2, 2, 2, 2,
710 2, 2, 2, 2, 2, 2, 2, 2,
711 2, 2, 2, 2, 2, 2, 2, 2,
712 2, 2, 2, 2, 2, 2, 2, 2,
713 2, 2, 2, 2, 2, 2, 2, 2,
714 2, 2, 2, 2, 2, 2, 2, 2,
715 2, 2, 2, 2, 2, 2, 2, 2,
716 2, 2, 2, 2, 2, 2, 2, 2,
717 2, 2, 2, 2, 2, 2, 2, 2,
718 2, 2, 2, 2, 2, 2, 2, 2,
719 1, 1, 1, 1, 1, 1, 1, 1
723 0, 1, 1, 1, 1, 1, 1, 1,
724 1, 1, 1, 1, 1, 1, 1, 1,
725 1, 1, 1, 1, 1, 1, 1, 1,
726 1, 1, 1, 1, 1, 1, 1, 1,
727 1, 1, 1, 1, 1, 1, 1, 1,
728 1, 1, 1, 1, 1, 1, 1, 1,
729 1, 1, 1, 1, 1, 1, 1, 1,
730 1, 1, 1, 1, 1, 1, 1, 1,
731 1, 1, 1, 1, 1, 1, 1, 1,
732 1, 1, 1, 1, 1, 1, 1, 1,
733 1, 1, 1, 1, 1, 1, 1, 1,
734 1, 1, 1, 1, 1, 1, 1, 1,
735 1, 1, 1, 1, 1, 1, 1, 1,
736 1, 1, 1, 1, 1, 1, 1, 1,
737 1, 1, 1, 1, 1, 1, 1, 1,
738 1, 1, 1, 1, 1, 1, 1, 1,
739 1, 2, 2, 2, 2, 2, 2, 2,
740 2, 2, 2, 2, 2, 2, 2, 2,
741 2, 2, 2, 2, 2, 2, 2, 2,
742 2, 2, 2, 2, 2, 2, 2, 2,
743 2, 2, 2, 2, 2, 2, 2, 2,
744 2, 2, 2, 2, 2, 2, 2, 2,
745 2, 2, 2, 2, 2, 2, 2, 2,
746 2, 2, 2, 2, 2, 2, 2, 2,
747 2, 2, 2, 2, 2, 2, 2, 2,
748 2, 2, 2, 2, 2, 2, 2, 2,
749 2, 2, 2, 2, 2, 2, 2, 2,
750 2, 2, 2, 2, 2, 2, 2, 2,
751 2, 2, 2, 2, 2, 2, 2, 2,
752 2, 2, 2, 2, 2, 2, 2, 2,
753 2, 2, 2, 2, 2, 2, 2, 2,
754 2, 2, 2, 2, 2, 2, 2, 1
800 using Attrib =
enum Attrib { eAttribName = 0, eAttribEquals, eAttribValue };
807 XMLCSTR filename,
const char* encoding,
char nFormat)
const 813 unsigned char h[2] = {0xFF, 0xFE};
819 L
"<?xml version=\"1.0\" encoding=\"utf-16\"?>\n",
820 sizeof(
wchar_t) * 40, 1, f))
830 unsigned char h[3] = {0xEF, 0xBB, 0xBF};
835 encoding =
"SHIFT-JIS";
837 if (!encoding) encoding =
"ISO-8859-1";
838 if (
fprintf(f,
"<?xml version=\"1.0\" encoding=\"%s\"?>\n", encoding) <
846 unsigned char h[3] = {0xEF, 0xBB, 0xBF};
862 if (lpszData ==
nullptr)
return nullptr;
865 if (cbData == -1) cbData = (int)
xstrlen(lpszData);
870 lpszNew[cbData] = (
XMLCHAR)NULL;
880 while ((ch = *
source) !=
'\0')
925 while ((ch = *
source) !=
'\0')
982 if (!
s)
return nullptr;
988 while ((lo > 0) && (*
s))
992 if ((lo > 2) && (
s[1] ==
_CXML(
'#')))
1001 while ((*
s) && (*
s !=
_CXML(
';')) && ((lo--) > 0))
s++;
1015 if ((lo >= entity->
l) &&
1023 }
while (entity->
s);
1050 if (*ss ==
_CXML(
'&'))
1052 if (ss[1] ==
_CXML(
'#'))
1056 if ((*ss ==
_CXML(
'X')) || (*ss ==
_CXML(
'x')))
1059 while (*ss !=
_CXML(
';'))
1061 if ((*ss >=
_CXML(
'0')) && (*ss <=
_CXML(
'9')))
1062 j = (j << 4) + *ss -
_CXML(
'0');
1063 else if ((*ss >=
_CXML(
'A')) && (*ss <=
_CXML(
'F')))
1064 j = (j << 4) + *ss -
_CXML(
'A') + 10;
1065 else if ((*ss >=
_CXML(
'a')) && (*ss <=
_CXML(
'f')))
1066 j = (j << 4) + *ss -
_CXML(
'a') + 10;
1078 while (*ss !=
_CXML(
';'))
1080 if ((*ss >=
_CXML(
'0')) && (*ss <=
_CXML(
'9')))
1081 j = (j * 10) + *ss -
_CXML(
'0');
1091 #ifndef _XMLWIDECHAR 1114 }
while (entity->
s);
1147 #define XML_isSPACECHAR(ch) \ 1148 ((ch == _CXML('\n')) || (ch == _CXML(' ')) || (ch == _CXML('\t')) || \ 1149 (ch == _CXML('\r'))) 1157 if (!cclose)
return 1;
1159 if (
xstrnicmp(cclose, copen, l) != 0)
return 1;
1172 if (ch != 0) pXML->
nIndex++;
1187 int indexStart, nFoundMatch, nIsText =
FALSE;
1188 result.
pClr =
nullptr;
1193 indexStart = pXML->
nIndex;
1228 nFoundMatch =
FALSE;
1238 if (ch ==
_CXML(
'<'))
break;
1242 if (nFoundMatch ==
FALSE)
1244 pXML->
nIndex = indexStart + 1;
1272 if (chTemp ==
_CXML(
'/'))
1280 else if (chTemp ==
_CXML(
'?'))
1302 if (chTemp ==
_CXML(
'>'))
1332 else if (ch ==
_CXML(
'/'))
1341 if (ch ==
_CXML(
'>'))
1356 *pcbToken = pXML->
nIndex - indexStart;
1363 result.
pStr =
nullptr;
1376 if (
d->lpszName && (lpszName !=
d->lpszName)) free((
void*)
d->lpszName);
1377 d->lpszName = lpszName;
1392 d->lpszName =
nullptr;
1400 d->pParent = pParent;
1401 d->pChild =
nullptr;
1403 d->pClear =
nullptr;
1404 d->pAttribute =
nullptr;
1405 d->pOrder =
nullptr;
1419 #define MEMORYINCREASE 50 1425 static inline void*
myRealloc(
void*
p,
int newsize,
int memInc,
int sizeofElem)
1429 if (memInc)
return malloc(memInc * sizeofElem);
1430 return malloc(sizeofElem);
1432 if ((memInc == 0) || ((newsize % memInc) == 0))
1433 p = realloc(
p, (newsize + memInc) * sizeofElem);
1446 if (
index < 0)
return -1;
1447 int i = 0, j = (int)((
index << 2) + xxtype), *o =
d->pOrder;
1448 while (o[i] != j) i++;
1456 int n =
d->nChild +
d->nText +
d->nClear, *o =
d->pOrder,
1458 memmove(o + i, o + i + 1, (
n - i) *
sizeof(
int));
1460 if ((o[i] & 3) == (
int)
t) o[i] -= 4;
1469 int memoryIncrease,
int* _pos,
int nc,
void*
p,
int size,
1475 int n =
d->nChild +
d->nText +
d->nClear;
1477 (
int*)
myRealloc(
d->pOrder,
n + 1, memoryIncrease * 3,
sizeof(
int));
1478 int pos = *_pos, *o =
d->pOrder;
1480 if ((pos < 0) || (pos >=
n))
1483 o[
n] = (int)((nc << 2) + xtype);
1488 memmove(o + i + 1, o + i, (
n - i) *
sizeof(
int));
1490 while ((pos <
n) && ((o[pos] & 3) != (
int)xtype)) pos++;
1494 o[
n] = (int)((nc << 2) + xtype);
1499 for (i = pos + 1; i <=
n; i++)
1500 if ((o[i] & 3) == (int)xtype) o[i] += 4;
1502 *_pos = pos = o[pos] >> 2;
1504 ((
char*)
p) + (pos + 1) *
size, ((
char*)
p) + pos *
size,
1512 int memoryIncrease,
XMLSTR lpszName,
char isDeclaration,
int pos)
1516 memoryIncrease, &pos,
d->nChild,
d->pChild,
sizeof(
XMLNode),
1518 d->pChild[pos].d =
nullptr;
1521 return d->pChild[pos];
1526 int memoryIncrease,
XMLSTR lpszName,
XMLSTR lpszValuev)
1535 int nc =
d->nAttribute;
1537 d->pAttribute, (nc + 1), memoryIncrease,
sizeof(
XMLAttribute));
1548 if (!lpszValue)
return nullptr;
1556 d->pText[pos] = lpszValue;
1573 memoryIncrease, &pos,
d->nClear,
d->pClear,
sizeof(
XMLClear),
1603 if (*pCh ==
_CXML(
'<'))
1606 lpszTemp =
xstrstr(lpXML, docTypeEnd);
1609 else if (*pCh ==
_CXML(
'>'))
1627 cbTemp = (int)(lpszTemp - lpXML);
1646 d->pOrder = (
int*)realloc(
1647 d->pOrder, (
d->nChild +
d->nText +
d->nClear) *
sizeof(int));
1663 if (!lpszText)
return 0;
1667 int cbText = (int)(tokenPStr - lpszText);
1692 int n =
d->nChild +
d->nText +
d->nClear - 1, *o =
d->pOrder;
1702 d->pText[i] = (
XMLSTR)realloc(
1703 (
void*)
d->pText[i], (
n + n2) *
sizeof(
XMLCHAR));
1704 if (!
d->pText[i])
return 1;
1727 enum Attrib attrib = eAttribName;
1796 #ifdef APPROXIMATE_PARSING 1923 lpszTemp = token.
pStr;
1940 #ifdef STRICT_PARSING 1992 lpszTemp = token.
pStr;
1994 attrib = eAttribEquals;
2042 lpszTemp = token.
pStr;
2056 if (
d->isDeclaration &&
2057 (lpszTemp[cbTemp - 1]) ==
_CXML(
'?'))
2060 if (
d->pParent &&
d->pParent->pParent)
2092 attrib = eAttribValue;
2123 if (
d->isDeclaration &&
2124 (token.
pStr[cbToken - 1]) ==
_CXML(
'?'))
2141 attrVal, cbToken, pXML);
2142 if (!attrVal)
return FALSE;
2152 attrib = eAttribName;
2175 if ((!
d->isDeclaration) && (
d->pParent))
2177 #ifdef STRICT_PARSING 2198 nullptr, 0,
nullptr, 0,
TRUE};
2200 pResults->
nLine = 1;
2202 while (xml.
nIndex < nUpto)
2205 if (ch !=
_CXML(
'\n'))
2223 pResults->
nLine = 0;
2231 nullptr, 0,
nullptr, 0,
TRUE};
2253 pResults->
nLine = 0;
2287 pResults->
nLine = 0;
2297 int l = ftell(f), headerSz = 0;
2305 unsigned char* buf = (
unsigned char*)malloc(l + 4);
2306 int really_read = (int)fread(buf, 1, l, f);
2307 if (really_read != l) buf[0] =
'\0';
2319 if ((buf[0] == 0xef) && (buf[1] == 0xbb) && (buf[2] == 0xbf))
2325 myMultiByteToWideChar((
const char*)(buf + headerSz), ce);
2327 buf = (
unsigned char*)
b2;
2332 if ((buf[0] == 0xef) && (buf[1] == 0xff)) headerSz = 2;
2333 if ((buf[0] == 0xff) && (buf[1] == 0xfe)) headerSz = 2;
2341 if ((buf[0] == 0xef) && (buf[1] == 0xff)) headerSz = 2;
2342 if ((buf[0] == 0xff) && (buf[1] == 0xfe)) headerSz = 2;
2345 buf = (
unsigned char*)
b2;
2350 if ((buf[0] == 0xef) && (buf[1] == 0xbb) && (buf[2] == 0xbf))
2368 while (l--) *(dest++) =
c;
2380 int cb = nFormat < 0 ? 0 : nFormat;
2382 int nChildFormat = -1;
2383 int nElementI = pEntry->nChild + pEntry->nText + pEntry->nClear;
2385 if ((nFormat >= 0) && (nElementI == 1) && (pEntry->nText == 1) &&
2386 (!pEntry->isDeclaration))
2391 #define LENSTR(lpsz) (lpsz ? xstrlen(lpsz) : 0) 2394 cbElement = (int)
LENSTR(pEntry->lpszName);
2403 lpszMarker[nResult++] =
_CXML(
'<');
2404 if (pEntry->isDeclaration) lpszMarker[nResult++] =
_CXML(
'?');
2405 xstrcpy(&lpszMarker[nResult], pEntry->lpszName);
2406 nResult += cbElement;
2407 lpszMarker[nResult++] =
_CXML(
' ');
2411 nResult += cbElement + 2 + cb;
2412 if (pEntry->isDeclaration) nResult++;
2417 for (i = 0; i < pEntry->nAttribute; i++)
2432 lpszMarker[nResult] =
_CXML(
'=');
2433 lpszMarker[nResult + 1] =
_CXML(
'"');
2436 &lpszMarker[nResult + 2], pAttr->
lpszValue);
2437 lpszMarker[nResult + cb + 2] =
_CXML(
'"');
2441 if (lpszMarker) lpszMarker[nResult] =
_CXML(
' ');
2447 if (pEntry->isDeclaration)
2451 lpszMarker[nResult - 1] =
_CXML(
'?');
2452 lpszMarker[nResult] =
_CXML(
'>');
2457 if (lpszMarker) lpszMarker[nResult] =
_CXML(
'\n');
2465 if (lpszMarker) lpszMarker[nResult - 1] =
_CXML(
'>');
2468 if (lpszMarker) lpszMarker[nResult] =
_CXML(
'\n');
2480 if (cbElement && (!pEntry->isDeclaration))
2481 nChildFormat = nFormat + 1;
2483 nChildFormat = nFormat;
2487 for (i = 0; i < nElementI; i++)
2489 j = pEntry->pOrder[i];
2496 XMLCSTR pChild = pEntry->pText[j >> 2];
2505 &lpszMarker[nResult],
INDENTCHAR, nFormat + 1);
2507 &lpszMarker[nResult + nFormat + 1], pChild);
2508 lpszMarker[nResult + nFormat + 1 + cb] =
2511 nResult += cb + nFormat + 2;
2517 &lpszMarker[nResult], pChild);
2527 XMLClear* pChild = pEntry->pClear + (j >> 2);
2537 &lpszMarker[nResult],
INDENTCHAR, nFormat + 1);
2539 &lpszMarker[nResult + nFormat + 1],
2542 nResult += cb + nFormat + 1;
2572 if (lpszMarker) lpszMarker[nResult] =
_CXML(
'\n');
2583 pEntry->pChild[j >> 2].d,
2584 lpszMarker ? lpszMarker + nResult : 0, nChildFormat);
2592 if ((cbElement) && (!pEntry->isDeclaration))
2607 lpszMarker[nResult] =
_CXML(
'<');
2608 lpszMarker[nResult + 1] =
_CXML(
'/');
2610 xstrcpy(&lpszMarker[nResult], pEntry->lpszName);
2611 nResult += cbElement;
2613 lpszMarker[nResult] =
_CXML(
'>');
2618 lpszMarker[nResult + 1] =
_CXML(
'\n');
2625 nResult += cbElement + 4 + nFormat;
2626 else if (nFormat == -1)
2627 nResult += cbElement + 3;
2629 nResult += cbElement + 4;
2639 lpszMarker[nResult] =
_CXML(
'/');
2640 lpszMarker[nResult + 1] =
_CXML(
'>');
2641 if (nFormat != -1) lpszMarker[nResult + 2] =
_CXML(
'\n');
2643 nResult += nFormat == -1 ? 2 : 3;
2665 if (pnSize) *pnSize = 0;
2669 XMLSTR lpszResult =
nullptr;
2674 nFormat = nFormat ? 0 : -1;
2680 lpszResult[cbStr] =
_CXML(
'\0');
2681 if (pnSize) *pnSize = cbStr;
2689 while (((
void*)(pa[i].
d)) != ((
void*)
d)) i++;
2690 d->pParent->nChild--;
2691 if (
d->pParent->nChild)
2692 memmove(pa + i, pa + i + 1, (
d->pParent->nChild - i) *
sizeof(
XMLNode));
2696 d->pParent->pChild =
nullptr;
2713 d->pParent =
nullptr;
2721 if ((dd->ref_count == 0) || force)
2726 for (i = 0; i < dd->nChild; i++)
2728 pc = dd->pChild + i;
2729 pc->
d->pParent =
nullptr;
2734 for (i = 0; i < dd->nText; i++) free((
void*)dd->pText[i]);
2736 for (i = 0; i < dd->nClear; i++) free((
void*)dd->pClear[i].lpszValue);
2738 for (i = 0; i < dd->nAttribute; i++)
2740 free((
void*)dd->pAttribute[i].lpszName);
2741 if (dd->pAttribute[i].lpszValue)
2742 free((
void*)dd->pAttribute[i].lpszValue);
2746 myFree((
void*)dd->lpszName);
2751 dd->pChild =
nullptr;
2752 dd->pText =
nullptr;
2753 dd->pClear =
nullptr;
2754 dd->pAttribute =
nullptr;
2755 dd->pOrder =
nullptr;
2756 dd->lpszName =
nullptr;
2757 dd->pParent =
nullptr;
2759 if (dd->ref_count == 0)
2777 if (
d) (
d->ref_count)++;
2786 if (
d) (
d->ref_count)++;
2794 int n =
d->nAttribute;
2801 p->pAttribute[
n].lpszName =
stringDup(
d->pAttribute[
n].lpszName);
2802 p->pAttribute[
n].lpszValue =
stringDup(
d->pAttribute[
n].lpszValue);
2807 n = (
d->nChild +
d->nText +
d->nClear) *
sizeof(
int);
2808 p->pOrder = (
int*)malloc(
n);
2825 p->pClear[
n].lpszCloseTag =
d->pClear[
n].lpszCloseTag;
2826 p->pClear[
n].lpszOpenTag =
d->pClear[
n].lpszOpenTag;
2837 p->pChild[
n].d =
nullptr;
2838 p->pChild[
n] =
d->pChild[
n].deepCopy();
2839 p->pChild[
n].d->pParent =
p;
2848 if ((!dc) || (!
d))
return childNode;
2871 d->pChild[pos].d = dc;
2878 if ((!
d) || (i < 0) || (i >=
d->nAttribute))
return;
2881 free((
void*)
p->lpszName);
2882 if (
p->lpszValue) free((
void*)
p->lpszValue);
2888 d->pAttribute =
nullptr;
2908 if (lpszNewValue) free(lpszNewValue);
2909 if (lpszNewName) free(lpszNewName);
2912 if (i >=
d->nAttribute)
2918 if (
p->lpszValue &&
p->lpszValue != lpszNewValue) free((
void*)
p->lpszValue);
2919 p->lpszValue = lpszNewValue;
2920 if (lpszNewName &&
p->lpszName != lpszNewName)
2922 free((
void*)
p->lpszName);
2923 p->lpszName = lpszNewName;
2958 int i, l =
d->nText;
2965 for (i = 0; i < l; i++)
2966 if (lpszValue ==
p[i])
return i;
2972 if ((!
d) || (i < 0) || (i >=
d->nText))
return;
2977 memmove(
p,
p + 1, (
d->nText - i) *
sizeof(
XMLCSTR));
2995 if (lpszNewValue) free(lpszNewValue);
3000 if (*
p != lpszNewValue)
3005 return lpszNewValue;
3012 if (lpszNewValue) free(lpszNewValue);
3022 if ((!
d) || (i < 0) || (i >=
d->nClear))
return;
3025 free((
void*)
p->lpszValue);
3027 memmove(
p,
p + 1, (
d->nClear - i) *
sizeof(
XMLClear));
3031 d->pClear =
nullptr;
3039 int i, l =
d->nClear;
3046 for (i = 0; i < l; i++)
3047 if (lpszValue ==
p[i].lpszValue)
return i;
3064 if (lpszNewContent) free(lpszNewContent);
3069 if (lpszNewContent !=
p->lpszValue)
3071 free((
void*)
p->lpszValue);
3072 p->lpszValue = lpszNewContent;
3081 if (lpszNewContent) free(lpszNewContent);
3100 int i, j = 0,
n =
d->nChild;
3102 for (i = 0; i <
n; i++)
3113 int i = 0,
n =
d->nChild;
3149 if (path) free(path);
3156 if ((!path) || (!(*path)))
return *
this;
3161 tend1 =
xstrstr(path, sepString);
3168 if (createIfMissing)
3175 tend1 =
xstrstr(path, sepString);
3184 if (i >=
d->nText) i =
d->nText - 1;
3189 if (i >=
d->nClear) i =
d->nClear - 1;
3194 if (i >=
d->nChild) i =
d->nChild - 1;
3212 if ((!
d) || (!
x.d))
return -1;
3227 if (j < 0)
return -1;
3249 t =
x.getAttribute(attributeName, &j);
3259 if (
x.isAttributeSet(attributeName))
3266 }
while (!
x.isEmpty());
3273 if (!
d)
return nullptr;
3274 int i = 0,
n =
d->nAttribute;
3292 int i,
n =
d->nAttribute;
3294 for (i = 0; i <
n; i++)
3307 if (!
d)
return nullptr;
3324 c.attrib =
d->pAttribute[i];
3329 i = (
d->pOrder[i]) >> 2;
3333 c.child =
d->pChild[i];
3336 c.text =
d->pText[i];
3339 c.clear =
d->pClear[i];
3349 if (!
d)
return nullptr;
3365 return d->nAttribute;
3375 return d->nAttribute +
d->nChild +
d->nText +
d->nClear;
3380 return d->pClear[i];
3385 return d->pAttribute[i];
3389 if ((!
d) || (i >=
d->nAttribute))
return nullptr;
3390 return d->pAttribute[i].lpszName;
3394 if ((!
d) || (i >=
d->nAttribute))
return nullptr;
3395 return d->pAttribute[i].lpszValue;
3399 if ((!
d) || (i >=
d->nText))
return nullptr;
3405 return d->pChild[i];
3415 return d->isDeclaration;
3455 return addClear_priv(0, lpszValue, lpszOpen, lpszClose, pos);
3503 char _dropWhiteSpace,
char _removeCommentsInMiddleOfText)
3511 switch (_characterEncoding)
3542 void* buf,
int l,
char useXMLEncodingAttribute)
3550 unsigned char*
b = (
unsigned char*)buf;
3551 if ((
b[0] == 0xef) && (
b[1] == 0xbb) && (
b[2] == 0xbf))
3561 if ((i < l) && (
b[i] & 0xC0) != 0x80)
3569 if ((i < l) && (
b[i] & 0xC0) != 0x80)
3577 if ((i < l) && (
b[i] & 0xC0) != 0x80)
3590 if (!useXMLEncodingAttribute)
return bestGuess;
3597 b = (
unsigned char*)strstr(bb,
"encoding");
3598 if (!
b)
return bestGuess;
3602 if (*
b !=
'=')
return bestGuess;
3606 if ((*
b !=
'\'') && (*
b !=
'"'))
return bestGuess;
3611 if ((
xstrnicmp((
char*)
b,
"utf-8", 5) == 0) ||
3618 if ((
xstrnicmp((
char*)
b,
"shiftjis", 8) == 0) ||
3619 (
xstrnicmp((
char*)
b,
"shift-jis", 9) == 0) ||
3630 #undef XML_isSPACECHAR 3641 _CXML(
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/");
3647 99, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, 98, 98, 97, 98, 98,
3648 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
3649 98, 98, 97, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 62, 98, 98,
3650 98, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 98, 98,
3651 98, 96, 98, 98, 98, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
3652 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
3653 25, 98, 98, 98, 98, 98, 98, 26, 27, 28, 29, 30, 31, 32, 33, 34,
3654 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
3655 49, 50, 51, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
3656 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
3657 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
3658 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
3659 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
3660 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
3661 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
3662 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98,
3663 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, 98
3676 unsigned int i = ((inlen - 1) / 3 * 4 + 4 + 1);
3677 if (formatted) i += inlen / 54;
3682 unsigned char* inbuf,
unsigned int inlen,
char formatted)
3684 int i =
encodeLength(inlen, formatted), k = 17, eLen = inlen / 3, j;
3687 for (i = 0; i < eLen; i++)
3691 j = (inbuf[0] << 16) | (inbuf[1] << 8) | inbuf[2];
3702 *(curr++) =
_CXML(
'\n');
3708 eLen = inlen - eLen * 3;
3718 j = (inbuf[0] << 8) | inbuf[1];
3754 if (
size == 0)
return 0;
3761 return (
unsigned int)((
size * 3) / 4);
3773 #define BASE64DECODE_READ_NEXT_CHAR(c) \ 3776 if (data[i] > 255) \ 3781 c = base64DecodeTable[(unsigned char)data[i++]]; \ 3782 } while (c == 97); \ 3785 if (xe) *xe = eXMLErrorBase64DecodeIllegalCharacter; \ 3789 #define BASE64DECODE_READ_NEXT_CHAR(c) \ 3792 c = base64DecodeTable[(unsigned char)data[i++]]; \ 3793 } while (c == 97); \ 3796 if (xe) *xe = eXMLErrorBase64DecodeIllegalCharacter; \ 3808 if (
p == (
int)
len)
return 2;
3814 if ((d == 99) || (d == 96))
3824 buf[
p++] = (
unsigned char)((
c << 2) | ((d >> 4) & 0x3));
3834 if (
c == 96)
return 2;
3843 buf[
p++] = (
unsigned char)(((d << 4) & 0xf0) | ((
c >> 2) & 0xf));
3853 if (d == 96)
return 2;
3862 buf[
p++] = (
unsigned char)(((
c << 6) & 0xc0) | d);
3865 #undef BASE64DECODE_READ_NEXT_CHAR 3869 if ((!
buf) && (newsize))
3871 buf = malloc(newsize);
3877 buf = realloc(
buf, newsize);
3887 if (outlen) *outlen =
len;
3888 if (!
len)
return nullptr;
3894 return (
unsigned char*)
buf;
static XMLCSTR getVersion()
Return the XMLParser library version number.
XMLNode getChildNodeWithAttribute(XMLCSTR tagName, XMLCSTR attributeName, XMLCSTR attributeValue=nullptr, int *i=nullptr) const
next child node with specific name (return an empty node if failing)
int nAttribute() const
next attribute content with specific name (return a nullptr if failing)
char isAttributeSet(XMLCSTR name) const
test if an attribute with a specific name is given
static const char XML_gbk_big5_ByteTable[256]
GLuint GLuint GLsizei count
XMLCSTR updateName_WOSD(XMLSTR lpszName)
change node's name
XMLNode getParentNode() const
return the parent node
XMLElementType
Enumeration used to manage type of data.
XMLCSTR base64EncodeTable
XMLCHAR xmltoc(XMLCSTR t, XMLCHAR v)
static ALLXMLClearTag XMLClearTags[]
enum Attrib { eAttribName=0, eAttribEquals, eAttribValue } Attrib
char maybeAddTxT(void *pa, XMLCSTR tokenPStr)
void deleteAttribute(int i=0)
Delete the ith attribute of the current XMLNode.
Main Class representing a XML node.
static void myFree(void *p)
static XMLSTR xstrstr(XMLCSTR c1, XMLCSTR c2)
XMLClear * updateClear(XMLCSTR lpszNewContent, int i=0)
text to update is missing, a new one will be added
XMLError writeToFile(XMLCSTR filename, const char *encoding=nullptr, char nFormat=1) const
Save the content of an xmlNode inside a file.
int void fclose(FILE *f)
An OS-independent version of fclose.
XMLClear * addClear(XMLCSTR lpszValue, XMLCSTR lpszOpen=nullptr, XMLCSTR lpszClose=nullptr, XMLElementPosition pos=-1)
Add a new clear tag.
XMLCharEncoding
childNode with the specified name if (name==nullptr) return the position of the ith childNode ...
int _strnicmp(const char *str, const char *subStr, size_t count) noexcept
An OS-independent version of strnicmp.
static XMLNode parseString(XMLCSTR lpXMLString, XMLCSTR tag=nullptr, XMLResults *pResults=nullptr)
Parse an XML string and return the root of a XMLNode tree representing the string.
XMLNode getChildNodeByPath(XMLSTR path, char createNodeIfMissing=0, XMLCHAR sep='/')
name/attribute (return an empty node if failing)
XMLCSTR updateText(XMLCSTR lpszNewValue, int i=0)
change the name of the attribute if the attribute to update is missing, a new one will be added ...
Structure for XML clear (unformatted) node (usually comments)
void * addToOrder(int memInc, int *_pos, int nc, void *p, int size, XMLElementType xtype)
char isEmpty() const
is this node Empty?
This structure is given by the function XMLNode::enumContents.
static int xstrnicmp(XMLCSTR c1, XMLCSTR c2, int l)
XMLSTR stringDup(XMLCSTR lpszData, int cbData)
Duplicate (copy in a new allocated buffer) the source string.
static XMLNode createXMLTopNode(XMLCSTR lpszName, char isDeclaration=FALSE)
Create the top node of an XMLNode structure.
int nClear() const
nbr of clear field
XMLClear * addClear_WOSD(XMLSTR lpszValue, XMLCSTR lpszOpen=nullptr, XMLCSTR lpszClose=nullptr, XMLElementPosition pos=-1)
Add a new clear Tag.
XMLNode addChild_priv(int, XMLSTR, char, int)
static void * myRealloc(void *p, int newsize, int memInc, int sizeofElem)
XMLAttribute * addAttribute_priv(int, XMLSTR, XMLSTR)
static int removeOrderElement(XMLNodeData *d, XMLElementType t, int index)
XMLElementPosition positionOfChildNode(int i=0) const
static const char XML_gb2312ByteTable[256]
static int xstrncmp(XMLCSTR c1, XMLCSTR c2, int l)
static XMLClear emptyXMLClear
void deleteText(int i=0)
with the name "anAttribute->lpszName" (the "strcmp" function is used to find the right attribute) ...
#define BASE64DECODE_READ_NEXT_CHAR(c)
XMLNode & operator=(const XMLNode &A)
to allow shallow/fast copy:
int ParseXMLElement(void *pXML)
static XMLCSTR getError(XMLError error)
this gives you a
int mmin(const int t1, const int t2)
int nChildNode() const
nbr of child node
XMLCSTR getText(int i=0) const
return ith text field
struct XMLAttribute XMLAttribute
Structure for XML attribute.
int nText() const
nbr of text field
static XMLNode createXMLTopNode_WOSD(XMLSTR lpszName, char isDeclaration=FALSE)
Create the top node of an XMLNode structure.
XMLCSTR addText_WOSD(XMLSTR lpszValue, XMLElementPosition pos=-1)
Add a new text content.
XMLAttribute getAttribute(int i=0) const
return ith attribute
static NextToken GetNextToken(XML *pXML, int *pcbToken, enum XMLTokenTypeTag *pType)
XMLCSTR addText_priv(int, XMLSTR, int)
int nElement() const
clear) of the current XMLNode.
static XMLCHAR getNextChar(XML *pXML)
XMLNode addChild_WOSD(XMLSTR lpszName, char isDeclaration=FALSE, XMLElementPosition pos=-1)
Add a new child node.
void emptyTheNode(char force)
XMLError
Enumeration for XML parse errors.
XMLCSTR xmltoa(XMLCSTR t, XMLCSTR v)
void deleteNodeContent()
The "deleteNodeContent" function forces the deletion of the content of this XMLNode and the subtree...
static int detachFromParent(XMLNodeData *d)
int indexClear(XMLCSTR lpszValue) const
static XMLNode::XMLCharEncoding characterEncoding
static char setGlobalOptions(XMLCharEncoding characterEncoding=XMLNode::char_encoding_UTF8, char guessWideCharChars=1, char dropWhiteSpace=1, char removeCommentsInMiddleOfText=1)
Sets the global options for the conversions.
XMLAttribute * updateAttribute_WOSD(XMLAttribute *newAttribute, XMLAttribute *oldAttribute)
if the attribute to update is
XMLCSTR updateName(XMLCSTR lpszName)
change node's name
XMLNodeContents enumContents(XMLElementPosition i) const
enumerate all the different contents (attribute,child,text,
static XMLNode emptyNode()
return XMLNode::emptyXMLNode;
#define XML_isSPACECHAR(ch)
XMLElementPosition positionOfText(int i=0) const
XMLElementPosition positionOfClear(int i=0) const
enum Status { eInsideTag=0, eOutsideTag } Status
static void charmemset(XMLSTR dest, XMLCHAR c, int l)
static char dropWhiteSpace
static void CountLinesAndColumns(XMLCSTR lpXML, int nUpto, XMLResults *pResults)
static XMLElementPosition findPosition(XMLNodeData *d, int index, XMLElementType xtype)
static int xstricmp(XMLCSTR c1, XMLCSTR c2)
struct XMLNode::XMLNodeDataTag XMLNodeData
static XMLAttribute emptyXMLAttribute
static XMLSTR xstrcpy(XMLSTR c1, XMLCSTR c2)
static const char XML_sjisByteTable[256]
static XMLCharacterEntity XMLEntities[]
static void exactMemory(XMLNodeData *d)
static FILE * xfopen(XMLCSTR filename, XMLCSTR mode)
int fprintf(FILE *fil, const char *format,...) noexcept MRPT_printf_format_check(2
An OS-independent version of fprintf.
static XMLCharEncoding guessCharEncoding(void *buffer, int bufLen, char useXMLEncodingAttribute=1)
Guess the character encoding of the string (ascii, utf8 or shift-JIS)
static XMLNode parseFile(XMLCSTR filename, XMLCSTR tag=nullptr, XMLResults *pResults=nullptr)
Parse an XML file and return the root of a XMLNode tree representing the file.
XMLAttribute * updateAttribute(XMLAttribute *newAttribute, XMLAttribute *oldAttribute)
if the attribute to update is
XMLCSTR addText(XMLCSTR lpszValue, XMLElementPosition pos=-1)
Add a new text content.
int indexText(XMLCSTR lpszValue) const
XMLSTR createXMLString(int nFormat=1, int *pnSize=nullptr) const
user-friendly explanation of the parsing error
XMLAttribute * addAttribute_WOSD(XMLSTR lpszName, XMLSTR lpszValue)
Add a new attribute.
XMLCSTR updateText_WOSD(XMLSTR lpszNewValue, int i=0)
change the name of the attribute if the attribute to update is missing, a new one will be added ...
int XMLElementPosition
XMLElementPosition are not interchangeable with simple indexes.
GLdouble GLdouble GLdouble r
char parseClearTag(void *px, void *pa)
static const char * XML_ByteTable
static const char base64Fillchar
static const char XML_utf8ByteTable[256]
XMLClear * updateClear_WOSD(XMLSTR lpszNewContent, int i=0)
is missing, a new one will be added
char myTagCompare(XMLCSTR cclose, XMLCSTR copen)
char xmltob(XMLCSTR t, char v)
GLuint const GLchar * name
GLsizei GLsizei GLchar * source
Structure for XML attribute.
const unsigned char base64DecodeTable[]
static char guessWideCharChars
char myIsTextWideChar(const void *b, int l)
FILE * fopen(const char *fileName, const char *mode) noexcept
An OS-independent version of fopen.
XMLNode addChild(XMLCSTR lpszName, char isDeclaration=FALSE, XMLElementPosition pos=-1)
Add a new child node.
static int CreateXMLStringR(XMLNodeData *pEntry, XMLSTR lpszMarker, int nFormat)
long xmltol(XMLCSTR t, long v)
enum XMLTokenTypeTag XMLTokenType
XMLClear getClear(int i=0) const
return ith clear field (comments)
static char removeCommentsInMiddleOfText
char * strcpy(char *dest, size_t destSize, const char *source) noexcept
An OS-independent version of strcpy.
XMLCSTR getAttributeValue(int i=0) const
return ith attribute value
static XMLNode emptyXMLNode
char isDeclaration() const
is this node a declaration <? .... ?>
char * myWideCharToMultiByte(const wchar_t *s)
GLsizei GLsizei GLenum GLenum const GLvoid * data
GLubyte GLubyte GLubyte a
XMLCSTR getAttributeName(int i=0) const
return ith attribute name
void freeXMLString(XMLSTR t)
to free the string allocated inside the "stringDup" function or the "createXMLString" function...
void deleteClear(int i=0)
"lpszValue" inside the current XMLNode (direct "pointer-to-pointer" comparison is used to find the ri...
int nChildNode(XMLCSTR name) const
return the number of child node with specific name
XMLNode deepCopy() const
deep copy (duplicate/clone) a XMLNode
Structure used to obtain error details if the parse fails.
double xmltof(XMLCSTR t, double v)
int sprintf(char *buf, size_t bufSize, const char *format,...) noexcept MRPT_printf_format_check(3
An OS-independent version of sprintf (Notice the bufSize param, which may be ignored in some compiler...
static int xstrlen(XMLCSTR c)
int xmltoi(XMLCSTR t, int v)
XMLSTR fromXMLString(XMLCSTR s, int lo, XML *pXML)
XMLCSTR getName() const
name of the node
void memcpy(void *dest, size_t destSize, const void *src, size_t copyCount) noexcept
An OS and compiler independent version of "memcpy".
XMLNode getChildNode(int i=0) const
return ith child node
XMLAttribute * addAttribute(XMLCSTR lpszName, XMLCSTR lpszValuev)
it will be detached from it's parents before being attached to the current XMLNode ...
static const char XML_legacyByteTable[256]
XMLClear * addClear_priv(int, XMLSTR, XMLCSTR, XMLCSTR, int)
static XMLNode openFileHelper(XMLCSTR filename, XMLCSTR tag=nullptr)
Parse an XML file and return the root of a XMLNode tree representing the file.