• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  // © 2016 and later: Unicode, Inc. and others.
2  // License & terms of use: http://www.unicode.org/copyright.html
3  /*
4  ******************************************************************************
5  *
6  *   Copyright (C) 2009-2015, International Business Machines
7  *   Corporation and others.  All Rights Reserved.
8  *
9  ******************************************************************************
10  *
11  *  FILE NAME : testplug.c
12  *
13  *   Date         Name        Description
14  *   10/29/2009   srl          New.
15  ******************************************************************************
16  *
17  *
18  * This file implements a number of example ICU plugins.
19  *
20  */
21  
22  #include "unicode/icuplug.h"
23  
24  #if UCONFIG_ENABLE_PLUGINS
25  /* This file isn't usually compiled except on Windows. Guard it. */
26  
27  #include <stdio.h> /* for fprintf */
28  #include <stdlib.h> /* for malloc */
29  #include "udbgutil.h"
30  #include "unicode/uclean.h"
31  #include "cmemory.h"
32  
33  /**
34   * Prototypes
35   */
36  #define DECLARE_PLUGIN(x) U_CAPI UPlugTokenReturn U_EXPORT2 x (UPlugData *data, UPlugReason reason, UErrorCode *status)
37  
38  DECLARE_PLUGIN(myPlugin);
39  DECLARE_PLUGIN(myPluginLow);
40  DECLARE_PLUGIN(myPluginFailQuery);
41  DECLARE_PLUGIN(myPluginFailToken);
42  DECLARE_PLUGIN(myPluginBad);
43  DECLARE_PLUGIN(myPluginHigh);
44  DECLARE_PLUGIN(debugMemoryPlugin);
45  
46  /**
47   * A simple, trivial plugin.
48   */
49  
50  U_CAPI
myPlugin(UPlugData * data,UPlugReason reason,UErrorCode * status)51  UPlugTokenReturn U_EXPORT2 myPlugin (
52                    UPlugData *data,
53                    UPlugReason reason,
54                    UErrorCode *status) {
55  	/* Just print this for debugging */
56      fprintf(stderr,"MyPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
57  
58      if(reason==UPLUG_REASON_QUERY) {
59          uplug_setPlugName(data, "Just a Test High-Level Plugin"); /* This call is optional in response to UPLUG_REASON_QUERY, but is a good idea. */
60          uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH); /* This call is Mandatory in response to UPLUG_REASON_QUERY */
61      }
62  
63      return UPLUG_TOKEN; /* This must always be returned, to indicate that the entrypoint was actually a plugin. */
64  }
65  
66  
67  U_CAPI
myPluginLow(UPlugData * data,UPlugReason reason,UErrorCode * status)68  UPlugTokenReturn U_EXPORT2 myPluginLow (
69                    UPlugData *data,
70                    UPlugReason reason,
71                    UErrorCode *status) {
72      fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
73  
74      if(reason==UPLUG_REASON_QUERY) {
75          uplug_setPlugName(data, "Low Plugin");
76          uplug_setPlugLevel(data, UPLUG_LEVEL_LOW);
77      }
78  
79      return UPLUG_TOKEN;
80  }
81  
82  /**
83   * Doesn't respond to QUERY properly.
84   */
85  U_CAPI
myPluginFailQuery(UPlugData * data,UPlugReason reason,UErrorCode * status)86  UPlugTokenReturn U_EXPORT2 myPluginFailQuery (
87                    UPlugData *data,
88                    UPlugReason reason,
89                    UErrorCode *status) {
90      fprintf(stderr,"MyPluginFailQuery: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
91  
92  	/* Should respond to UPLUG_REASON_QUERY here. */
93  
94      return UPLUG_TOKEN;
95  }
96  
97  /**
98   * Doesn't return the proper token.
99   */
100  U_CAPI
myPluginFailToken(UPlugData * data,UPlugReason reason,UErrorCode * status)101  UPlugTokenReturn U_EXPORT2 myPluginFailToken (
102                    UPlugData *data,
103                    UPlugReason reason,
104                    UErrorCode *status) {
105      fprintf(stderr,"MyPluginFailToken: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
106  
107      if(reason==UPLUG_REASON_QUERY) {
108          uplug_setPlugName(data, "myPluginFailToken Plugin");
109          uplug_setPlugLevel(data, UPLUG_LEVEL_LOW);
110      }
111  
112      return 0; /* Wrong. */
113  }
114  
115  
116  
117  /**
118   * Says it's low, but isn't.
119   */
120  U_CAPI
myPluginBad(UPlugData * data,UPlugReason reason,UErrorCode * status)121  UPlugTokenReturn U_EXPORT2 myPluginBad (
122                    UPlugData *data,
123                    UPlugReason reason,
124                    UErrorCode *status) {
125      fprintf(stderr,"MyPluginLow: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
126  
127      if(reason==UPLUG_REASON_QUERY) {
128          uplug_setPlugName(data, "Bad Plugin");
129          uplug_setPlugLevel(data, UPLUG_LEVEL_LOW);
130      } else if(reason == UPLUG_REASON_LOAD) {
131          void *ctx = uprv_malloc(12345);
132  
133          uplug_setContext(data, ctx);
134          fprintf(stderr,"I'm %p and I did a bad thing and malloced %p\n", (void*)data, (void*)ctx);
135      } else if(reason == UPLUG_REASON_UNLOAD) {
136          void * ctx = uplug_getContext(data);
137  
138          uprv_free(ctx);
139      }
140  
141  
142      return UPLUG_TOKEN;
143  }
144  
145  U_CAPI
myPluginHigh(UPlugData * data,UPlugReason reason,UErrorCode * status)146  UPlugTokenReturn U_EXPORT2 myPluginHigh (
147                    UPlugData *data,
148                    UPlugReason reason,
149                    UErrorCode *status) {
150      fprintf(stderr,"MyPluginHigh: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
151  
152      if(reason==UPLUG_REASON_QUERY) {
153          uplug_setPlugName(data, "High Plugin");
154          uplug_setPlugLevel(data, UPLUG_LEVEL_HIGH);
155      }
156  
157      return UPLUG_TOKEN;
158  }
159  
160  
161  /*  Debug Memory Plugin (see hpmufn.c) */
myMemAlloc(const void * context,size_t size)162  static void * U_CALLCONV myMemAlloc(const void *context, size_t size) {
163    void *retPtr = (void *)malloc(size);
164    (void)context; /* unused */
165    fprintf(stderr, "MEM: malloc(%d) = %p\n", (int32_t)size, retPtr);
166    return retPtr;
167  }
168  
myMemFree(const void * context,void * mem)169  static void U_CALLCONV myMemFree(const void *context, void *mem) {
170    (void)context; /* unused */
171  
172    free(mem);
173    fprintf(stderr, "MEM: free(%p)\n", mem);
174  }
175  
myMemRealloc(const void * context,void * mem,size_t size)176  static void * U_CALLCONV myMemRealloc(const void *context, void *mem, size_t size) {
177      void *retPtr;
178      (void)context; /* unused */
179  
180  
181      if(mem==NULL) {
182          retPtr = NULL;
183      } else {
184          retPtr = realloc(mem, size);
185      }
186      fprintf(stderr, "MEM: realloc(%p, %d) = %p\n", mem, (int32_t)size, retPtr);
187      return retPtr;
188  }
189  
190  U_CAPI
debugMemoryPlugin(UPlugData * data,UPlugReason reason,UErrorCode * status)191  UPlugTokenReturn U_EXPORT2 debugMemoryPlugin (
192                    UPlugData *data,
193                    UPlugReason reason,
194                    UErrorCode *status) {
195      fprintf(stderr,"debugMemoryPlugin: data=%p, reason=%s, status=%s\n", (void*)data, udbg_enumName(UDBG_UPlugReason,(int32_t)reason), u_errorName(*status));
196  
197      if(reason==UPLUG_REASON_QUERY) {
198          uplug_setPlugLevel(data, UPLUG_LEVEL_LOW);
199          uplug_setPlugName(data, "Memory Plugin");
200      } else if(reason==UPLUG_REASON_LOAD) {
201          u_setMemoryFunctions(uplug_getContext(data), &myMemAlloc, &myMemRealloc, &myMemFree, status);
202          fprintf(stderr, "MEM: status now %s\n", u_errorName(*status));
203      } else if(reason==UPLUG_REASON_UNLOAD) {
204          fprintf(stderr, "MEM: not possible to unload this plugin (no way to reset memory functions)...\n");
205          uplug_setPlugNoUnload(data, TRUE);
206      }
207  
208      return UPLUG_TOKEN;
209  }
210  
211  #endif
212