static XIM _XDynamicOpenIM(XLCd lcd, Display *display, XrmDatabase rdb, char *res_name, char *res_class) { XIM im = (XIM)NULL; char lc_dir[BUFSIZE]; char *lc_name; dynamicOpenProcp im_openIM = (dynamicOpenProcp)NULL; int count; XI18NObjectsList objects_list = xi18n_objects_list; lc_name = lcd->core->name; if (_XlcLocaleDirName(lc_dir, BUFSIZE, lc_name) == NULL) return (XIM)0; count = lc_count; for (; count-- > 0; objects_list++) { if (objects_list->type != XIM_OBJECT || strcmp(objects_list->locale_name, lc_name)) continue; if (!open_object (objects_list, lc_dir)) continue; im_openIM = (dynamicOpenProcp)fetch_symbol(objects_list, objects_list->open); if (!im_openIM) continue; im = (*im_openIM)(lcd, display, rdb, res_name, res_class); if (im != (XIM)NULL) { break; } close_object (objects_list); } return (XIM)im; }
XLCd _XlcDynamicLoad(const char *lc_name) { XLCd lcd = (XLCd)NULL; dynamicLoadProc lc_loader = (dynamicLoadProc)NULL; int count; XI18NObjectsList objects_list; char lc_dir[BUFSIZE]; if (lc_name == NULL) return (XLCd)NULL; if (_XlcLocaleDirName(lc_dir, BUFSIZE, (char *)lc_name) == (char*)NULL) return (XLCd)NULL; resolve_object(lc_dir, lc_name); objects_list = xi18n_objects_list; count = lc_count; for (; count-- > 0; objects_list++) { if (objects_list->type != XLC_OBJECT || strcmp(objects_list->locale_name, lc_name)) continue; if (!open_object (objects_list, lc_dir)) continue; lc_loader = (dynamicLoadProc)fetch_symbol (objects_list, objects_list->open); if (!lc_loader) continue; lcd = (*lc_loader)(lc_name); if (lcd != (XLCd)NULL) { break; } close_object (objects_list); } return (XLCd)lcd; }
static Bool _XDynamicUnRegisterIMInstantiateCallback( XLCd lcd, Display *display, XrmDatabase rdb, char *res_name, char *res_class, XIDProc callback, XPointer client_data) { char lc_dir[BUFSIZE]; const char *lc_name; dynamicUnregisterProcp im_unregisterIM = (dynamicUnregisterProcp)NULL; Bool ret_flag = False; int count; XI18NObjectsList objects_list = xi18n_objects_list; #if defined(hpux) int getsyms_cnt, i; struct shl_symbol *symbols; #endif lc_name = lcd->core->name; if (_XlcLocaleDirName(lc_dir, BUFSIZE, lc_name) == NULL) return False; count = lc_count; for (; count-- > 0; objects_list++) { if (objects_list->type != XIM_OBJECT || strcmp(objects_list->locale_name, lc_name)) continue; if (!objects_list->refcount) /* Must already be opened */ continue; im_unregisterIM = (dynamicUnregisterProcp)fetch_symbol(objects_list, objects_list->im_unregister); if (!im_unregisterIM) continue; ret_flag = (*im_unregisterIM)(lcd, display, rdb, res_name, res_class, callback, client_data); if (ret_flag) { close_object (objects_list); /* opened in RegisterIMInstantiateCallback */ break; } } return (Bool)ret_flag; }
static XOM _XDynamicOpenOM(XLCd lcd, Display *display, XrmDatabase rdb, _Xconst char *res_name, _Xconst char *res_class) { XOM om = (XOM)NULL; int count; char lc_dir[BUFSIZE]; char *lc_name; dynamicIOpenProcp om_openOM = (dynamicIOpenProcp)NULL; XI18NObjectsList objects_list = xi18n_objects_list; #if defined(hpux) int getsyms_cnt, i; struct shl_symbol *symbols; #endif lc_name = lcd->core->name; if (_XlcLocaleDirName(lc_dir, BUFSIZE, lc_name) == NULL) return (XOM)0; count = lc_count; for (; count-- > 0; objects_list++) { if (objects_list->type != XOM_OBJECT || strcmp(objects_list->locale_name, lc_name)) continue; if (!open_object (objects_list, lc_dir)) continue; om_openOM = (dynamicIOpenProcp)fetch_symbol(objects_list, objects_list->open); if (!om_openOM) continue; om = (*om_openOM)(lcd, display, rdb, res_name, res_class); if (om != (XOM)NULL) { break; } close_object(objects_list); } return (XOM)om; }