diff options
Diffstat (limited to 'Build/source/texk/kpathsea/win32/getdestdir.c')
-rw-r--r-- | Build/source/texk/kpathsea/win32/getdestdir.c | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/Build/source/texk/kpathsea/win32/getdestdir.c b/Build/source/texk/kpathsea/win32/getdestdir.c new file mode 100644 index 00000000000..7fd78dc4f7f --- /dev/null +++ b/Build/source/texk/kpathsea/win32/getdestdir.c @@ -0,0 +1,248 @@ +/* getdestdir.c + + Copyright 2000, 2016 Akira Kakuto. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with this library; if not, see <http://www.gnu.org/licenses/>. + + from mktexmf: + argv[0] = "Dummy", argv[1] = "source", argv[2] = path + from mktexpk: + argv[0] = "Dummy", argv[1] = "pk", argv[2] = path, argv[3] = mode + from mktextfm: + argv[0] = "Dummy", argv[1] = "tfm", argv[2] = path +*/ + +#include <kpathsea/kpathsea.h> +#include "mktex.h" + +#define NUMBUF 32 +#define LENBUF 128 +#define MPATH 256 +#define FTOP "fonts" + +/* error message */ +static void +fatal (const char *s) +{ + fprintf (stderr, "%s\n", s); +} + +char * +getdestdir (int ac, char **av) +{ + static char buff[MPATH]; + char *pb[NUMBUF]; + char *p, *q; + char spec[32]; + int i, Num = 0, ispk, k; + char *topdir; + + ispk = 0; + + for (i = 0; i < NUMBUF; i++) { + if (!(pb[i] = (char *) malloc (LENBUF))) { + fatal ("Memory allocation error."); + return (NULL); + } + } + + if (ac != 3 && ac != 4) { + fatal ("Argument error."); + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + return (NULL); + } + + strcpy (spec, av[1]); + + normalize (av[2]); /* path */ + + p = av[2]; + q = buff; + +/* UNC name support */ + + if (p[0] == '/' && p[1] == '/') { + *q++ = *p++; + *q++ = *p++; + } + + while (*p) { + if (*p == '/') { + *q = *p; + while (*p == '/') + p++; + p--; + } else { + *q = *p; + } + p++; + q++; + } + *q = '\0'; /* now path name of ${name}.mf is in buff. */ +/* +#ifdef TEST + return xstrdup(buff); +#endif +*/ + if (ac == 4) + ispk = 1; /* called from mktexpk */ + + if (!(p = strrchr (buff, '/'))) { + fatal ("Invalid path name."); + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + return (NULL); + } + + *p = '\0'; /* get directory name */ + + for (i = 0; i < NUMBUF; i++) { + if (!(p = strrchr (buff, '/'))) { + fatal ("Invalid path name."); + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + return (NULL); + } + *p = '\0'; + p++; + strcpy (pb[i], p); + if (!stricmp (pb[i], FTOP)) { + Num = i; + break; + } + } + + Num -= 2; + if (Num < 0) { + fprintf (stderr, "Font resources should be under a directory "); + fprintf (stderr, "with the name \"fonts\".\n"); + fprintf (stderr, "Furthermore, there must be at least two directories "); + fprintf (stderr, "under the directory \"fonts\".\n"); + fatal ("Invalid path name."); + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + return (NULL); + } + + topdir = kpse_var_value ("MAKETEXPK_TOP_DIR"); + if (topdir && *topdir && ispk) { + normalize (topdir); + i = (int)strlen (topdir); + while(topdir[i - 1] == '/') + i--; + topdir[i] = '\0'; + + if(!is_dir(topdir)) { + if(make_dir_p(topdir)) { + fprintf(stderr, "Failed to access %s.\n", topdir); + return NULL; + } + } +#ifdef TEST + printf ("%s\n", topdir); +#endif + if (strnicmp (&topdir[i - 3], "/pk", 3) != 0) { + strcat (topdir, "/pk"); + if (!is_dir(topdir)) { + if (make_dir(topdir)) { + fprintf(stderr, "Faild to access %s.\n", topdir); + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + return (NULL); + } + } + } + strcpy (buff, topdir); + free(topdir); + } else { + if((topdir = kpse_var_value("TEXMFVAR")) != NULL) { + normalize (topdir); + i = (int)strlen (topdir); + while(topdir[i - 1] == '/') + i--; + topdir[i] = '\0'; + + if(!is_dir(topdir)) { + if(make_dir_p(topdir)) { + fprintf(stderr, "Failed to access %s.\n", topdir); + return NULL; + } + } + + strcpy(buff, topdir); + free(topdir); + } + + strcat (buff, "/fonts"); + if (!is_dir (buff)) { + if (make_dir (buff)) { + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + return (NULL); + } + } + strcat (buff, "/"); + strcat (buff, spec); + if (!is_dir (buff)) { + if (make_dir (buff)) { + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + return (NULL); + } + } + } + + if (ispk) { + strcat (buff, "/"); + strcat (buff, av[3]); + if (!is_dir (buff)) { + if (make_dir (buff)) { + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + return (NULL); + } + } + } + + for (i = Num; i > -1; i--) { + strcat (buff, "/"); + strcat (buff, pb[i]); + if (is_dir (buff)) + continue; + else { + if (make_dir (buff)) { + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + return (NULL); + } + } + } + + for (k = 0; k < NUMBUF; k++) + free (pb[k]); + + p = xstrdup(buff); + return p; +} + +#ifdef TEST +int +main (int ac, char *av[]) +{ + kpse_set_program_name (av[0], "getdestdir"); + printf ("%s", getdestdir (ac, av)); + return 0; +} +#endif |