10
static char *rccCreateFullName(const char *path, const char *filename) {
15
if (filename) return strdup(filename);
16
else return strdup("/");
17
} else if (!filename) return strdup(path);
21
name = (char*)malloc(i+strlen(filename)+2)*sizeof(char));
22
if (!name) return NULL;
24
if ((path[i-1]=='/')||(filename[0]=='/'))
25
sprintf(name, "%s%s", path, filename);
27
sprintf(name, "%s/%s", path, filename);
32
static int rccIsFile(const char *filename) {
36
if (S_ISREG(st.st_mode)) return 1;
40
static char *rccCheckFile(const char *prefix, const char *name) {
43
temp = rccCreateFullName(prefix, name);
44
if ((!temp)||(rccIsFile(temp))) return temp;
50
int rccFS0(const char *fspath, const char *filename, char **prefix, char **name) {
52
struct mntent *fsentry;
56
tmp = strstr(filename, fspath);
57
if (tmp) tmp = filename + strlen(fspath);
59
mtab = setmntent(_PATH_MNTTAB, "r");
62
fsentry = getmntent(mtab);
63
if ((fsentry)&&(fsentry->mnt_dir)) {
64
tmp = strstr(filename, fsentry->mnt_dir);
65
if (tmp) tmp = filename + strlen(fsentry->mnt_dir);
72
if (!tmp) tmp = filename;
75
*prefix = strndup(filename, (tmp-filename));
77
if ((!*name)||(!*prefix)) {
78
if (*name) free(*name);
79
if (*prefix) free(*prefix);
86
int rccFS1(rcc_context *ctx, const char *fspath, char **prefix, char **name) {
89
char *path, *filename;
95
if ((path)&&(filename)) {
96
result = rccCreateFullName(path, filename);
97
if (!result) return -1;
98
} else if (filename) result = filename;
99
else if (path) result = path;
103
// Checking without recoding in case of autodetection
104
if (rccGetOption(ctx, RCC_AUTODETECT_FS_NAMES)) {
105
if (rccIsFile(name)) {
106
if ((path)&&(filename)) *name = result;
107
else if (filename) *name = strdup(filename);
108
else *name = strdup(path);
113
err = rccFS0(fspath, result, &prefix, &name);
114
if ((path)&&(filename)) free(name);
119
char *rccFS2(rcc_context *ctx, iconv_t icnv, const char *prefix, const char *name) {
120
if (icnv == (iconv_t)-1) return NULL;
121
if (icnv == (iconv_t)-2) {
122
strcpy(ctx->tmpbuffer, name);
123
ctx->tmpbuffer[len] = 0;
125
err = rccIConv(ctx, icnv, name, 0);
126
if (err<=0) return NULL;
129
return rccCheckFile(prefix, ctx->tmpbuffer);
132
char *rccFS3(rcc_context *ctx, rcc_language_id language_id, rcc_class_id class_id, const char *prefix, const char *name) {
134
rcc_language *language;
135
iconv_t icnv = ctx->fsiconv;
137
if ((rccGetOption(ctx, RCC_AUTODETECT_FS_NAMES))&&(icnv != (iconv_t)-1)) {
138
result = rccFS2(ctx, icnv, prefix, name);
139
if (result) return result;
142
result = rccFS2(ctx, ctx->iconv_to[class_id], prefix, name);
144
if ((icnv != (iconv_t)-1)||(icnv != (iconv_t)-2)) iconv_close(icnv);
145
ctx->fsiconv = (iconv_t)-1;
149
if (rccGetOption(ctx, RCC_AUTODETECT_FS_NAMES)) {
150
language = ctx->language[language_id];
151
if (language->charset[0]) {
152
for (i=1;(!result);i++) {
153
charset = language->charsets[i];
156
if ((icnv != (iconv_t)-1)&&(icnv != (iconv_t)-2)) iconv_close(icnv);
158
if (strcmp(charset, "UTF-8")&&strcmp(charset, "UTF8")) icnv = (iconv_t)-2;
159
else icnv = iconv_open(charset, "UTF-8");
161
result = rccFS2(ctx, icnv, prefix, name);
165
if (result) ctx->fsiconv = icnv;
167
if ((icnv != (iconv_t)-1)&&(icnv != (iconv_t)-2)) iconv_close(icnv);
168
ctx->fsiconv = (iconv_t)-1;