intl/icu/source/tools/icuinfo/testplug.c

changeset 0
6474c204b198
     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 +

mercurial