1 #include <kpathsea/kpathsea.h>
2 
3 #include "mktexupd.h"
4 
5 #define  MBUF     128
6 #define  SBUF     256
7 #define  LBUF     512
8 #define  DBS      "TEXMFDBS"
9 #define  MAXTREE  16
10 
11 void
mktexupd(char * s)12 mktexupd (char *s)
13 {
14   char fname[MBUF];
15   char lsrname[SBUF];
16   char path[LBUF];
17   char *rootdir[MAXTREE];
18   int i, j, treenum;
19   char *pa, *pb, *pc;
20   int existflag = 0;
21   FILE *f;
22 
23   pa = kpse_var_value (DBS);
24   if (pa == NULL) {
25     fprintf (stderr, "No definition of TEXMFDBS.\n");
26     fprintf (stderr, "Maybe you are not using ls-R.\n");
27     return;
28   }
29 
30   pb = kpse_brace_expand (pa);
31   free (pa);
32   if (pb == NULL) {
33     fprintf (stderr, "I cannot expand braces in TEXMFDBS.\n");
34     fprintf (stderr, "Maybe you are not using ls-R.\n");
35     return;
36   }
37 
38   for (i = 0; i < MAXTREE; i++)
39     rootdir[i] = (char *) malloc (MBUF);
40 
41   pa = pb;
42   i = 0;
43 
44   while (*pa && i < MAXTREE) {
45     if (*pa == '!' && *(pa + 1) == '!') {
46       pa++;
47       pa++;
48     }
49     pc = rootdir[i];
50     while (*pa != ';' && *pa)
51       *pc++ = *pa++;
52     *pc = '\0';
53     if (*pa == ';') {
54       pa++;
55       i++;
56     }
57   }
58 
59   i++;
60   treenum = i;
61   free (pb);
62 
63   for (i = 0; i < treenum; i++) {
64     j = strlen (rootdir[i]);
65     if (rootdir[i][j - 1] == '/')
66       rootdir[i][j - 1] = '\0';
67   }
68 
69   strcpy (path, s);
70   pa = strrchr (path, '/');
71   if (pa == NULL) {
72     fprintf (stderr, "Path name of the file may be incorrect.\n");
73     for (i = 0; i < MAXTREE; i++)
74       free (rootdir[i]);
75     return;
76   }
77 
78   *pa = '\0';
79   pa++;
80   strcpy (fname, pa);
81 
82   for (i = 0; i < treenum; i++) {
83     j = strlen (rootdir[i]);
84     if (j && strnicmp (path, rootdir[i], j) == 0) {
85       existflag = 1;
86       break;
87     }
88   }
89 
90   if (existflag) {
91     strcpy (lsrname, rootdir[i]);
92     strcat (lsrname, "/ls-R");
93     if (_access (lsrname, 0) != 0) {
94       for (j = 0; j < MAXTREE; j++)
95         free (rootdir[j]);
96       return;
97     }
98     pa = path;
99     pb = rootdir[i];
100     while (tolower (*pa) == tolower (*pb) && *pb) {
101       pa++;
102       pb++;
103     }
104     f = fopen (lsrname, "ab");
105     fprintf (f, "\n.%s:\n%s\n", pa, fname);
106     fclose (f);
107   } else {
108     fprintf(stderr, "mktexupd failed\n");
109   }
110   for (i = 0; i < MAXTREE; i++)
111     free (rootdir[i]);
112 }
113