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
23static int
24xmlstrlen(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
34void
35CharData_Init(CharData *storage)
36{
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