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