chardata.c revision 104349
1104349Sphk/*  chardata.c
2104349Sphk *
3104349Sphk *
4104349Sphk */
5104349Sphk
6104349Sphk#include <assert.h>
7104349Sphk#include <check.h>
8104349Sphk#include <stdio.h>
9104349Sphk#include <string.h>
10104349Sphk
11104349Sphk#include "chardata.h"
12104349Sphk
13104349Sphk
14104349Sphkstatic int
15104349Sphkxmlstrlen(const XML_Char *s)
16104349Sphk{
17104349Sphk    int len = 0;
18104349Sphk    assert(s != NULL);
19104349Sphk    while (s[len] != 0)
20104349Sphk        ++len;
21104349Sphk    return len;
22104349Sphk}
23104349Sphk
24104349Sphk
25104349Sphkvoid
26104349SphkCharData_Init(CharData *storage)
27104349Sphk{
28104349Sphk    assert(storage != NULL);
29104349Sphk    storage->count = -1;
30104349Sphk}
31104349Sphk
32104349Sphkvoid
33104349SphkCharData_AppendString(CharData *storage, const char *s)
34104349Sphk{
35104349Sphk    int maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
36104349Sphk    int len;
37104349Sphk
38104349Sphk    assert(s != NULL);
39104349Sphk    len = strlen(s);
40104349Sphk    if (storage->count < 0)
41104349Sphk        storage->count = 0;
42104349Sphk    if ((len + storage->count) > maxchars) {
43104349Sphk        len = (maxchars - storage->count);
44104349Sphk    }
45104349Sphk    if (len + storage->count < sizeof(storage->data)) {
46104349Sphk        memcpy(storage->data + storage->count, s, len);
47104349Sphk        storage->count += len;
48104349Sphk    }
49104349Sphk}
50104349Sphk
51104349Sphkvoid
52104349SphkCharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len)
53104349Sphk{
54104349Sphk    int maxchars;
55104349Sphk
56104349Sphk    assert(storage != NULL);
57104349Sphk    assert(s != NULL);
58104349Sphk    maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
59104349Sphk    if (storage->count < 0)
60104349Sphk        storage->count = 0;
61104349Sphk    if (len < 0)
62104349Sphk        len = xmlstrlen(s);
63104349Sphk    if ((len + storage->count) > maxchars) {
64104349Sphk        len = (maxchars - storage->count);
65104349Sphk    }
66104349Sphk    if (len + storage->count < sizeof(storage->data)) {
67104349Sphk        memcpy(storage->data + storage->count, s,
68104349Sphk               len * sizeof(storage->data[0]));
69104349Sphk        storage->count += len;
70104349Sphk    }
71104349Sphk}
72104349Sphk
73104349Sphkint
74104349SphkCharData_CheckString(CharData *storage, const char *expected)
75104349Sphk{
76104349Sphk    char buffer[1280];
77104349Sphk    int len;
78104349Sphk    int count;
79104349Sphk
80104349Sphk    assert(storage != NULL);
81104349Sphk    assert(expected != NULL);
82104349Sphk    count = (storage->count < 0) ? 0 : storage->count;
83104349Sphk    len = strlen(expected);
84104349Sphk    if (len != count) {
85104349Sphk        if (sizeof(XML_Char) == 1)
86104349Sphk            sprintf(buffer, "wrong number of data characters:"
87104349Sphk                    " got %d, expected %d:\n%s", count, len, storage->data);
88104349Sphk        else
89104349Sphk            sprintf(buffer,
90104349Sphk                    "wrong number of data characters: got %d, expected %d",
91104349Sphk                    count, len);
92104349Sphk        fail(buffer);
93104349Sphk        return 0;
94104349Sphk    }
95104349Sphk    if (memcmp(expected, storage->data, len) != 0) {
96104349Sphk        fail("got bad data bytes");
97104349Sphk        return 0;
98104349Sphk    }
99104349Sphk    return 1;
100104349Sphk}
101104349Sphk
102104349Sphkint
103104349SphkCharData_CheckXMLChars(CharData *storage, const XML_Char *expected)
104104349Sphk{
105104349Sphk    char buffer[1024];
106104349Sphk    int len = xmlstrlen(expected);
107104349Sphk    int count;
108104349Sphk
109104349Sphk    assert(storage != NULL);
110104349Sphk    count = (storage->count < 0) ? 0 : storage->count;
111104349Sphk    if (len != count) {
112104349Sphk        sprintf(buffer, "wrong number of data characters: got %d, expected %d",
113104349Sphk                count, len);
114104349Sphk        fail(buffer);
115104349Sphk        return 0;
116104349Sphk    }
117104349Sphk    if (memcmp(expected, storage->data, len * sizeof(storage->data[0])) != 0) {
118104349Sphk        fail("got bad data bytes");
119104349Sphk        return 0;
120104349Sphk    }
121104349Sphk    return 1;
122104349Sphk}
123