-n -r -p are documented in man mkfontdir, but "-n" and "-r" aren't implemented in mkfontscale. Thus bug #387 is not complete yet.

Attached is a patch that implements these options in mkfontscale, as well as improving slightly the semantics of mkfontdir. Also fix two pre-processor bugs in X11.tmpl that cause imake warnings.


Kean
Index: config/cf/X11.tmpl
===================================================================
RCS file: /cvs/xc/config/cf/X11.tmpl,v
retrieving revision 1.208
diff -u -r1.208 X11.tmpl
--- config/cf/X11.tmpl  2003/06/27 14:53:08     1.208
+++ config/cf/X11.tmpl  2003/06/30 14:52:33
@@ -3823,7 +3823,7 @@
 #endif
 #endif
 
-#ifndef MakeTblHtmlDoc(file,srcs)
+#ifndef MakeTblHtmlDoc
 #ifdef HTMLroffCmd
 #define MakeTblHtmlDoc(file,srcs)                                      @@\
 file.html: srcs                                                                @@\
@@ -3835,7 +3835,7 @@
 #endif
 #endif
 
-#ifndef MakeEqnHtmlDoc(file,srcs)
+#ifndef MakeEqnHtmlDoc
 #ifdef HTMLroffCmd
 #define MakeEqnHtmlDoc(file,srcs)                                      @@\
 file.html: srcs                                                                @@\
Index: programs/mkfontscale/mkfontscale.c
===================================================================
RCS file: /cvs/xc/programs/mkfontscale/mkfontscale.c,v
retrieving revision 1.7
diff -u -r1.7 mkfontscale.c
--- programs/mkfontscale/mkfontscale.c  2003/06/20 15:49:52     1.7
+++ programs/mkfontscale/mkfontscale.c  2003/06/30 14:52:35
@@ -74,21 +74,24 @@
 
 #define countof(_a) (sizeof(_a)/sizeof((_a)[0]))
 
-int doDirectory(char*, int, ListPtr);
+static int doDirectory(char*, int, ListPtr);
 static int checkEncoding(FT_Face face, char *encoding_name);
 static int checkExtraEncoding(FT_Face face, char *encoding_name, int found);
 static int find_cmap(int type, int pid, int eid, FT_Face face);
 static char* notice_foundry(char *notice);
 static char* vendor_foundry(signed char *vendor);
-int readFontScale(HashTablePtr entries, char *dirname);
+static int readFontScale(HashTablePtr entries, char *dname);
 ListPtr makeXLFD(char *filename, FT_Face face, int);
+static int readEncodings(ListPtr encodings, char *dname);
 
 static FT_Library ft_library;
 static float bigEncodingFuzz = 0.02;
 
+static int relative;
 static int doScalable;
 static int doBitmaps;
-static int doEncodings;
+static int onlyEncodings;
+static int onlyEncodings;
 static ListPtr encodingsToDo;
 static int reencodeLegacy;
 char *encodingPrefix = NULL;
@@ -99,7 +102,7 @@
     fprintf(stderr, 
             "mkfontscale [ -b ] [ -s ] [ -o filename ] \n"
             "            [ -x encoding ] [ -f fuzz ] [ -l ] "
-            "[ -e directory ] [ -p prefix ]\n"
+            "[ -e directory ] [ -p prefix ] [ -n ] [ -r] \n"
             "            [ directory ]...\n");
 }
 
@@ -108,7 +111,7 @@
 {
     int argn;
     FT_Error ftrc;
-    int rc;
+    int rc, ll = 0;
     char prefix[NPREFIX];
 
     if(getcwd(prefix, NPREFIX - 1) == NULL) {
@@ -127,8 +130,9 @@
                                NULL, 0);
     doBitmaps = 0;
     doScalable = 1;
+    onlyEncodings = 0;
+    relative = 0;
     reencodeLegacy = 1;
-    doEncodings = 0;
     encodingsToDo = NULL;
 
     argn = 1;
@@ -161,7 +165,6 @@
                 usage();
                 exit(1);
             }
