OLD | NEW |
(Empty) | |
| 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 "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, udb
g_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 i
s 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 en
trypoint 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 siz
e) { |
| 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 rese
t memory functions)...\n"); |
| 199 uplug_setPlugNoUnload(data, TRUE); |
| 200 } |
| 201 |
| 202 return UPLUG_TOKEN; |
| 203 } |
| 204 |
OLD | NEW |