diff options
Diffstat (limited to 'src/fs.c')
-rw-r--r-- | src/fs.c | 75 |
1 files changed, 55 insertions, 20 deletions
@@ -64,29 +64,45 @@ static char *rccCheckFile(const char *prefix, const char *name) { } /* Converts: 'filename' to 'prefix/name' using 'fspath' */ -int rccFS0(const char *fspath, const char *filename, char **prefix, char **name) { +int rccFS0(rcc_context ctx, const char *fspath, const char *filename, char **prefix, char **name) { FILE *mtab; struct mntent *fsentry; - const char *tmp; + const char *tmp = NULL; + size_t len; if (fspath) { - tmp = strstr(filename, fspath); - if (tmp) tmp = filename + strlen(fspath); + len = strlen(fspath); + if (!len) return 1; + + if (!strncmp(filename, fspath, len)) tmp = filename + strlen(fspath); } else { - mtab = setmntent(_PATH_MNTTAB, "r"); + /* only required with non-english mount directories */ + len = strlen(ctx->lastprefix); + if ((len)&&(!strncmp(filename, ctx->lastprefix, len))) { + tmp = filename + len; + } + + if (tmp) mtab = NULL; + else mtab = setmntent(_PATH_MNTTAB, "r"); if (mtab) { while (!feof(mtab)) { fsentry = getmntent(mtab); if ((fsentry)&&(fsentry->mnt_dir)) { - tmp = strstr(filename, fsentry->mnt_dir); - if (tmp) tmp = filename + strlen(fsentry->mnt_dir); + len = strlen(fsentry->mnt_dir); + if (len) { + if (!strncmp(filename, fsentry->mnt_dir, len)) { + tmp = filename + len; + if (len<RCC_MAX_PREFIX_CHARS) strcpy(ctx->lastprefix, fsentry->mnt_dir); + break; + } + } } } endmntent(mtab); } } - if (!tmp) tmp = filename; + if (!tmp) return 1; *name = strdup(tmp); *prefix = strndup(filename, (tmp-filename)); @@ -100,7 +116,13 @@ int rccFS0(const char *fspath, const char *filename, char **prefix, char **name) return 0; } -/* Normalizes 'prefix/name' using 'fspath' */ +/* Normalizes 'prefix/name' using 'fspath' +returns: + -1 Error + 0 Okey + bit 1 Exact Match + bit 2 Memory cleanup isn't required +*/ int rccFS1(rcc_context ctx, const char *fspath, char **prefix, char **name) { int err; int prefix_size; @@ -122,17 +144,27 @@ int rccFS1(rcc_context ctx, const char *fspath, char **prefix, char **name) { // Checking without recoding in case of autodetection if (rccGetOption(ctx, RCC_AUTODETECT_FS_NAMES)) { if (rccIsFile(result)) { - if ((path)&&(filename)) *name = result; - else if (filename) *name = strdup(filename); - else *name = strdup(path); - return 1; + *prefix = NULL; + *name = result; + + if ((path)&&(filename)) return 1; + return 3; } } + + puts("--"); + if (rccFS0(ctx, fspath, result, prefix, name)) { + *prefix = NULL; + *name = result; + + if ((path)&&(filename)) return 0; + return 2; + } + puts("++"); - err = rccFS0(fspath, result, prefix, name); - if ((path)&&(filename)) free(name); + if ((path)&&(filename)) free(result); - return err; + return 0; } /* Checks if 'prefix/name' is accessible using 'icnv' recoding. In case of @@ -142,12 +174,15 @@ const char *rccFS2(rcc_context ctx, iconv_t icnv, const char *prefix, const char if (icnv == (iconv_t)-1) return NULL; if (icnv == (iconv_t)-2) { - strcpy(ctx->tmpbuffer, name); + puts("-1"); + strncpy(ctx->tmpbuffer, name, RCC_MAX_STRING_CHARS); + ctx->tmpbuffer[RCC_MAX_STRING_CHARS] = 0; } else { + puts("-2"); err = rccIConv(ctx, icnv, name, 0); if (err<=0) return NULL; } - + puts("ok"); return rccCheckFile(prefix, ctx->tmpbuffer); } @@ -167,7 +202,7 @@ const char *rccFS3(rcc_context ctx, rcc_language_id language_id, rcc_class_id cl result = rccFS2(ctx, ctx->iconv_to[class_id], prefix, name); if (result) { - if ((icnv != (iconv_t)-1)||(icnv != (iconv_t)-2)) iconv_close(icnv); + if ((icnv != (iconv_t)-1)&&(icnv != (iconv_t)-2)) iconv_close(icnv); ctx->fsiconv = (iconv_t)-1; return result; } @@ -181,7 +216,7 @@ const char *rccFS3(rcc_context ctx, rcc_language_id language_id, rcc_class_id cl if ((icnv != (iconv_t)-1)&&(icnv != (iconv_t)-2)) iconv_close(icnv); - if (strcmp(charset, "UTF-8")&&strcmp(charset, "UTF8")) icnv = (iconv_t)-2; + if ((!strcmp(charset, "UTF-8"))||(!strcmp(charset, "UTF8"))) icnv = (iconv_t)-2; else icnv = iconv_open(charset, "UTF-8"); result = rccFS2(ctx, icnv, prefix, name); |