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
14static int
15xmlstrlen(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
25void
26CharData_Init(CharData *storage)
27{
28    assert(storage != NULL);
29    storage->count = -1;
30}
31
32void
33CharData_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
51void
52CharData_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
73int
74CharData_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
102int
103CharData_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