150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* 250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho****************************************************************************** 350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* Copyright (C) 2009-2010, International Business Machines 550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* Corporation and others. All Rights Reserved. 650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho****************************************************************************** 850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* FILE NAME : testplug.c 1050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 1150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* Date Name Description 1250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 10/29/2009 srl New. 1350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho****************************************************************************** 1450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 1550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 1650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* This file implements a number of example ICU plugins. 1750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho* 1850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho*/ 1950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/icuplug.h" 2150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <stdio.h> /* for fprintf */ 2250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include <stdlib.h> /* for malloc */ 2327f654740f2a26ad62a5c155af9199af9e69b889claireho#include "udbgutil.h" 2450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "unicode/uclean.h" 2550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#include "cmemory.h" 2650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 2750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 2850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Prototypes 2950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 3050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho#define DECLARE_PLUGIN(x) U_CAPI UPlugTokenReturn U_EXPORT2 x (UPlugData *data, UPlugReason reason, UErrorCode *status) 3150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 3250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDECLARE_PLUGIN(myPlugin); 3350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDECLARE_PLUGIN(myPluginLow); 3450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDECLARE_PLUGIN(myPluginFailQuery); 3550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDECLARE_PLUGIN(myPluginFailToken); 3650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDECLARE_PLUGIN(myPluginBad); 3750294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDECLARE_PLUGIN(myPluginHigh); 3850294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoDECLARE_PLUGIN(debugMemoryPlugin); 3950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 4150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * A simple, trivial plugin. 4250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 4350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 4450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI 4550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUPlugTokenReturn U_EXPORT2 myPlugin ( 4650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugData *data, 4750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugReason reason, 4850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 4950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Just print this for debugging */ 5050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr,"MyPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 5150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 5250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(reason==UPLUG_REASON_QUERY) { 5350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugName(data, "Just a Test High-Level Plugin"); /* This call is optional in response to UPLUG_REASON_QUERY, but is a good idea. */ 5450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH); /* This call is Mandatory in response to UPLUG_REASON_QUERY */ 5550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 5650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 5750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UPLUG_TOKEN; /* This must always be returned, to indicate that the entrypoint was actually a plugin. */ 5850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 5950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 6050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 6150294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI 6250294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUPlugTokenReturn U_EXPORT2 myPluginLow ( 6350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugData *data, 6450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugReason reason, 6550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 6650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 6750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 6850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(reason==UPLUG_REASON_QUERY) { 6950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugName(data, "Low Plugin"); 7050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 7150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 7250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 7350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UPLUG_TOKEN; 7450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 7550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 7650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 7750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Doesn't respond to QUERY properly. 7850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 7950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI 8050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUPlugTokenReturn U_EXPORT2 myPluginFailQuery ( 8150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugData *data, 8250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugReason reason, 8350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 8450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr,"MyPluginFailQuery: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 8550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho /* Should respond to UPLUG_REASON_QUERY here. */ 8750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 8850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UPLUG_TOKEN; 8950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 9050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 9150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 9250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Doesn't return the proper token. 9350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 9450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI 9550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUPlugTokenReturn U_EXPORT2 myPluginFailToken ( 9650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugData *data, 9750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugReason reason, 9850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 9950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr,"MyPluginFailToken: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 10050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 10150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(reason==UPLUG_REASON_QUERY) { 10250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugName(data, "myPluginFailToken Plugin"); 10350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 10450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 10550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 10650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return 0; /* Wrong. */ 10750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 10850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 10950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 11050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 11150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/** 11250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho * Says it's low, but isn't. 11350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho */ 11450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI 11550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUPlugTokenReturn U_EXPORT2 myPluginBad ( 11650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugData *data, 11750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugReason reason, 11850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 11950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 12050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 12150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(reason==UPLUG_REASON_QUERY) { 12250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugName(data, "Bad Plugin"); 12350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 12450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if(reason == UPLUG_REASON_LOAD) { 12550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void *ctx = uprv_malloc(12345); 12650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 12750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setContext(data, ctx); 12850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr,"I'm %p and I did a bad thing and malloced %p\n", (void*)data, (void*)ctx); 12950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if(reason == UPLUG_REASON_UNLOAD) { 13050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void * ctx = uplug_getContext(data); 13150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uprv_free(ctx); 13350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 13450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UPLUG_TOKEN; 13750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 13850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 13950294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI 14050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUPlugTokenReturn U_EXPORT2 myPluginHigh ( 14150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugData *data, 14250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugReason reason, 14350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 14450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr,"MyPluginHigh: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 14550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 14650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(reason==UPLUG_REASON_QUERY) { 14750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugName(data, "High Plugin"); 14850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH); 14950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 15050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UPLUG_TOKEN; 15250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 15350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 15550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho/* Debug Memory Plugin (see hpmufn.c) */ 15650294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void * U_CALLCONV myMemAlloc(const void *context, size_t size) { 15750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void *retPtr = (void *)malloc(size); 15850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (void)context; /* unused */ 15950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "MEM: malloc(%d) = %p\n", (int32_t)size, retPtr); 16050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return retPtr; 16150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 16250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 16350294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void U_CALLCONV myMemFree(const void *context, void *mem) { 16450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (void)context; /* unused */ 16550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 16650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho free(mem); 16750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "MEM: free(%p)\n", mem); 16850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 16950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 17050294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehostatic void * U_CALLCONV myMemRealloc(const void *context, void *mem, size_t size) { 17150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho void *retPtr; 17250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho (void)context; /* unused */ 17350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 17450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 17550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(mem==NULL) { 17650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho retPtr = NULL; 17750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else { 17850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho retPtr = realloc(mem, size); 17950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 18050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "MEM: realloc(%p, %d) = %p\n", mem, (int32_t)size, retPtr); 18150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return retPtr; 18250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 18350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 18450294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoU_CAPI 18550294ead5e5d23f5bbfed76e00e6b510bd41eee1clairehoUPlugTokenReturn U_EXPORT2 debugMemoryPlugin ( 18650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugData *data, 18750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UPlugReason reason, 18850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho UErrorCode *status) { 18950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr,"debugMemoryPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status)); 19050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 19150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho if(reason==UPLUG_REASON_QUERY) { 19250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugLevel(data, UPLUG_LEVEL_LOW); 19350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugName(data, "Memory Plugin"); 19450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if(reason==UPLUG_REASON_LOAD) { 19550294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho u_setMemoryFunctions(uplug_getContext(data), &myMemAlloc, &myMemRealloc, &myMemFree, status); 19650294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "MEM: status now %s\n", u_errorName(*status)); 19750294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } else if(reason==UPLUG_REASON_UNLOAD) { 19850294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho fprintf(stderr, "MEM: not possible to unload this plugin (no way to reset memory functions)...\n"); 19950294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho uplug_setPlugNoUnload(data, TRUE); 20050294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho } 20150294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 20250294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho return UPLUG_TOKEN; 20350294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho} 20450294ead5e5d23f5bbfed76e00e6b510bd41eee1claireho 205