-            doEncodings = 1;
             rc = readEncodings(encodingsToDo, argv[argn + 1]);
             if(rc < 0)
                 exit(1);
@@ -172,6 +175,12 @@
         } else if(strcmp(argv[argn], "-s") == 0) {
             doScalable = 0;
             argn++;
+        } else if(strcmp(argv[argn], "-n") == 0) {
+            onlyEncodings = 1;
+            argn++;
+        } else if(strcmp(argv[argn], "-r") == 0) {
+            relative = 1;
+            argn++;
         } else if(strcmp(argv[argn], "-l") == 0) {
             reencodeLegacy = !reencodeLegacy;
             argn++;
@@ -209,13 +218,14 @@
         fprintf(stderr, "Could not initialise FreeType library: %d\n", ftrc);
         exit(1);
     }
-        
 
+    ll = listLength(encodingsToDo);
+
     if (argn == argc)
-        doDirectory(".", doEncodings, encodingsToDo);
+        doDirectory(".", ll, encodingsToDo);
     else
         while(argn < argc) {
-            doDirectory(argv[argn], doEncodings, encodingsToDo);
+            doDirectory(argv[argn], ll, encodingsToDo);
             argn++;
         }
     return 0;
@@ -625,10 +635,10 @@
     return xlfd;
 }
 
-int
-readFontScale(HashTablePtr entries, char *dirname)
+static int
+readFontScale(HashTablePtr entries, char *dname)
 {
-    int n = strlen(dirname);
+    int n = strlen(dname);
     char *filename;
     FILE *in;
     int rc, count, i;
@@ -638,10 +648,10 @@
     snprintf(format, 100, "%%%ds %%%d[^\n]\n", 
              MAXFONTFILENAMELEN, MAXFONTNAMELEN);
 
-    if(dirname[n - 1] == '/')
-        filename = dsprintf("%sfonts.scale", dirname);
+    if(dname[n - 1] == '/')
+        filename = dsprintf("%sfonts.scale", dname);
     else
-        filename = dsprintf("%s/fonts.scale", dirname);
+        filename = dsprintf("%s/fonts.scale", dname);
     if(filename == NULL)
         return -1;
 
@@ -655,7 +665,7 @@
 
     rc = fscanf(in, "%d\n", &count);
     if(rc != 1) {
-        fprintf(stderr, "Invalid fonts.scale in %s.\n", dirname);
+        fprintf(stderr, "Invalid fonts.scale in %s.\n", dname);
         fclose(in);
         return -1;
     }
@@ -691,11 +701,11 @@
     return 0;
 }
 
