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