10a48773fSEric van Gyzen /*
20a48773fSEric van Gyzen __ __ _
30a48773fSEric van Gyzen ___\ \/ /_ __ __ _| |_
40a48773fSEric van Gyzen / _ \\ /| '_ \ / _` | __|
50a48773fSEric van Gyzen | __// \| |_) | (_| | |_
60a48773fSEric van Gyzen \___/_/\_\ .__/ \__,_|\__|
70a48773fSEric van Gyzen |_| XML parser
8220ed979SColeman Kane
9cc68614dSXin LI Copyright (c) 2002-2004 Fred L. Drake, Jr. <fdrake@users.sourceforge.net>
10cc68614dSXin LI Copyright (c) 2003 Greg Stein <gstein@users.sourceforge.net>
11cc68614dSXin LI Copyright (c) 2016 Gilles Espinasse <g.esp@free.fr>
12*4543ef51SXin LI Copyright (c) 2016-2023 Sebastian Pipping <sebastian@pipping.org>
13cc68614dSXin LI Copyright (c) 2017 Joe Orton <jorton@redhat.com>
14cc68614dSXin LI Copyright (c) 2017 Rhodri James <rhodri@wildebeest.org.uk>
15*4543ef51SXin LI Copyright (c) 2022 Sean McBride <sean@rogue-research.com>
160a48773fSEric van Gyzen Licensed under the MIT license:
170a48773fSEric van Gyzen
180a48773fSEric van Gyzen Permission is hereby granted, free of charge, to any person obtaining
190a48773fSEric van Gyzen a copy of this software and associated documentation files (the
200a48773fSEric van Gyzen "Software"), to deal in the Software without restriction, including
210a48773fSEric van Gyzen without limitation the rights to use, copy, modify, merge, publish,
220a48773fSEric van Gyzen distribute, sublicense, and/or sell copies of the Software, and to permit
230a48773fSEric van Gyzen persons to whom the Software is furnished to do so, subject to the
240a48773fSEric van Gyzen following conditions:
250a48773fSEric van Gyzen
260a48773fSEric van Gyzen The above copyright notice and this permission notice shall be included
270a48773fSEric van Gyzen in all copies or substantial portions of the Software.
280a48773fSEric van Gyzen
290a48773fSEric van Gyzen THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
300a48773fSEric van Gyzen EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
310a48773fSEric van Gyzen MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
320a48773fSEric van Gyzen NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
330a48773fSEric van Gyzen DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
340a48773fSEric van Gyzen OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
350a48773fSEric van Gyzen USE OR OTHER DEALINGS IN THE SOFTWARE.
365bb6a25fSPoul-Henning Kamp */
375bb6a25fSPoul-Henning Kamp
38*4543ef51SXin LI #if defined(NDEBUG)
39*4543ef51SXin LI # undef NDEBUG /* because test suite relies on assert(...) at the moment */
40*4543ef51SXin LI #endif
41*4543ef51SXin LI
42*4543ef51SXin LI #include "expat_config.h"
43220ed979SColeman Kane #include "minicheck.h"
44220ed979SColeman Kane
45220ed979SColeman Kane #include <assert.h>
465bb6a25fSPoul-Henning Kamp #include <stdio.h>
475bb6a25fSPoul-Henning Kamp #include <string.h>
485bb6a25fSPoul-Henning Kamp
495bb6a25fSPoul-Henning Kamp #include "chardata.h"
505bb6a25fSPoul-Henning Kamp
515bb6a25fSPoul-Henning Kamp static int
xmlstrlen(const XML_Char * s)526b2c1e49SXin LI xmlstrlen(const XML_Char *s) {
535bb6a25fSPoul-Henning Kamp int len = 0;
545bb6a25fSPoul-Henning Kamp assert(s != NULL);
555bb6a25fSPoul-Henning Kamp while (s[len] != 0)
565bb6a25fSPoul-Henning Kamp ++len;
575bb6a25fSPoul-Henning Kamp return len;
585bb6a25fSPoul-Henning Kamp }
595bb6a25fSPoul-Henning Kamp
605bb6a25fSPoul-Henning Kamp void
CharData_Init(CharData * storage)616b2c1e49SXin LI CharData_Init(CharData *storage) {
625bb6a25fSPoul-Henning Kamp assert(storage != NULL);
635bb6a25fSPoul-Henning Kamp storage->count = -1;
645bb6a25fSPoul-Henning Kamp }
655bb6a25fSPoul-Henning Kamp
665bb6a25fSPoul-Henning Kamp void
CharData_AppendXMLChars(CharData * storage,const XML_Char * s,int len)676b2c1e49SXin LI CharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len) {
685bb6a25fSPoul-Henning Kamp int maxchars;
695bb6a25fSPoul-Henning Kamp
705bb6a25fSPoul-Henning Kamp assert(storage != NULL);
715bb6a25fSPoul-Henning Kamp assert(s != NULL);
725bb6a25fSPoul-Henning Kamp maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
735bb6a25fSPoul-Henning Kamp if (storage->count < 0)
745bb6a25fSPoul-Henning Kamp storage->count = 0;
755bb6a25fSPoul-Henning Kamp if (len < 0)
765bb6a25fSPoul-Henning Kamp len = xmlstrlen(s);
775bb6a25fSPoul-Henning Kamp if ((len + storage->count) > maxchars) {
785bb6a25fSPoul-Henning Kamp len = (maxchars - storage->count);
795bb6a25fSPoul-Henning Kamp }
80be8aff81SXin LI if (len + storage->count < (int)sizeof(storage->data)) {
816b2c1e49SXin LI memcpy(storage->data + storage->count, s, len * sizeof(storage->data[0]));
825bb6a25fSPoul-Henning Kamp storage->count += len;
835bb6a25fSPoul-Henning Kamp }
845bb6a25fSPoul-Henning Kamp }
855bb6a25fSPoul-Henning Kamp
865bb6a25fSPoul-Henning Kamp int
CharData_CheckXMLChars(CharData * storage,const XML_Char * expected)876b2c1e49SXin LI CharData_CheckXMLChars(CharData *storage, const XML_Char *expected) {
885bb6a25fSPoul-Henning Kamp int len = xmlstrlen(expected);
895bb6a25fSPoul-Henning Kamp int count;
905bb6a25fSPoul-Henning Kamp
915bb6a25fSPoul-Henning Kamp assert(storage != NULL);
925bb6a25fSPoul-Henning Kamp count = (storage->count < 0) ? 0 : storage->count;
935bb6a25fSPoul-Henning Kamp if (len != count) {
94*4543ef51SXin LI char buffer[1024];
95*4543ef51SXin LI snprintf(buffer, sizeof(buffer),
96*4543ef51SXin LI "wrong number of data characters: got %d, expected %d", count,
97*4543ef51SXin LI len);
985bb6a25fSPoul-Henning Kamp fail(buffer);
995bb6a25fSPoul-Henning Kamp return 0;
1005bb6a25fSPoul-Henning Kamp }
1015bb6a25fSPoul-Henning Kamp if (memcmp(expected, storage->data, len * sizeof(storage->data[0])) != 0) {
1025bb6a25fSPoul-Henning Kamp fail("got bad data bytes");
1035bb6a25fSPoul-Henning Kamp return 0;
1045bb6a25fSPoul-Henning Kamp }
1055bb6a25fSPoul-Henning Kamp return 1;
1065bb6a25fSPoul-Henning Kamp }
107