xref: /freebsd/contrib/expat/tests/chardata.c (revision 2be1a816b9ff69588e55be0a84cbe2a31efc0f2f)
1 /*  chardata.c
2  *
3  *
4  */
5 
6 #include <assert.h>
7 #include <check.h>
8 #include <stdio.h>
9 #include <string.h>
10 
11 #include "chardata.h"
12 
13 
14 static int
15 xmlstrlen(const XML_Char *s)
16 {
17     int len = 0;
18     assert(s != NULL);
19     while (s[len] != 0)
20         ++len;
21     return len;
22 }
23 
24 
25 void
26 CharData_Init(CharData *storage)
27 {
28     assert(storage != NULL);
29     storage->count = -1;
30 }
31 
32 void
33 CharData_AppendString(CharData *storage, const char *s)
34 {
35     int maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
36     int len;
37 
38     assert(s != NULL);
39     len = strlen(s);
40     if (storage->count < 0)
41         storage->count = 0;
42     if ((len + storage->count) > maxchars) {
43         len = (maxchars - storage->count);
44     }
45     if (len + storage->count < sizeof(storage->data)) {
46         memcpy(storage->data + storage->count, s, len);
47         storage->count += len;
48     }
49 }
50 
51 void
52 CharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len)
53 {
54     int maxchars;
55 
56     assert(storage != NULL);
57     assert(s != NULL);
58     maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
59     if (storage->count < 0)
60         storage->count = 0;
61     if (len < 0)
62         len = xmlstrlen(s);
63     if ((len + storage->count) > maxchars) {
64         len = (maxchars - storage->count);
65     }
66     if (len + storage->count < sizeof(storage->data)) {
67         memcpy(storage->data + storage->count, s,
68                len * sizeof(storage->data[0]));
69         storage->count += len;
70     }
71 }
72 
73 int
74 CharData_CheckString(CharData *storage, const char *expected)
75 {
76     char buffer[1280];
77     int len;
78     int count;
79 
80     assert(storage != NULL);
81     assert(expected != NULL);
82     count = (storage->count < 0) ? 0 : storage->count;
83     len = strlen(expected);
84     if (len != count) {
85         if (sizeof(XML_Char) == 1)
86             sprintf(buffer, "wrong number of data characters:"
87                     " got %d, expected %d:\n%s", count, len, storage->data);
88         else
89             sprintf(buffer,
90                     "wrong number of data characters: got %d, expected %d",
91                     count, len);
92         fail(buffer);
93         return 0;
94     }
95     if (memcmp(expected, storage->data, len) != 0) {
96         fail("got bad data bytes");
97         return 0;
98     }
99     return 1;
100 }
101 
102 int
103 CharData_CheckXMLChars(CharData *storage, const XML_Char *expected)
104 {
105     char buffer[1024];
106     int len = xmlstrlen(expected);
107     int count;
108 
109     assert(storage != NULL);
110     count = (storage->count < 0) ? 0 : storage->count;
111     if (len != count) {
112         sprintf(buffer, "wrong number of data characters: got %d, expected %d",
113                 count, len);
114         fail(buffer);
115         return 0;
116     }
117     if (memcmp(expected, storage->data, len * sizeof(storage->data[0])) != 0) {
118         fail("got bad data bytes");
119         return 0;
120     }
121     return 1;
122 }
123