chardata.c revision 302385
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#include "minicheck.h"
11
12#include <assert.h>
13#include <stdio.h>
14#include <string.h>
15
16#include "chardata.h"
17
18
19static int
20xmlstrlen(const XML_Char *s)
21{
22    int len = 0;
23    assert(s != NULL);
24    while (s[len] != 0)
25        ++len;
26    return len;
27}
28
29
30void
31CharData_Init(CharData *storage)
32{
33    assert(storage != NULL);
34    storage->count = -1;
35}
36
37void
38CharData_AppendString(CharData *storage, const char *s)
39{
40    int maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
41    int len;
42
43    assert(s != NULL);
44    len = strlen(s);
45    if (storage->count < 0)
46        storage->count = 0;
47    if ((len + storage->count) > maxchars) {
48        len = (maxchars - storage->count);
49    }
50    if (len + storage->count < (int)sizeof(storage->data)) {
51        memcpy(storage->data + storage->count, s, len);
52        storage->count += len;
53    }
54}
55
56void
57CharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len)
58{
59    int maxchars;
60
61    assert(storage != NULL);
62    assert(s != NULL);
63    maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
64    if (storage->count < 0)
65        storage->count = 0;
66    if (len < 0)
67        len = xmlstrlen(s);
68    if ((len + storage->count) > maxchars) {
69        len = (maxchars - storage->count);
70    }
71    if (len + storage->count < (int)sizeof(storage->data)) {
72        memcpy(storage->data + storage->count, s,
73               len * sizeof(storage->data[0]));
74        storage->count += len;
75    }
76}
77
78int
79CharData_CheckString(CharData *storage, const char *expected)
80{
81    char buffer[1280];
82    int len;
83    int count;
84
85    assert(storage != NULL);
86    assert(expected != NULL);
87    count = (storage->count < 0) ? 0 : storage->count;
88    len = strlen(expected);
89    if (len != count) {
90        if (sizeof(XML_Char) == 1)
91            sprintf(buffer, "wrong number of data characters:"
92                    " got %d, expected %d:\n%s", count, len, storage->data);
93        else
94            sprintf(buffer,
95                    "wrong number of data characters: got %d, expected %d",
96                    count, len);
97        fail(buffer);
98        return 0;
99    }
100    if (memcmp(expected, storage->data, len) != 0) {
101        fail("got bad data bytes");
102        return 0;
103    }
104    return 1;
105}
106
107int
108CharData_CheckXMLChars(CharData *storage, const XML_Char *expected)
109{
110    char buffer[1024];
111    int len = xmlstrlen(expected);
112    int count;
113
114    assert(storage != NULL);
115    count = (storage->count < 0) ? 0 : storage->count;
116    if (len != count) {
117        sprintf(buffer, "wrong number of data characters: got %d, expected %d",
118                count, len);
119        fail(buffer);
120        return 0;
121    }
122    if (memcmp(expected, storage->data, len * sizeof(storage->data[0])) != 0) {
123        fail("got bad data bytes");
124        return 0;
125    }
126    return 1;
127}
128