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