16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 2009-2012, International Business Machines
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*  FILE NAME : icuplug.c
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date         Name        Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   10/29/2009   sl          New.
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/icuplug.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "icuplugimp.h"
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cstring.h"
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h"
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "putilimp.h"
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "ucln.h"
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef __MVS__  /* defined by z/OS compiler */
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define _POSIX_SOURCE
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <cics.h> /* 12 Nov 2011 JAM iscics() function */
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef UPLUG_TRACE
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UPLUG_TRACE 0
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include <stdio.h>
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define DBG(x) fprintf(stderr, "%s:%d: ",__FILE__,__LINE__); fprintf x
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Internal structure of an ICU plugin.
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UPlugData {
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugEntrypoint  *entrypoint; /**< plugin entrypoint */
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint32_t structSize;    /**< initialized to the size of this structure */
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint32_t token;         /**< must be U_PLUG_TOKEN */
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void *lib;              /**< plugin library, or NULL */
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  char libName[UPLUG_NAME_MAX];   /**< library name */
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  char sym[UPLUG_NAME_MAX];        /**< plugin symbol, or NULL */
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  char config[UPLUG_NAME_MAX];     /**< configuration data */
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void *context;          /**< user context data */
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  char name[UPLUG_NAME_MAX];   /**< name of plugin */
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugLevel  level; /**< level of plugin */
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool   awaitingLoad; /**< TRUE if the plugin is awaiting a load call */
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool   dontUnload; /**< TRUE if plugin must stay resident (leak plugin and lib) */
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UErrorCode pluginStatus; /**< status code of plugin */
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UPLUG_LIBRARY_INITIAL_COUNT 8
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UPLUG_PLUGIN_INITIAL_COUNT 12
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Remove an item
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param list the full list
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param listSize the number of entries in the list
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param memberSize the size of one member
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param itemToRemove the item number of the member
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the new listsize
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t uplug_removeEntryAt(void *list, int32_t listSize, int32_t memberSize, int32_t itemToRemove) {
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint8_t *bytePtr = (uint8_t *)list;
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* get rid of some bad cases first */
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(listSize<1) {
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return listSize;
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* is there anything to move? */
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(listSize > itemToRemove+1) {
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    memmove(bytePtr+(itemToRemove*memberSize), bytePtr+((itemToRemove+1)*memberSize), memberSize);
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return listSize-1;
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_ENABLE_DYLOAD
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Library management. Internal.
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UPlugLibrary;
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Library management. Internal.
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef struct UPlugLibrary {
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void *lib;                           /**< library ptr */
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  char name[UPLUG_NAME_MAX]; /**< library name */
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint32_t ref;                        /**< reference count */
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} UPlugLibrary;
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UPlugLibrary   staticLibraryList[UPLUG_LIBRARY_INITIAL_COUNT];
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UPlugLibrary * libraryList = staticLibraryList;
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t libraryCount = 0;
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t libraryMax = UPLUG_LIBRARY_INITIAL_COUNT;
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Search for a library. Doesn't lock
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param libName libname to search for
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return the library's struct
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t searchForLibraryName(const char *libName) {
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t i;
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=0;i<libraryCount;i++) {
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(!uprv_strcmp(libName, libraryList[i].name)) {
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return i;
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return -1;
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t searchForLibrary(void *lib) {
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t i;
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=0;i<libraryCount;i++) {
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(lib==libraryList[i].lib) {
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return i;
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return -1;
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_INTERNAL char * U_EXPORT2
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_findLibrary(void *lib, UErrorCode *status) {
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t libEnt;
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  char *ret = NULL;
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) {
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  libEnt = searchForLibrary(lib);
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(libEnt!=-1) {
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    ret = libraryList[libEnt].name;
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *status = U_MISSING_RESOURCE_ERROR;
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return ret;
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_INTERNAL void * U_EXPORT2
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_openLibrary(const char *libName, UErrorCode *status) {
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t libEntry = -1;
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void *lib = NULL;
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) return NULL;
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  libEntry = searchForLibraryName(libName);
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(libEntry == -1) {
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    libEntry = libraryCount++;
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(libraryCount >= libraryMax) {
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      /* Ran out of library slots. Statically allocated because we can't depend on allocating memory.. */
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      *status = U_MEMORY_ALLOCATION_ERROR;
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      DBG((stderr, "uplug_openLibrary() - out of library slots (max %d)\n", libraryMax));
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return NULL;
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Some operating systems don't want
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org       DL operations from multiple threads. */
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    libraryList[libEntry].lib = uprv_dl_open(libName, status);
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DBG((stderr, "uplug_openLibrary(%s,%s) libEntry %d, lib %p\n", libName, u_errorName(*status), libEntry, lib));
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(libraryList[libEntry].lib == NULL || U_FAILURE(*status)) {
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      /* cleanup. */
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      libraryList[libEntry].lib = NULL; /* failure with open */
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      libraryList[libEntry].name[0] = 0;
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      DBG((stderr, "uplug_openLibrary(%s,%s) libEntry %d, lib %p\n", libName, u_errorName(*status), libEntry, lib));
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      /* no need to free - just won't increase the count. */
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      libraryCount--;
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else { /* is it still there? */
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      /* link it in */
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      uprv_strncpy(libraryList[libEntry].name,libName,UPLUG_NAME_MAX);
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      libraryList[libEntry].ref=1;
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      lib = libraryList[libEntry].lib;
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    lib = libraryList[libEntry].lib;
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    libraryList[libEntry].ref++;
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return lib;
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_INTERNAL void U_EXPORT2
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_closeLibrary(void *lib, UErrorCode *status) {
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t i;
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DBG((stderr, "uplug_closeLibrary(%p,%s) list %p\n", lib, u_errorName(*status), (void*)libraryList));
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) return;
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=0;i<libraryCount;i++) {
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(lib==libraryList[i].lib) {
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(--(libraryList[i].ref) == 0) {
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uprv_dl_close(libraryList[i].lib, status);
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        libraryCount = uplug_removeEntryAt(libraryList, libraryCount, sizeof(*libraryList), i);
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return;
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  *status = U_INTERNAL_PROGRAM_ERROR; /* could not find the entry! */
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UPlugData pluginList[UPLUG_PLUGIN_INITIAL_COUNT];
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t pluginCount = 0;
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic int32_t uplug_pluginNumber(UPlugData* d) {
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *pastPlug = &pluginList[pluginCount];
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(d<=pluginList) {
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(d>=pastPlug) {
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return pluginCount;
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (d-pluginList)/sizeof(pluginList[0]);
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UPlugData * U_EXPORT2
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_nextPlug(UPlugData *prior) {
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(prior==NULL) {
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return pluginList;
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UPlugData *nextPlug = &prior[1];
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UPlugData *pastPlug = &pluginList[pluginCount];
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(nextPlug>=pastPlug) {
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return NULL;
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return nextPlug;
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Call the plugin with some params
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void uplug_callPlug(UPlugData *plug, UPlugReason reason, UErrorCode *status) {
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugTokenReturn token;
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(plug==NULL||U_FAILURE(*status)) {
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  token = (*(plug->entrypoint))(plug, reason, status);
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(token!=UPLUG_TOKEN) {
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *status = U_INTERNAL_PROGRAM_ERROR;
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void uplug_unloadPlug(UPlugData *plug, UErrorCode *status) {
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(plug->awaitingLoad) {  /* shouldn't happen. Plugin hasn'tbeen loaded yet.*/
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *status = U_INTERNAL_PROGRAM_ERROR;
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_SUCCESS(plug->pluginStatus)) {
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* Don't unload a plug which has a failing load status - means it didn't actually load. */
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uplug_callPlug(plug, UPLUG_REASON_UNLOAD, status);
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void uplug_queryPlug(UPlugData *plug, UErrorCode *status) {
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!plug->awaitingLoad || !(plug->level == UPLUG_LEVEL_UNKNOWN) ) {  /* shouldn't happen. Plugin hasn'tbeen loaded yet.*/
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *status = U_INTERNAL_PROGRAM_ERROR;
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->level = UPLUG_LEVEL_INVALID;
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uplug_callPlug(plug, UPLUG_REASON_QUERY, status);
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_SUCCESS(*status)) {
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(plug->level == UPLUG_LEVEL_INVALID) {
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      plug->pluginStatus = U_PLUGIN_DIDNT_SET_LEVEL;
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      plug->awaitingLoad = FALSE;
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plug->pluginStatus = U_INTERNAL_PROGRAM_ERROR;
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plug->awaitingLoad = FALSE;
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void uplug_loadPlug(UPlugData *plug, UErrorCode *status) {
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!plug->awaitingLoad || (plug->level < UPLUG_LEVEL_LOW) ) {  /* shouldn't happen. Plugin hasn'tbeen loaded yet.*/
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *status = U_INTERNAL_PROGRAM_ERROR;
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uplug_callPlug(plug, UPLUG_REASON_LOAD, status);
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->awaitingLoad = FALSE;
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!U_SUCCESS(*status)) {
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plug->pluginStatus = U_INTERNAL_PROGRAM_ERROR;
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UPlugData *uplug_allocateEmptyPlug(UErrorCode *status)
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *plug = NULL;
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) {
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(pluginCount == UPLUG_PLUGIN_INITIAL_COUNT) {
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *status = U_MEMORY_ALLOCATION_ERROR;
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug = &pluginList[pluginCount++];
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->token = UPLUG_TOKEN;
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->structSize = sizeof(UPlugData);
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->name[0]=0;
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->level = UPLUG_LEVEL_UNKNOWN; /* initialize to null state */
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->awaitingLoad = TRUE;
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->dontUnload = FALSE;
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->pluginStatus = U_ZERO_ERROR;
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->libName[0] = 0;
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->config[0]=0;
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->sym[0]=0;
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->lib=NULL;
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->entrypoint=NULL;
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return plug;
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UPlugData *uplug_allocatePlug(UPlugEntrypoint *entrypoint, const char *config, void *lib, const char *symName,
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     UErrorCode *status) {
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *plug;
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) {
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug = uplug_allocateEmptyPlug(status);
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(config!=NULL) {
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy(plug->config, config, UPLUG_NAME_MAX);
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plug->config[0] = 0;
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(symName!=NULL) {
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy(plug->sym, symName, UPLUG_NAME_MAX);
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plug->sym[0] = 0;
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->entrypoint = entrypoint;
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->lib = lib;
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uplug_queryPlug(plug, status);
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return plug;
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void uplug_deallocatePlug(UPlugData *plug, UErrorCode *status) {
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UErrorCode subStatus = U_ZERO_ERROR;
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!plug->dontUnload) {
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_ENABLE_DYLOAD
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uplug_closeLibrary(plug->lib, &subStatus);
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->lib = NULL;
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_SUCCESS(*status) && U_FAILURE(subStatus)) {
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    *status = subStatus;
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* shift plugins up and decrement count. */
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_SUCCESS(*status)) {
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* all ok- remove. */
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pluginCount = uplug_removeEntryAt(pluginList, pluginCount, sizeof(plug[0]), uplug_pluginNumber(plug));
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* not ok- leave as a message. */
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plug->awaitingLoad=FALSE;
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plug->entrypoint=0;
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plug->dontUnload=TRUE;
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void uplug_doUnloadPlug(UPlugData *plugToRemove, UErrorCode *status) {
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(plugToRemove != NULL) {
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uplug_unloadPlug(plugToRemove, status);
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uplug_deallocatePlug(plugToRemove, status);
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_removePlug(UPlugData *plug, UErrorCode *status)  {
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *cursor = NULL;
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *plugToRemove = NULL;
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) return;
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(cursor=pluginList;cursor!=NULL;) {
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(cursor==plug) {
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      plugToRemove = plug;
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cursor=NULL;
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      cursor = uplug_nextPlug(cursor);
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uplug_doUnloadPlug(plugToRemove, status);
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_setPlugNoUnload(UPlugData *data, UBool dontUnload)
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  data->dontUnload = dontUnload;
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_setPlugLevel(UPlugData *data, UPlugLevel level) {
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  data->level = level;
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UPlugLevel U_EXPORT2
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getPlugLevel(UPlugData *data) {
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return data->level;
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_setPlugName(UPlugData *data, const char *name) {
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uprv_strncpy(data->name, name, UPLUG_NAME_MAX);
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char * U_EXPORT2
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getPlugName(UPlugData *data) {
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return data->name;
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char * U_EXPORT2
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getSymbolName(UPlugData *data) {
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return data->sym;
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char * U_EXPORT2
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getLibraryName(UPlugData *data, UErrorCode *status) {
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(data->libName[0]) {
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return data->libName;
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_ENABLE_DYLOAD
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return uplug_findLibrary(data->lib, status);
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void * U_EXPORT2
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getLibrary(UPlugData *data) {
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return data->lib;
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void * U_EXPORT2
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getContext(UPlugData *data) {
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return data->context;
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_setContext(UPlugData *data, void *context) {
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  data->context = context;
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI const char* U_EXPORT2
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getConfiguration(UPlugData *data) {
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return data->config;
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_INTERNAL UPlugData* U_EXPORT2
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getPlugInternal(int32_t n) {
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(n <0 || n >= pluginCount) {
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return &(pluginList[n]);
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UErrorCode U_EXPORT2
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getPlugLoadStatus(UPlugData *plug) {
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return plug->pluginStatus;
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Initialize a plugin fron an entrypoint and library - but don't load it.
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UPlugData* uplug_initPlugFromEntrypointAndLibrary(UPlugEntrypoint *entrypoint, const char *config, void *lib, const char *sym,
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                                         UErrorCode *status) {
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *plug = NULL;
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug = uplug_allocatePlug(entrypoint, config, lib, sym, status);
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_SUCCESS(*status)) {
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return plug;
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uplug_deallocatePlug(plug, status);
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return NULL;
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UPlugData* U_EXPORT2
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_loadPlugFromEntrypoint(UPlugEntrypoint *entrypoint, const char *config, UErrorCode *status) {
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData* plug = uplug_initPlugFromEntrypointAndLibrary(entrypoint, config, NULL, NULL, status);
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uplug_loadPlug(plug, status);
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return plug;
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_ENABLE_DYLOAD
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UPlugData*
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_initErrorPlug(const char *libName, const char *sym, const char *config, const char *nameOrError, UErrorCode loadStatus, UErrorCode *status)
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *plug = uplug_allocateEmptyPlug(status);
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) return NULL;
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->pluginStatus = loadStatus;
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->awaitingLoad = FALSE; /* Won't load. */
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug->dontUnload = TRUE; /* cannot unload. */
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(sym!=NULL) {
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy(plug->sym, sym, UPLUG_NAME_MAX);
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(libName!=NULL) {
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy(plug->libName, libName, UPLUG_NAME_MAX);
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(nameOrError!=NULL) {
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy(plug->name, nameOrError, UPLUG_NAME_MAX);
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(config!=NULL) {
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy(plug->config, config, UPLUG_NAME_MAX);
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return plug;
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Fetch a plugin from DLL, and then initialize it from a library- but don't load it.
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UPlugData*
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_initPlugFromLibrary(const char *libName, const char *sym, const char *config, UErrorCode *status) {
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void *lib = NULL;
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *plug = NULL;
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) { return NULL; }
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  lib = uplug_openLibrary(libName, status);
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(lib!=NULL && U_SUCCESS(*status)) {
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UPlugEntrypoint *entrypoint = NULL;
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    entrypoint = (UPlugEntrypoint*)uprv_dlsym_func(lib, sym, status);
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(entrypoint!=NULL&&U_SUCCESS(*status)) {
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      plug = uplug_initPlugFromEntrypointAndLibrary(entrypoint, config, lib, sym, status);
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(plug!=NULL&&U_SUCCESS(*status)) {
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        plug->lib = lib; /* plug takes ownership of library */
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        lib = NULL; /* library is now owned by plugin. */
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      UErrorCode subStatus = U_ZERO_ERROR;
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      plug = uplug_initErrorPlug(libName,sym,config,"ERROR: Could not load entrypoint",(lib==NULL)?U_MISSING_RESOURCE_ERROR:*status,&subStatus);
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(lib!=NULL) { /* still need to close the lib */
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      UErrorCode subStatus = U_ZERO_ERROR;
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      uplug_closeLibrary(lib, &subStatus); /* don't care here */
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode subStatus = U_ZERO_ERROR;
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plug = uplug_initErrorPlug(libName,sym,config,"ERROR: could not load library",(lib==NULL)?U_MISSING_RESOURCE_ERROR:*status,&subStatus);
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return plug;
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UPlugData* U_EXPORT2
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_loadPlugFromLibrary(const char *libName, const char *sym, const char *config, UErrorCode *status) {
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *plug = NULL;
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) { return NULL; }
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plug = uplug_initPlugFromLibrary(libName, sym, config, status);
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uplug_loadPlug(plug, status);
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return plug;
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI UPlugLevel U_EXPORT2 uplug_getCurrentLevel() {
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(cmemory_inUse()) {
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return UPLUG_LEVEL_HIGH;
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return UPLUG_LEVEL_LOW;
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic UBool U_CALLCONV uplug_cleanup(void)
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t i;
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugData *pluginToRemove;
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* cleanup plugs */
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=0;i<pluginCount;i++) {
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode subStatus = U_ZERO_ERROR;
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    pluginToRemove = &pluginList[i];
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /* unload and deallocate */
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uplug_doUnloadPlug(pluginToRemove, &subStatus);
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* close other held libs? */
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return TRUE;
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_ENABLE_DYLOAD
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic void uplug_loadWaitingPlugs(UErrorCode *status) {
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t i;
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UPlugLevel currentLevel = uplug_getCurrentLevel();
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) {
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return;
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DBG((stderr,  "uplug_loadWaitingPlugs() Level: %d\n", currentLevel));
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* pass #1: low level plugs */
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=0;i<pluginCount;i++) {
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode subStatus = U_ZERO_ERROR;
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UPlugData *pluginToLoad = &pluginList[i];
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pluginToLoad->awaitingLoad) {
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(pluginToLoad->level == UPLUG_LEVEL_LOW) {
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(currentLevel > UPLUG_LEVEL_LOW) {
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          pluginToLoad->pluginStatus = U_PLUGIN_TOO_HIGH;
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UPlugLevel newLevel;
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          uplug_loadPlug(pluginToLoad, &subStatus);
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          newLevel = uplug_getCurrentLevel();
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          if(newLevel > currentLevel) {
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            pluginToLoad->pluginStatus = U_PLUGIN_CHANGED_LEVEL_WARNING;
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            currentLevel = newLevel;
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pluginToLoad->awaitingLoad = FALSE;
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  for(i=0;i<pluginCount;i++) {
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UErrorCode subStatus = U_ZERO_ERROR;
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UPlugData *pluginToLoad = &pluginList[i];
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(pluginToLoad->awaitingLoad) {
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      if(pluginToLoad->level == UPLUG_LEVEL_INVALID) {
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pluginToLoad->pluginStatus = U_PLUGIN_DIDNT_SET_LEVEL;
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      } else if(pluginToLoad->level == UPLUG_LEVEL_UNKNOWN) {
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        pluginToLoad->pluginStatus = U_INTERNAL_PROGRAM_ERROR;
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      } else {
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        uplug_loadPlug(pluginToLoad, &subStatus);
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      pluginToLoad->awaitingLoad = FALSE;
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DBG((stderr,  " Done Loading Plugs. Level: %d\n", (int32_t)uplug_getCurrentLevel()));
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Name of the plugin config file */
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstatic char plugin_file[2048] = "";
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_INTERNAL const char* U_EXPORT2
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_getPluginFile() {
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_ENABLE_DYLOAD
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return plugin_file;
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return NULL;
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_CAPI void U_EXPORT2
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orguplug_init(UErrorCode *status) {
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !U_ENABLE_DYLOAD
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  (void)status; /* unused */
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const char *plugin_dir;
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(U_FAILURE(*status)) return;
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  plugin_dir = getenv("ICU_PLUGINS");
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(DEFAULT_ICU_PLUGINS)
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(plugin_dir == NULL || !*plugin_dir) {
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    plugin_dir = DEFAULT_ICU_PLUGINS;
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  DBG((stderr, "ICU_PLUGINS=%s\n", plugin_dir));
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(plugin_dir != NULL && *plugin_dir) {
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    FILE *f;
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef OS390BATCH
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* There are potentially a lot of ways to implement a plugin directory on OS390/zOS  */
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* Keeping in mind that unauthorized file access is logged, monitored, and enforced  */
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* I've chosen to open a DDNAME if BATCH and leave it alone for (presumably) UNIX    */
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* System Services.  Alternative techniques might be allocating a member in          */
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* SYS1.PARMLIB or setting an environment variable "ICU_PLUGIN_PATH" (?).  The       */
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* DDNAME can be connected to a file in the HFS if need be.                          */
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy(plugin_file,"//DD:ICUPLUG", 2047);        /* JAM 20 Oct 2011 */
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncpy(plugin_file, plugin_dir, 2047);
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncat(plugin_file, U_FILE_SEP_STRING,2047);
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncat(plugin_file, "icuplugins",2047);
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncat(plugin_file, U_ICU_VERSION_SHORT ,2047);
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uprv_strncat(plugin_file, ".txt" ,2047);
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    DBG((stderr, "pluginfile= %s\n", plugin_file));
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifdef __MVS__
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if (iscics()) /* 12 Nov 2011 JAM */
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        f = NULL;
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    else
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    {
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         f = fopen(plugin_file, "r");
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(f != NULL) {
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      char linebuf[1024];
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      char *p, *libName=NULL, *symName=NULL, *config=NULL;
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      int32_t line = 0;
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      while(fgets(linebuf,1023,f)) {
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        line++;
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        if(!*linebuf || *linebuf=='#') {
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          continue;
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        } else {
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          p = linebuf;
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          while(*p&&isspace((int)*p))
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            p++;
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          if(!*p || *p=='#') continue;
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          libName = p;
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          while(*p&&!isspace((int)*p)) {
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            p++;
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          if(!*p || *p=='#') continue; /* no tab after libname */
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          *p=0; /* end of libname */
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          p++;
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          while(*p&&isspace((int)*p)) {
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            p++;
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          if(!*p||*p=='#') continue; /* no symname after libname +tab */
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          symName = p;
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          while(*p&&!isspace((int)*p)) {
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            p++;
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          if(*p) { /* has config */
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            *p=0;
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            ++p;
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            while(*p&&isspace((int)*p)) {
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              p++;
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(*p) {
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              config = p;
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          /* chop whitespace at the end of the config */
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          if(config!=NULL&&*config!=0) {
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            p = config+strlen(config);
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            while(p>config&&isspace((int)*(--p))) {
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              *p=0;
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          /* OK, we're good. */
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          {
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UErrorCode subStatus = U_ZERO_ERROR;
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UPlugData *plug = uplug_initPlugFromLibrary(libName, symName, config, &subStatus);
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            if(U_FAILURE(subStatus) && U_SUCCESS(*status)) {
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              *status = subStatus;
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            }
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            DBG((stderr, "PLUGIN libName=[%s], sym=[%s], config=[%s]\n", libName, symName, config));
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            DBG((stderr, " -> %p, %s\n", (void*)plug, u_errorName(subStatus)));
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            (void)plug; /* unused */
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          }
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        }
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      }
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      fclose(f);
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else {
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if UPLUG_TRACE
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      DBG((stderr, "Can't open plugin file %s\n", plugin_file));
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uplug_loadWaitingPlugs(status);
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif /* U_ENABLE_DYLOAD */
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  ucln_registerCleanup(UCLN_UPLUG, uplug_cleanup);
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
844