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