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 23 static int 24 xmlstrlen(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 34 void 35 CharData_Init(CharData *storage) 36 { 37 assert(storage != NULL); 38 storage->count = -1; 39 } 40 41 void 42 CharData_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 60 void 61 CharData_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 82 int 83 CharData_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 111 int 112 CharData_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