int _XlcResolveI18NPath(char *buf, int buf_len) { if (buf != NULL) { xlocaledir(buf, buf_len); } return 1; }
char * _XlcFileName( XLCd lcd, const char *category) { char *siname; char cat[XLC_BUFSIZE], dir[XLC_BUFSIZE]; int i, n; char *args[NUM_LOCALEDIR]; char *file_name = NULL; if (lcd == (XLCd)NULL) return NULL; siname = XLC_PUBLIC(lcd, siname); if (category) lowercase(cat, category); else cat[0] = '\0'; xlocaledir(dir,XLC_BUFSIZE); n = _XlcParsePath(dir, args, NUM_LOCALEDIR); for (i = 0; i < n; ++i) { char buf[PATH_MAX], *name; if (args[i] == NULL) continue; name = NULL; if (snprintf(buf, PATH_MAX, "%s/%s.dir", args[i], cat) < PATH_MAX) { name = resolve_name(siname, buf, RtoL); } if (name == NULL) { continue; } if (*name == '/') { /* supposed to be absolute path name */ file_name = name; } else { if (snprintf(buf, PATH_MAX, "%s/%s", args[i], name) < PATH_MAX) file_name = strdup(buf); else file_name = NULL; Xfree(name); } if (file_name && isreadable(file_name)) { break; } Xfree(file_name); file_name = NULL; /* Then, try with next dir */ } return file_name; }
char * _XlcFileName( XLCd lcd, const char *category) { char *siname; char cat[XLC_BUFSIZE], dir[XLC_BUFSIZE]; int i, n; char *args[NUM_LOCALEDIR]; char *file_name = NULL; if (lcd == (XLCd)NULL) return NULL; siname = XLC_PUBLIC(lcd, siname); lowercase(cat, category); xlocaledir(dir,XLC_BUFSIZE); n = _XlcParsePath(dir, args, NUM_LOCALEDIR); for (i = 0; i < n; ++i) { char buf[PATH_MAX], *name; name = NULL; if ((5 + (args[i] ? strlen (args[i]) : 0) + (cat ? strlen (cat) : 0)) < PATH_MAX) { sprintf(buf, "%s/%s.dir", args[i], cat); name = resolve_name(siname, buf, RtoL); } if (name == NULL) { continue; } if (*name == '/') { /* supposed to be absolute path name */ file_name = name; } else { file_name = Xmalloc(2 + (args[i] ? strlen (args[i]) : 0) + (name ? strlen (name) : 0)); if (file_name != NULL) sprintf(file_name, "%s/%s", args[i], name); Xfree(name); } if (isreadable(file_name)) { break; } Xfree(file_name); file_name = NULL; /* Then, try with next dir */ } return file_name; }
char * _XlcLocaleDirName(char *dir_name, size_t dir_len, const char *lc_name) { char dir[PATH_MAX], buf[PATH_MAX]; int i, n; char *args[NUM_LOCALEDIR]; static char locale_alias[] = LOCALE_ALIAS; char *target_name = NULL; char *target_dir = NULL; char *nlc_name = NULL; static char* last_dir_name = 0; static size_t last_dir_len = 0; static char* last_lc_name = 0; if (last_lc_name != 0 && strcmp (last_lc_name, lc_name) == 0 && dir_len >= last_dir_len) { strcpy (dir_name, last_dir_name); return dir_name; } xlocaledir (dir, PATH_MAX); n = _XlcParsePath(dir, args, NUM_LOCALEDIR); for (i = 0; i < n; ++i) { char *name = NULL; if (args[i] == NULL) continue; if (snprintf (buf, PATH_MAX, "%s/%s", args[i], locale_alias) < PATH_MAX) { name = resolve_name(lc_name, buf, LtoR); if (!name) { if (!nlc_name) nlc_name = normalize_lcname(lc_name); if (nlc_name) name = resolve_name (nlc_name, buf, LtoR); } } /* look at locale.dir */ target_dir = args[i]; if (snprintf(buf, PATH_MAX, "%s/locale.dir", target_dir) < PATH_MAX) { /* If name is not an alias, use lc_name for locale.dir search */ target_name = resolve_name(name ? name : lc_name, buf, RtoL); } Xfree(name); name = NULL; if (target_name != NULL) { char *p = 0; if ((p = strstr(target_name, "/XLC_LOCALE"))) { *p = '\0'; break; } Xfree(target_name); target_name = NULL; } } Xfree(nlc_name); if (target_name == NULL) /* vendor locale name == Xlocale name, no expansion of alias */ snprintf(dir_name, dir_len, "%s/%s", args[0], lc_name); else snprintf(dir_name, dir_len, "%s/%s", target_dir, target_name); Xfree(target_name); Xfree (last_dir_name); Xfree (last_lc_name); last_dir_len = strlen (dir_name) + 1; last_dir_name = Xmalloc (last_dir_len); strcpy (last_dir_name, dir_name); last_lc_name = strdup (lc_name); return dir_name; }
int _XlcResolveLocaleName( const char* lc_name, XLCdPublicPart* pub) { char dir[PATH_MAX], buf[PATH_MAX], *name = NULL; char *dst; int i, n, sinamelen; char *args[NUM_LOCALEDIR]; static const char locale_alias[] = LOCALE_ALIAS; char *tmp_siname; char *nlc_name = NULL; xlocaledir (dir, PATH_MAX); n = _XlcParsePath(dir, args, NUM_LOCALEDIR); for (i = 0; i < n; ++i) { if (args[i] == NULL) continue; if (snprintf (buf, PATH_MAX, "%s/%s", args[i], locale_alias) < PATH_MAX) { name = resolve_name (lc_name, buf, LtoR); if (!name) { if (!nlc_name) nlc_name = normalize_lcname(lc_name); if (nlc_name) name = resolve_name (nlc_name, buf, LtoR); } } if (name != NULL) { break; } } Xfree(nlc_name); if (name == NULL) { /* vendor locale name == Xlocale name, no expansion of alias */ pub->siname = strdup (lc_name); } else { pub->siname = name; } sinamelen = strlen (pub->siname); if (sinamelen == 1 && pub->siname[0] == 'C') { pub->language = pub->siname; pub->territory = pub->codeset = NULL; return 1; } /* * pub->siname is in the format <lang>_<terr>.<codeset>, typical would * be "en_US.ISO8859-1", "en_US.utf8", "ru_RU.KOI-8", or ja_JP.SJIS, * although it could be ja.SJIS too. */ tmp_siname = Xrealloc (pub->siname, 2 * (sinamelen + 1)); if (tmp_siname == NULL) { return 0; } pub->siname = tmp_siname; /* language */ dst = &pub->siname[sinamelen + 1]; strcpy (dst, pub->siname); pub->language = dst; /* territory */ dst = strchr (dst, '_'); if (dst) { *dst = '\0'; pub->territory = ++dst; } else dst = &pub->siname[sinamelen + 1]; /* codeset */ dst = strchr (dst, '.'); if (dst) { *dst = '\0'; pub->codeset = ++dst; } return (pub->siname[0] != '\0') ? 1 : 0; }
char * _XlcLocaleDirName(char *dir_name, size_t dir_len, char *lc_name) { char dir[PATH_MAX], buf[PATH_MAX], *name = NULL; int i, n; char *args[NUM_LOCALEDIR]; static char locale_alias[] = LOCALE_ALIAS; char *target_name = (char*)0; char *target_dir = (char*)0; char *nlc_name = NULL; static char* last_dir_name = 0; static size_t last_dir_len = 0; static char* last_lc_name = 0; if (last_lc_name != 0 && strcmp (last_lc_name, lc_name) == 0 && dir_len >= last_dir_len) { strcpy (dir_name, last_dir_name); return dir_name; } xlocaledir (dir, PATH_MAX); n = _XlcParsePath(dir, args, 256); for (i = 0; i < n; ++i) { if ((2 + (args[i] ? strlen(args[i]) : 0) + strlen(locale_alias)) < PATH_MAX) { sprintf (buf, "%s/%s", args[i], locale_alias); name = resolve_name(lc_name, buf, LtoR); if (!name) { if (!nlc_name) nlc_name = normalize_lcname(lc_name); if (nlc_name) name = resolve_name (nlc_name, buf, LtoR); } } /* If name is not an alias, use lc_name for locale.dir search */ if (name == NULL) name = lc_name; /* look at locale.dir */ target_dir = args[i]; if (!target_dir) { /* something wrong */ if (name != lc_name) Xfree(name); continue; } if ((1 + (target_dir ? strlen (target_dir) : 0) + strlen("locale.dir")) < PATH_MAX) { sprintf(buf, "%s/locale.dir", target_dir); target_name = resolve_name(name, buf, RtoL); } if (name != lc_name) Xfree(name); if (target_name != NULL) { char *p = 0; if ((p = strstr(target_name, "/XLC_LOCALE"))) { *p = '\0'; break; } Xfree(target_name); target_name = NULL; } name = NULL; } if (nlc_name) Xfree(nlc_name); if (target_name == NULL) { /* vendor locale name == Xlocale name, no expansion of alias */ target_dir = args[0]; target_name = lc_name; } /* snprintf(dir_name, dir_len, "%s/%", target_dir, target_name); */ strncpy(dir_name, target_dir, dir_len - 1); if (strlen(target_dir) >= dir_len - 1) { dir_name[dir_len - 1] = '\0'; } else { strcat(dir_name, "/"); strncat(dir_name, target_name, dir_len - strlen(dir_name) - 1); if (strlen(target_name) >= dir_len - strlen(dir_name) - 1) dir_name[dir_len - 1] = '\0'; } if (target_name != lc_name) Xfree(target_name); if (last_dir_name != 0) Xfree (last_dir_name); if (last_lc_name != 0) Xfree (last_lc_name); last_dir_len = strlen (dir_name) + 1; last_dir_name = Xmalloc (last_dir_len); strcpy (last_dir_name, dir_name); last_lc_name = Xmalloc (strlen (lc_name) + 1); strcpy (last_lc_name, lc_name); return dir_name; }