chardata.c revision 247296
1223013Sdim/* Copyright (c) 1998-2003 Thai Open Source Software Center Ltd
2223013Sdim   See the file COPYING for copying permission.
3223013Sdim
4223013Sdim   chardata.c
5223013Sdim*/
6223013Sdim
7223013Sdim#ifdef HAVE_EXPAT_CONFIG_H
8223013Sdim#include <expat_config.h>
9223013Sdim#endif
10223013Sdim#ifdef HAVE_CHECK_H
11223013Sdim#include <check.h>
12223013Sdim#else
13223013Sdim#include "minicheck.h"
14223013Sdim#endif
15223013Sdim
16234353Sdim#include <assert.h>
17223013Sdim#include <stdio.h>
18223013Sdim#include <string.h>
19223013Sdim
20223013Sdim#include "chardata.h"
21226633Sdim
22234353Sdim
23223013Sdimstatic int
24223013Sdimxmlstrlen(const XML_Char *s)
25223013Sdim{
26234353Sdim    int len = 0;
27223013Sdim    assert(s != NULL);
28223013Sdim    while (s[len] != 0)
29223013Sdim        ++len;
30223013Sdim    return len;
31223013Sdim}
32223013Sdim
33223013Sdim
34223013Sdimvoid
35223013SdimCharData_Init(CharData *storage)
36223013Sdim{
37    assert(storage != NULL);
38    storage->count = -1;
39}
40
41void
42CharData_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
60void
61CharData_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
82int
83CharData_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
111int
112CharData_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