|
1 /* Copyright (c) 1998-2003 Thai Open Source Software Center Ltd |
|
2 See the file COPYING for copying permission. |
|
3 |
|
4 chardata.c |
|
5 */ |
|
6 |
|
7 #ifdef HAVE_EXPAT_CONFIG_H |
|
8 #include <expat_config.h> |
|
9 #endif |
|
10 #ifdef HAVE_CHECK_H |
|
11 #include <check.h> |
|
12 #else |
|
13 #include "minicheck.h" |
|
14 #endif |
|
15 |
|
16 #include <assert.h> |
|
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 } |