-int
-doDirectory(char *dirname_given, int doEncodings, ListPtr encodingsToDo)
+static int
+doDirectory(char *dirname_given, int numEncodings, ListPtr encodingsToDo)
 {
-    char *dirname, *fontscale_name, *filename;
-    FILE *fontscale;
+    char *dname, *fontscale_name, *filename, *encdir;
+    FILE *fontscale, *encfile;
     DIR *dirp;
     struct dirent *entry;
     FT_Error ftrc;
@@ -704,45 +714,50 @@
     HashTablePtr entries;
     HashBucketPtr *array;
     int i, n, found, rc;
-    int isBitmap;
+    int isBitmap=0;
 
     i = strlen(dirname_given);
     if(i == 0)
-        dirname = dsprintf("./");
+        dname = dsprintf("./");
     else if(dirname_given[i - 1] != '/')
-        dirname = dsprintf("%s/", dirname_given);
+        dname = dsprintf("%s/", dirname_given);
     else
-        dirname = dsprintf("%s", dirname_given);
+        dname = dsprintf("%s", dirname_given);
 
-    if(dirname == NULL) {
+    if(dname == NULL) {
         perror("dirname");
         exit(1);
     }
 
-    if(doEncodings) {
-        char *e = dsprintf("%s%s", dirname, "encodings.dir");
-        FILE *out;
-        ListPtr l;
+    encdir = dsprintf("%s%s", dname, "encodings.dir");
 
-        if(e == NULL) {
-            perror("encodings");
-            exit(1);
-        }
-        unlink(e);
-        out = fopen(e, "w");
-        if(out == NULL) {
-            perror("open(encodings.dir)");
-            exit(1);
-        }
-        fprintf(out, "%d\n", listLength(encodingsToDo));
-        for(l = encodingsToDo; l; l = l->next) {
-            fprintf(out, "%s\n", l->value);
-        }
+    if(encdir == NULL) {
+       perror("encodings");
+       exit(1);
+    }
+    unlink(encdir);
+
+    if (numEncodings) {
+       encfile = fopen(encdir, "w");
+       if(encfile == NULL) {
+           perror("open(encodings.dir)");
+           exit(1);
+       }
+        fprintf(encfile, "%d\n", numEncodings);
+        for(lp = encodingsToDo; lp; lp = lp->next) {
+            fprintf(encfile, "%s\n", lp->value);
+        }
+       fclose (encfile);
+    }
+
+    if (onlyEncodings) {
+       free (dname);
+       return 1;
     }
 
     entries = makeHashTable();
     if(doBitmaps && !doScalable) {
-        readFontScale(entries, dirname);
+        readFontScale(entries, dname);
     }
 
     if(strcmp(outfilename, "-") == 0)
@@ -751,16 +766,16 @@
         if(outfilename[0] == '/')
             fontscale_name = dsprintf("%s", outfilename);
         else
-            fontscale_name = dsprintf("%s%s", dirname, outfilename);
+            fontscale_name = dsprintf("%s%s", dname, outfilename);
         if(fontscale_name == NULL) {
             perror("fontscale_name");
             exit(1);
         }
     }
 
-    dirp = opendir(dirname);
+    dirp = opendir(dname);
     if(dirp == NULL) {
-        fprintf(stderr, "%s: ", dirname);
+        fprintf(stderr, "%s: ", dname);
         perror("opendir");
         return 0;
     }
@@ -780,7 +795,7 @@
         int have_face = 0;
         char *xlfd_name = NULL;
         xlfd = NULL;
-        filename = dsprintf("%s%s", dirname, entry->d_name);
+        filename = dsprintf("%s%s", dname, entry->d_name);
 
         if(doBitmaps)
             rc = bitmapIdentify(filename, &xlfd_name);
@@ -911,7 +926,7 @@
         fclose(fontscale);
         free(fontscale_name);
     }
-    free(dirname);
+    free(dname);
     return 1;
 }
 
@@ -1168,26 +1183,25 @@
     return NULL;
 }
 
-int
-readEncodings(ListPtr encodings, char *dirname)
+static int
+readEncodings(ListPtr encodings, char *dname)
 {
     char *fullname;
-    int slash;
     DIR *dirp;
     struct dirent *file;
     char **names, **name;
 
-    if(strlen(dirname) > 1 && dirname[strlen(dirname) - 1] == '/')
-        dirname[strlen(dirname) - 1] = '\0';
+    if(strlen(dname) > 1 && dname[strlen(dname) - 1] == '/')
+        dname[strlen(dname) - 1] = '\0';
 
-    dirp = opendir(dirname);
+    dirp = opendir(dname);
     if(dirp == NULL) {
         perror("opendir");
         return -1;
     }
 
     while((file = readdir(dirp)) != NULL) {
-        fullname = dsprintf("%s/%s", dirname, file->d_name);
+        fullname = dsprintf("%s/%s", dname, file->d_name);
         if(fullname == NULL) {
             fprintf(stderr, "Couldn't allocate fullname\n");
             closedir(dirp);
@@ -1199,7 +1213,7 @@
             continue;
 
         for(name = names; *name; name++) {
-            if(fullname[0] != '/') {
+            if(fullname[0] != '/' && !relative) {
                 char *n;
                 n = dsprintf("%s%s", encodingPrefix, fullname);
                 if(n == NULL) {

Reply via email to