1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/intl/icu/source/tools/icuinfo/testplug.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,204 @@ 1.4 +/* 1.5 +****************************************************************************** 1.6 +* 1.7 +* Copyright (C) 2009-2010, International Business Machines 1.8 +* Corporation and others. All Rights Reserved. 1.9 +* 1.10 +****************************************************************************** 1.11 +* 1.12 +* FILE NAME : testplug.c 1.13 +* 1.14 +* Date Name Description 1.15 +* 10/29/2009 srl New. 1.16 +****************************************************************************** 1.17 +* 1.18 +* 1.19 +* This file implements a number of example ICU plugins. 1.20 +* 1.21 +*/ 1.22 + 1.23 +#include "unicode/icuplug.h" 1.24 +#include <stdio.h> /* for fprintf */ 1.25 +#include <stdlib.h> /* for malloc */ 1.26 +#include "udbgutil.h" 1.27 +#include "unicode/uclean.h" 1.28 +#include "cmemory.h" 1.29 + 1.30 +/** 1.31 + * Prototypes 1.32 + */ 1.33 +#define DECLARE_PLUGIN(x) U_CAPI UPlugTokenReturn U_EXPORT2 x (UPlugData *data, UPlugReason reason, UErrorCode *status) 1.34 + 1.35 +DECLARE_PLUGIN(myPlugin); 1.36 +DECLARE_PLUGIN(myPluginLow); 1.37 +DECLARE_PLUGIN(myPluginFailQuery); 1.38 +DECLARE_PLUGIN(myPluginFailToken); 1.39 +DECLARE_PLUGIN(myPluginBad); 1.40 +DECLARE_PLUGIN(myPluginHigh); 1.41 +DECLARE_PLUGIN(debugMemoryPlugin); 1.42 + 1.43 +/** 1.44 + * A simple, trivial plugin. 1.45 + */ 1.46 + 1.47 +U_CAPI 1.48 +UPlugTokenReturn U_EXPORT2 myPlugin ( 1.49 + UPlugData *data, 1.50 + UPlugReason reason, 1.51 + UErrorCode *status) { 1.52 + /* Just print this for debugging */ 1.53 + fprintf(stderr,"MyPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 1.54 + 1.55 + if(reason==UPLUG_REASON_QUERY) { 1.56 + uplug_setPlugName(data, "Just a Test High-Level Plugin"); /* This call is optional in response to UPLUG_REASON_QUERY, but is a good idea. */ 1.57 + uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH); /* This call is Mandatory in response to UPLUG_REASON_QUERY */ 1.58 + } 1.59 + 1.60 + return UPLUG_TOKEN; /* This must always be returned, to indicate that the entrypoint was actually a plugin. */ 1.61 +} 1.62 + 1.63 + 1.64 +U_CAPI 1.65 +UPlugTokenReturn U_EXPORT2 myPluginLow ( 1.66 + UPlugData *data, 1.67 + UPlugReason reason, 1.68 + UErrorCode *status) { 1.69 + fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 1.70 + 1.71 + if(reason==UPLUG_REASON_QUERY) { 1.72 + uplug_setPlugName(data, "Low Plugin"); 1.73 + uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 1.74 + } 1.75 + 1.76 + return UPLUG_TOKEN; 1.77 +} 1.78 + 1.79 +/** 1.80 + * Doesn't respond to QUERY properly. 1.81 + */ 1.82 +U_CAPI 1.83 +UPlugTokenReturn U_EXPORT2 myPluginFailQuery ( 1.84 + UPlugData *data, 1.85 + UPlugReason reason, 1.86 + UErrorCode *status) { 1.87 + fprintf(stderr,"MyPluginFailQuery: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 1.88 + 1.89 + /* Should respond to UPLUG_REASON_QUERY here. */ 1.90 + 1.91 + return UPLUG_TOKEN; 1.92 +} 1.93 + 1.94 +/** 1.95 + * Doesn't return the proper token. 1.96 + */ 1.97 +U_CAPI 1.98 +UPlugTokenReturn U_EXPORT2 myPluginFailToken ( 1.99 + UPlugData *data, 1.100 + UPlugReason reason, 1.101 + UErrorCode *status) { 1.102 + fprintf(stderr,"MyPluginFailToken: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 1.103 + 1.104 + if(reason==UPLUG_REASON_QUERY) { 1.105 + uplug_setPlugName(data, "myPluginFailToken Plugin"); 1.106 + uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 1.107 + } 1.108 + 1.109 + return 0; /* Wrong. */ 1.110 +} 1.111 + 1.112 + 1.113 + 1.114 +/** 1.115 + * Says it's low, but isn't. 1.116 + */ 1.117 +U_CAPI 1.118 +UPlugTokenReturn U_EXPORT2 myPluginBad ( 1.119 + UPlugData *data, 1.120 + UPlugReason reason, 1.121 + UErrorCode *status) { 1.122 + fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 1.123 + 1.124 + if(reason==UPLUG_REASON_QUERY) { 1.125 + uplug_setPlugName(data, "Bad Plugin"); 1.126 + uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 1.127 + } else if(reason == UPLUG_REASON_LOAD) { 1.128 + void *ctx = uprv_malloc(12345); 1.129 + 1.130 + uplug_setContext(data, ctx); 1.131 + fprintf(stderr,"I'm %p and I did a bad thing and malloced %p\n", (void*)data, (void*)ctx); 1.132 + } else if(reason == UPLUG_REASON_UNLOAD) { 1.133 + void * ctx = uplug_getContext(data); 1.134 + 1.135 + uprv_free(ctx); 1.136 + } 1.137 + 1.138 + 1.139 + return UPLUG_TOKEN; 1.140 +} 1.141 + 1.142 +U_CAPI 1.143 +UPlugTokenReturn U_EXPORT2 myPluginHigh ( 1.144 + UPlugData *data, 1.145 + UPlugReason reason, 1.146 + UErrorCode *status) { 1.147 + fprintf(stderr,"MyPluginHigh: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 1.148 + 1.149 + if(reason==UPLUG_REASON_QUERY) { 1.150 + uplug_setPlugName(data, "High Plugin"); 1.151 + uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH); 1.152 + } 1.153 + 1.154 + return UPLUG_TOKEN; 1.155 +} 1.156 + 1.157 + 1.158 +/* Debug Memory Plugin (see hpmufn.c) */ 1.159 +static void * U_CALLCONV myMemAlloc(const void *context, size_t size) { 1.160 + void *retPtr = (void *)malloc(size); 1.161 + (void)context; /* unused */ 1.162 + fprintf(stderr, "MEM: malloc(%d) = %p\n", (int32_t)size, retPtr); 1.163 + return retPtr; 1.164 +} 1.165 + 1.166 +static void U_CALLCONV myMemFree(const void *context, void *mem) { 1.167 + (void)context; /* unused */ 1.168 + 1.169 + free(mem); 1.170 + fprintf(stderr, "MEM: free(%p)\n", mem); 1.171 +} 1.172 + 1.173 +static void * U_CALLCONV myMemRealloc(const void *context, void *mem, size_t size) { 1.174 + void *retPtr; 1.175 + (void)context; /* unused */ 1.176 + 1.177 + 1.178 + if(mem==NULL) { 1.179 + retPtr = NULL; 1.180 + } else { 1.181 + retPtr = realloc(mem, size); 1.182 + } 1.183 + fprintf(stderr, "MEM: realloc(%p, %d) = %p\n", mem, (int32_t)size, retPtr); 1.184 + return retPtr; 1.185 +} 1.186 + 1.187 +U_CAPI 1.188 +UPlugTokenReturn U_EXPORT2 debugMemoryPlugin ( 1.189 + UPlugData *data, 1.190 + UPlugReason reason, 1.191 + UErrorCode *status) { 1.192 + fprintf(stderr,"debugMemoryPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 1.193 + 1.194 + if(reason==UPLUG_REASON_QUERY) { 1.195 + uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 1.196 + uplug_setPlugName(data, "Memory Plugin"); 1.197 + } else if(reason==UPLUG_REASON_LOAD) { 1.198 + u_setMemoryFunctions(uplug_getContext(data), &myMemAlloc, &myMemRealloc, &myMemFree, status); 1.199 + fprintf(stderr, "MEM: status now %s\n", u_errorName(*status)); 1.200 + } else if(reason==UPLUG_REASON_UNLOAD) { 1.201 + fprintf(stderr, "MEM: not possible to unload this plugin (no way to reset memory functions)...\n"); 1.202 + uplug_setPlugNoUnload(data, TRUE); 1.203 + } 1.204 + 1.205 + return UPLUG_TOKEN; 1.206 +} 1.207 +