-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) {