xref: /freebsd/contrib/expat/tests/chardata.c (revision 4543ef516683042d46f3bd3bb8a4f3f746e00499)
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