/* 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 . 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 #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