1b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project/* Copyright (c) 1998-2003 Thai Open Source Software Center Ltd
2b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   See the file COPYING for copying permission.
3b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
4b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project   chardata.c
5b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project*/
6b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
7b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef HAVE_EXPAT_CONFIG_H
8b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <expat_config.h>
9b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
10b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#ifdef HAVE_CHECK_H
11b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <check.h>
12b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#else
13b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "minicheck.h"
14b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#endif
15b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
16b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <assert.h>
17b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <stdio.h>
18b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include <string.h>
19b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
20b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project#include "chardata.h"
21b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
22b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
23b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectstatic int
24b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectxmlstrlen(const XML_Char *s)
25b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
26b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int len = 0;
27b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(s != NULL);
28b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    while (s[len] != 0)
29b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        ++len;
30b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return len;
31b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
32b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
33b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
34b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid
35b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectCharData_Init(CharData *storage)
36b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
37b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(storage != NULL);
38b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    storage->count = -1;
39b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
40b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
41b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid
42b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectCharData_AppendString(CharData *storage, const char *s)
43b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
44b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
45b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int len;
46b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
47b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(s != NULL);
48b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    len = strlen(s);
49b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (storage->count < 0)
50b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        storage->count = 0;
51b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if ((len + storage->count) > maxchars) {
52b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        len = (maxchars - storage->count);
53b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
54b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (len + storage->count < sizeof(storage->data)) {
55b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        memcpy(storage->data + storage->count, s, len);
56b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        storage->count += len;
57b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
58b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
59b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
60b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectvoid
61b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectCharData_AppendXMLChars(CharData *storage, const XML_Char *s, int len)
62b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
63b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int maxchars;
64b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
65b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(storage != NULL);
66b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(s != NULL);
67b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    maxchars = sizeof(storage->data) / sizeof(storage->data[0]);
68b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (storage->count < 0)
69b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        storage->count = 0;
70b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (len < 0)
71b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        len = xmlstrlen(s);
72b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if ((len + storage->count) > maxchars) {
73b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        len = (maxchars - storage->count);
74b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
75b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (len + storage->count < sizeof(storage->data)) {
76b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        memcpy(storage->data + storage->count, s,
77b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project               len * sizeof(storage->data[0]));
78b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        storage->count += len;
79b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
80b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
81b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
82b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint
83b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectCharData_CheckString(CharData *storage, const char *expected)
84b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
85b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char buffer[1280];
86b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int len;
87b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int count;
88b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
89b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(storage != NULL);
90b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(expected != NULL);
91b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    count = (storage->count < 0) ? 0 : storage->count;
92b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    len = strlen(expected);
93b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (len != count) {
94b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        if (sizeof(XML_Char) == 1)
95b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            sprintf(buffer, "wrong number of data characters:"
96b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    " got %d, expected %d:\n%s", count, len, storage->data);
97b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        else
98b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project            sprintf(buffer,
99b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    "wrong number of data characters: got %d, expected %d",
100b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                    count, len);
101b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail(buffer);
102b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
103b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
104b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (memcmp(expected, storage->data, len) != 0) {
105b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("got bad data bytes");
106b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
107b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
108b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
109b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
110b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
111b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Projectint
112b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source ProjectCharData_CheckXMLChars(CharData *storage, const XML_Char *expected)
113b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project{
114b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    char buffer[1024];
115b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int len = xmlstrlen(expected);
116b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    int count;
117b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project
118b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    assert(storage != NULL);
119b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    count = (storage->count < 0) ? 0 : storage->count;
120b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (len != count) {
121b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        sprintf(buffer, "wrong number of data characters: got %d, expected %d",
122b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project                count, len);
123b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail(buffer);
124b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
125b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
126b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    if (memcmp(expected, storage->data, len * sizeof(storage->data[0])) != 0) {
127b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        fail("got bad data bytes");
128b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project        return 0;
129b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    }
130b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project    return 1;
131b80e287d54a028e744f9fe412840a89ec7f8084bThe Android Open Source Project}
132