1 /* 2 ****************************************************************************** 3 * 4 * Copyright (C) 2009-2010, International Business Machines 5 * Corporation and others. All Rights Reserved. 6 * 7 ****************************************************************************** 8 * 9 * FILE NAME : testplug.c 10 * 11 * Date Name Description 12 * 10/29/2009 srl New. 13 ****************************************************************************** 14 * 15 * 16 * This file implements a number of example ICU plugins. 17 * 18 */ 19 20 #include "unicode/icuplug.h" 21 #include <stdio.h> /* for fprintf */ 22 #include <stdlib.h> /* for malloc */ 23 #include "unicode/udbgutil.h" 24 #include "unicode/uclean.h" 25 #include "cmemory.h" 26 27 /** 28 * Prototypes 29 */ 30 #define DECLARE_PLUGIN(x) U_CAPI UPlugTokenReturn U_EXPORT2 x (UPlugData *data, UPlugReason reason, UErrorCode *status) 31 32 DECLARE_PLUGIN(myPlugin); 33 DECLARE_PLUGIN(myPluginLow); 34 DECLARE_PLUGIN(myPluginFailQuery); 35 DECLARE_PLUGIN(myPluginFailToken); 36 DECLARE_PLUGIN(myPluginBad); 37 DECLARE_PLUGIN(myPluginHigh); 38 DECLARE_PLUGIN(debugMemoryPlugin); 39 40 /** 41 * A simple, trivial plugin. 42 */ 43 44 U_CAPI 45 UPlugTokenReturn U_EXPORT2 myPlugin ( 46 UPlugData *data, 47 UPlugReason reason, 48 UErrorCode *status) { 49 /* Just print this for debugging */ 50 fprintf(stderr,"MyPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 51 52 if(reason==UPLUG_REASON_QUERY) { 53 uplug_setPlugName(data, "Just a Test High-Level Plugin"); /* This call is optional in response to UPLUG_REASON_QUERY, but is a good idea. */ 54 uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH); /* This call is Mandatory in response to UPLUG_REASON_QUERY */ 55 } 56 57 return UPLUG_TOKEN; /* This must always be returned, to indicate that the entrypoint was actually a plugin. */ 58 } 59 60 61 U_CAPI 62 UPlugTokenReturn U_EXPORT2 myPluginLow ( 63 UPlugData *data, 64 UPlugReason reason, 65 UErrorCode *status) { 66 fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 67 68 if(reason==UPLUG_REASON_QUERY) { 69 uplug_setPlugName(data, "Low Plugin"); 70 uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 71 } 72 73 return UPLUG_TOKEN; 74 } 75 76 /** 77 * Doesn't respond to QUERY properly. 78 */ 79 U_CAPI 80 UPlugTokenReturn U_EXPORT2 myPluginFailQuery ( 81 UPlugData *data, 82 UPlugReason reason, 83 UErrorCode *status) { 84 fprintf(stderr,"MyPluginFailQuery: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 85 86 /* Should respond to UPLUG_REASON_QUERY here. */ 87 88 return UPLUG_TOKEN; 89 } 90 91 /** 92 * Doesn't return the proper token. 93 */ 94 U_CAPI 95 UPlugTokenReturn U_EXPORT2 myPluginFailToken ( 96 UPlugData *data, 97 UPlugReason reason, 98 UErrorCode *status) { 99 fprintf(stderr,"MyPluginFailToken: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 100 101 if(reason==UPLUG_REASON_QUERY) { 102 uplug_setPlugName(data, "myPluginFailToken Plugin"); 103 uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 104 } 105 106 return 0; /* Wrong. */ 107 } 108 109 110 111 /** 112 * Says it's low, but isn't. 113 */ 114 U_CAPI 115 UPlugTokenReturn U_EXPORT2 myPluginBad ( 116 UPlugData *data, 117 UPlugReason reason, 118 UErrorCode *status) { 119 fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 120 121 if(reason==UPLUG_REASON_QUERY) { 122 uplug_setPlugName(data, "Bad Plugin"); 123 uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 124 } else if(reason == UPLUG_REASON_LOAD) { 125 void *ctx = uprv_malloc(12345); 126 127 uplug_setContext(data, ctx); 128 fprintf(stderr,"I'm %p and I did a bad thing and malloced %p\n", (void*)data, (void*)ctx); 129 } else if(reason == UPLUG_REASON_UNLOAD) { 130 void * ctx = uplug_getContext(data); 131 132 uprv_free(ctx); 133 } 134 135 136 return UPLUG_TOKEN; 137 } 138 139 U_CAPI 140 UPlugTokenReturn U_EXPORT2 myPluginHigh ( 141 UPlugData *data, 142 UPlugReason reason, 143 UErrorCode *status) { 144 fprintf(stderr,"MyPluginHigh: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 145 146 if(reason==UPLUG_REASON_QUERY) { 147 uplug_setPlugName(data, "High Plugin"); 148 uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH); 149 } 150 151 return UPLUG_TOKEN; 152 } 153 154 155 /* Debug Memory Plugin (see hpmufn.c) */ 156 static void * U_CALLCONV myMemAlloc(const void *context, size_t size) { 157 void *retPtr = (void *)malloc(size); 158 (void)context; /* unused */ 159 fprintf(stderr, "MEM: malloc(%d) = %p\n", (int32_t)size, retPtr); 160 return retPtr; 161 } 162 163 static void U_CALLCONV myMemFree(const void *context, void *mem) { 164 (void)context; /* unused */ 165 166 free(mem); 167 fprintf(stderr, "MEM: free(%p)\n", mem); 168 } 169 170 static void * U_CALLCONV myMemRealloc(const void *context, void *mem, size_t size) { 171 void *retPtr; 172 (void)context; /* unused */ 173 174 175 if(mem==NULL) { 176 retPtr = NULL; 177 } else { 178 retPtr = realloc(mem, size); 179 } 180 fprintf(stderr, "MEM: realloc(%p, %d) = %p\n", mem, (int32_t)size, retPtr); 181 return retPtr; 182 } 183 184 U_CAPI 185 UPlugTokenReturn U_EXPORT2 debugMemoryPlugin ( 186 UPlugData *data, 187 UPlugReason reason, 188 UErrorCode *status) { 189 fprintf(stderr,"debugMemoryPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 190 191 if(reason==UPLUG_REASON_QUERY) { 192 uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 193 uplug_setPlugName(data, "Memory Plugin"); 194 } else if(reason==UPLUG_REASON_LOAD) { 195 u_setMemoryFunctions(uplug_getContext(data), &myMemAlloc, &myMemRealloc, &myMemFree, status); 196 fprintf(stderr, "MEM: status now %s\n", u_errorName(*status)); 197 } else if(reason==UPLUG_REASON_UNLOAD) { 198 fprintf(stderr, "MEM: not possible to unload this plugin (no way to reset memory functions)...\n"); 199 uplug_setPlugNoUnload(data, TRUE); 200 } 201 202 return UPLUG_TOKEN; 203 } 204 205