| Index: icu46/source/tools/icuinfo/testplug.c
|
| ===================================================================
|
| --- icu46/source/tools/icuinfo/testplug.c (revision 0)
|
| +++ icu46/source/tools/icuinfo/testplug.c (revision 0)
|
| @@ -0,0 +1,204 @@
|
| +/*
|
| +******************************************************************************
|
| +*
|
| +* Copyright (C) 2009-2010, International Business Machines
|
| +* Corporation and others. All Rights Reserved.
|
| +*
|
| +******************************************************************************
|
| +*
|
| +* FILE NAME : testplug.c
|
| +*
|
| +* Date Name Description
|
| +* 10/29/2009 srl New.
|
| +******************************************************************************
|
| +*
|
| +*
|
| +* This file implements a number of example ICU plugins.
|
| +*
|
| +*/
|
| +
|
| +#include "unicode/icuplug.h"
|
| +#include <stdio.h> /* for fprintf */
|
| +#include <stdlib.h> /* for malloc */
|
| +#include "udbgutil.h"
|
| +#include "unicode/uclean.h"
|
| +#include "cmemory.h"
|
| +
|
| +/**
|
| + * Prototypes
|
| + */
|
| +#define DECLARE_PLUGIN(x) U_CAPI UPlugTokenReturn U_EXPORT2 x (UPlugData *data, UPlugReason reason, UErrorCode *status)
|
| +
|
| +DECLARE_PLUGIN(myPlugin);
|
| +DECLARE_PLUGIN(myPluginLow);
|
| +DECLARE_PLUGIN(myPluginFailQuery);
|
| +DECLARE_PLUGIN(myPluginFailToken);
|
| +DECLARE_PLUGIN(myPluginBad);
|
| +DECLARE_PLUGIN(myPluginHigh);
|
| +DECLARE_PLUGIN(debugMemoryPlugin);
|
| +
|
| +/**
|
| + * A simple, trivial plugin.
|
| + */
|
| +
|
| +U_CAPI
|
| +UPlugTokenReturn U_EXPORT2 myPlugin (
|
| + UPlugData *data,
|
| + UPlugReason reason,
|
| + UErrorCode *status) {
|
| + /* Just print this for debugging */
|
| + fprintf(stderr,"MyPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
|
| +
|
| + if(reason==UPLUG_REASON_QUERY) {
|
| + uplug_setPlugName(data, "Just a Test High-Level Plugin"); /* This call is optional in response to UPLUG_REASON_QUERY, but is a good idea. */
|
| + uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH); /* This call is Mandatory in response to UPLUG_REASON_QUERY */
|
| + }
|
| +
|
| + return UPLUG_TOKEN; /* This must always be returned, to indicate that the entrypoint was actually a plugin. */
|
| +}
|
| +
|
| +
|
| +U_CAPI
|
| +UPlugTokenReturn U_EXPORT2 myPluginLow (
|
| + UPlugData *data,
|
| + UPlugReason reason,
|
| + UErrorCode *status) {
|
| + fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
|
| +
|
| + if(reason==UPLUG_REASON_QUERY) {
|
| + uplug_setPlugName(data, "Low Plugin");
|
| + uplug_setPlugLevel(data, UPLUG_LEVEL_LOW);
|
| + }
|
| +
|
| + return UPLUG_TOKEN;
|
| +}
|
| +
|
| +/**
|
| + * Doesn't respond to QUERY properly.
|
| + */
|
| +U_CAPI
|
| +UPlugTokenReturn U_EXPORT2 myPluginFailQuery (
|
| + UPlugData *data,
|
| + UPlugReason reason,
|
| + UErrorCode *status) {
|
| + fprintf(stderr,"MyPluginFailQuery: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
|
| +
|
| + /* Should respond to UPLUG_REASON_QUERY here. */
|
| +
|
| + return UPLUG_TOKEN;
|
| +}
|
| +
|
| +/**
|
| + * Doesn't return the proper token.
|
| + */
|
| +U_CAPI
|
| +UPlugTokenReturn U_EXPORT2 myPluginFailToken (
|
| + UPlugData *data,
|
| + UPlugReason reason,
|
| + UErrorCode *status) {
|
| + fprintf(stderr,"MyPluginFailToken: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
|
| +
|
| + if(reason==UPLUG_REASON_QUERY) {
|
| + uplug_setPlugName(data, "myPluginFailToken Plugin");
|
| + uplug_setPlugLevel(data, UPLUG_LEVEL_LOW);
|
| + }
|
| +
|
| + return 0; /* Wrong. */
|
| +}
|
| +
|
| +
|
| +
|
| +/**
|
| + * Says it's low, but isn't.
|
| + */
|
| +U_CAPI
|
| +UPlugTokenReturn U_EXPORT2 myPluginBad (
|
| + UPlugData *data,
|
| + UPlugReason reason,
|
| + UErrorCode *status) {
|
| + fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
|
| +
|
| + if(reason==UPLUG_REASON_QUERY) {
|
| + uplug_setPlugName(data, "Bad Plugin");
|
| + uplug_setPlugLevel(data, UPLUG_LEVEL_LOW);
|
| + } else if(reason == UPLUG_REASON_LOAD) {
|
| + void *ctx = uprv_malloc(12345);
|
| +
|
| + uplug_setContext(data, ctx);
|
| + fprintf(stderr,"I'm %p and I did a bad thing and malloced %p\n", (void*)data, (void*)ctx);
|
| + } else if(reason == UPLUG_REASON_UNLOAD) {
|
| + void * ctx = uplug_getContext(data);
|
| +
|
| + uprv_free(ctx);
|
| + }
|
| +
|
| +
|
| + return UPLUG_TOKEN;
|
| +}
|
| +
|
| +U_CAPI
|
| +UPlugTokenReturn U_EXPORT2 myPluginHigh (
|
| + UPlugData *data,
|
| + UPlugReason reason,
|
| + UErrorCode *status) {
|
| + fprintf(stderr,"MyPluginHigh: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
|
| +
|
| + if(reason==UPLUG_REASON_QUERY) {
|
| + uplug_setPlugName(data, "High Plugin");
|
| + uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH);
|
| + }
|
| +
|
| + return UPLUG_TOKEN;
|
| +}
|
| +
|
| +
|
| +/* Debug Memory Plugin (see hpmufn.c) */
|
| +static void * U_CALLCONV myMemAlloc(const void *context, size_t size) {
|
| + void *retPtr = (void *)malloc(size);
|
| + (void)context; /* unused */
|
| + fprintf(stderr, "MEM: malloc(%d) = %p\n", (int32_t)size, retPtr);
|
| + return retPtr;
|
| +}
|
| +
|
| +static void U_CALLCONV myMemFree(const void *context, void *mem) {
|
| + (void)context; /* unused */
|
| +
|
| + free(mem);
|
| + fprintf(stderr, "MEM: free(%p)\n", mem);
|
| +}
|
| +
|
| +static void * U_CALLCONV myMemRealloc(const void *context, void *mem, size_t size) {
|
| + void *retPtr;
|
| + (void)context; /* unused */
|
| +
|
| +
|
| + if(mem==NULL) {
|
| + retPtr = NULL;
|
| + } else {
|
| + retPtr = realloc(mem, size);
|
| + }
|
| + fprintf(stderr, "MEM: realloc(%p, %d) = %p\n", mem, (int32_t)size, retPtr);
|
| + return retPtr;
|
| +}
|
| +
|
| +U_CAPI
|
| +UPlugTokenReturn U_EXPORT2 debugMemoryPlugin (
|
| + UPlugData *data,
|
| + UPlugReason reason,
|
| + UErrorCode *status) {
|
| + fprintf(stderr,"debugMemoryPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
|
| +
|
| + if(reason==UPLUG_REASON_QUERY) {
|
| + uplug_setPlugLevel(data, UPLUG_LEVEL_LOW);
|
| + uplug_setPlugName(data, "Memory Plugin");
|
| + } else if(reason==UPLUG_REASON_LOAD) {
|
| + u_setMemoryFunctions(uplug_getContext(data), &myMemAlloc, &myMemRealloc, &myMemFree, status);
|
| + fprintf(stderr, "MEM: status now %s\n", u_errorName(*status));
|
| + } else if(reason==UPLUG_REASON_UNLOAD) {
|
| + fprintf(stderr, "MEM: not possible to unload this plugin (no way to reset memory functions)...\n");
|
| + uplug_setPlugNoUnload(data, TRUE);
|
| + }
|
| +
|
| + return UPLUG_TOKEN;
|
| +}
|
| +
|
|
|
| Property changes on: icu46/source/tools/icuinfo/testplug.c
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|