• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
xmlstrlen(const XML_Char * s)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
CharData_Init(CharData * storage)35 CharData_Init(CharData *storage)
36 {
37     assert(storage != NULL);
38     storage->count = -1;
39 }
40 
41 void
CharData_AppendString(CharData * storage,const char * s)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
CharData_AppendXMLChars(CharData * storage,const XML_Char * s,int len)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
CharData_CheckString(CharData * storage,const char * expected)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
CharData_CheckXMLChars(CharData * storage,const XML_Char * expected)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 }
132