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