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