X Strike Force SVN commit: rev 132 - people/jch/xc/programs/mkfontscale
Author: jch
Date: 2003-06-03 12:52:54 -0500 (Tue, 03 Jun 2003)
New Revision: 132
Modified:
people/jch/xc/programs/mkfontscale/list.c
people/jch/xc/programs/mkfontscale/list.h
people/jch/xc/programs/mkfontscale/mkfontscale.c
Log:
Add option -E to mkfontscale, beginnings of -b
Modified: people/jch/xc/programs/mkfontscale/list.h
==============================================================================
--- people/jch/xc/programs/mkfontscale/list.h 2003-06-03 17:51:44 UTC (rev 131)
+++ people/jch/xc/programs/mkfontscale/list.h 2003-06-03 17:52:54 UTC (rev 132)
@@ -21,13 +21,18 @@
*/
/* $XFree86: xc/programs/mkfontscale/list.h,v 1.1 2002/06/05 19:46:04 dawes Exp $ */
+char *dsprintf(char *f, ...);
+
typedef struct _List {
char *value;
struct _List *next;
} ListRec, *ListPtr;
+int listMember(char *elt, ListPtr list);
ListPtr listCons(char *car, ListPtr cdr);
+ListPtr listAdjoin(char *car, ListPtr cdr);
ListPtr listConsF(ListPtr cdr, char *f, ...);
+ListPtr listAdjoinF(ListPtr cdr, char *f, ...);
int listLength(ListPtr list);
ListPtr appendList(ListPtr first, ListPtr second);
ListPtr makeList(char **a, int n, ListPtr old, int begin);
@@ -35,3 +40,16 @@
void destroyList(ListPtr old);
void deepDestroyList(ListPtr old);
+typedef struct _Acell {
+ char *key;
+ char *value;
+ int prio;
+} AcellRec, *AcellPtr;
+
+AcellPtr acell(ListPtr alist);
+AcellPtr assoc(char *key, ListPtr alist);
+ListPtr acons(char *key, char *value, ListPtr alist);
+ListPtr aconsPrio(char *key, char *value, int prio, ListPtr alist);
+
+void destroyAlist(ListPtr old);
+void deepDestroyAlist(ListPtr old);
Modified: people/jch/xc/programs/mkfontscale/mkfontscale.c
==============================================================================
--- people/jch/xc/programs/mkfontscale/mkfontscale.c 2003-06-03 17:51:44 UTC (rev 131)
+++ people/jch/xc/programs/mkfontscale/mkfontscale.c 2003-06-03 17:52:54 UTC (rev 132)
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2002 by Juliusz Chroboczek
+ Copyright (c) 2002-2003 by Juliusz Chroboczek
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -27,6 +27,7 @@
#include <sys/types.h>
#include <dirent.h>
+#include <unistd.h>
#include <X11/fonts/fontenc.h>
#include <freetype/freetype.h>
@@ -38,6 +39,8 @@
#include "list.h"
#include "data.h"
+#define NPREFIX 1024
+
char *encodings_array[] =
{ "iso8859-1", "iso8859-2", "iso8859-3", "iso8859-4", "iso8859-5",
"iso8859-6", "iso8859-7", "iso8859-8", "iso8859-9", "iso8859-10",
@@ -59,7 +62,7 @@
#define countof(_a) (sizeof(_a)/sizeof((_a)[0]))
-int doDirectory(char*);
+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);
@@ -69,6 +72,13 @@
static FT_Library ft_library;
static float bigEncodingFuzz = 0.02;
+static int doScalable;
+static int doBitmaps;
+static int doEncodings;
+static ListPtr encodingsToDo;
+static int reencodeLegacy;
+char *encodingPrefix = NULL;
+
static void
usage(void)
{
@@ -82,14 +92,29 @@
{
int argn;
FT_Error ftrc;
+ int rc;
+ char prefix[NPREFIX + 1];
- outfilename = "fonts.scale";
+ if(getcwd(prefix, NPREFIX - 1) == NULL) {
+ perror("Couldn't get cwd");
+ exit(1);
+ }
+ if(prefix[strlen(prefix) - 1] != '/')
+ strcat(prefix, "/");
+ encodingPrefix = prefix;
+ outfilename = NULL;
+
encodings = makeList(encodings_array, countof(encodings_array), NULL, 0);
extra_encodings = makeList(extra_encodings_array,
countof(extra_encodings_array),
NULL, 0);
+ doBitmaps = 0;
+ doScalable = 1;
+ reencodeLegacy = 1;
+ doEncodings = 0;
+ encodingsToDo = NULL;
argn = 1;
while(argn < argc) {
@@ -105,6 +130,38 @@
}
makeList(&argv[argn + 1], 1, encodings, 0);
argn += 2;
+ } else if(argv[argn][1] == 'p') {
+ if(argn >= argc - 1) {
+ usage();
+ exit(1);
+ }
+ if(strlen(argv[argn + 1]) > NPREFIX - 1) {
+ usage();
+ exit(1);
+ }
+ strcpy(prefix, argv[argn + 1]);
+ if(prefix[strlen(prefix) - 1] != '/')
+ strcat(prefix, "/");
+ argn += 2;
+ } else if(argv[argn][1] == 'E') {
+ if(argn >= argc - 1) {
+ usage();
+ exit(1);
+ }
+ doEncodings = 1;
+ rc = readEncodings(encodingsToDo, argv[argn + 1]);
+ if(rc < 0)
+ exit(1);
+ argn += 2;
+ } else if(argv[argn][1] == 'b') {
+ doBitmaps = !doBitmaps;
+ argn++;
+ } else if(argv[argn][1] == 's') {
+ doScalable = !doScalable;
+ argn++;
+ } else if(argv[argn][1] == 'r') {
+ reencodeLegacy = !reencodeLegacy;
+ argn++;
} else if(argv[argn][1] == 'o') {
if(argn >= argc - 1) {
usage();
@@ -125,6 +182,13 @@
}
}
+ if(outfilename == NULL) {
+ if(doBitmaps)
+ outfilename = "fonts.dir";
+ else
+ outfilename = "fonts.scale";
+ }
+
ftrc = FT_Init_FreeType(&ft_library);
if(ftrc) {
fprintf(stderr, "Could not initialise FreeType library: %d\n", ftrc);
@@ -133,10 +197,10 @@
if (argn == argc)
- doDirectory(".");
+ doDirectory(".", doEncodings, encodingsToDo);
else
while(argn < argc) {
- doDirectory(argv[argn]);
+ doDirectory(argv[argn], doEncodings, encodingsToDo);
argn++;
}
return 0;
@@ -328,17 +392,6 @@
}
}
-static char*
-strcat_reliable(char *a, char *b)
-{
- char *c = malloc(strlen(a) + strlen(b) + 1);
- if(c == NULL)
- return NULL;
- strcpy(c, a);
- strcat(c, b);
- return c;
-}
-
static int
unsafe(char c)
{
@@ -380,7 +433,7 @@
}
int
-doDirectory(char *dirname_given)
+doDirectory(char *dirname_given, int doEncodings, ListPtr encodingsToDo)
{
char *dirname, *fontscale_name, *filename;
FILE *fontscale;
@@ -400,24 +453,45 @@
i = strlen(dirname_given);
if(i == 0)
- dirname = strcat_reliable(".", "/");
+ dirname = dsprintf("./");
else if(dirname_given[i - 1] != '/')
- dirname = strcat_reliable(dirname_given, "/");
+ dirname = dsprintf("%s/", dirname_given);
else
- dirname = strcat_reliable(dirname_given, "");
+ dirname = dsprintf("%s", dirname_given);
if(dirname == NULL) {
perror("dirname");
exit(1);
}
+ if(doEncodings) {
+ char *e = dsprintf("%s%s", dirname, "encodings.dir");
+ FILE *out;
+ ListPtr l;
+
+ 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 %s\n", acell(l)->key, acell(l)->value);
+ }
+ }
+
if(strcmp(outfilename, "-") == 0)
fontscale_name = NULL;
else {
if(outfilename[0] == '/')
- fontscale_name = strcat_reliable(outfilename, "");
+ fontscale_name = dsprintf("%s", outfilename);
else
- fontscale_name = strcat_reliable(dirname, outfilename);
+ fontscale_name = dsprintf("%s%s", dirname, outfilename);
if(fontscale_name == NULL) {
perror("fontscale_name");
exit(1);
@@ -446,13 +520,18 @@
entry = readdir(dirp);
if(entry == NULL)
break;
- filename = strcat_reliable(dirname, entry->d_name);
+ filename = dsprintf("%s%s", dirname, entry->d_name);
ftrc = FT_New_Face(ft_library, filename, 0, &face);
if(ftrc)
continue;
- if((face->face_flags & FT_FACE_FLAG_SCALABLE) == 0)
- continue;
+ if((face->face_flags & FT_FACE_FLAG_SCALABLE) == 0) {
+ if(!doBitmaps)
+ continue;
+ } else {
+ if(!doScalable)
+ continue;
+ }
found = 0;
@@ -881,3 +960,54 @@
return vendor_foundries[i][1];
return NULL;
}
+
+int
+readEncodings(ListPtr encodings, char *dirname)
+{
+ 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';
+
+ dirp = opendir(dirname);
+ if(dirp == NULL) {
+ perror("opendir");
+ return -1;
+ }
+
+ while((file = readdir(dirp)) != NULL) {
+ fullname = dsprintf("%s/%s", dirname, file->d_name);
+ if(fullname == NULL) {
+ fprintf(stderr, "Couldn't allocate fullname\n");
+ return -1;
+ }
+
+ names = FontEncIdentify(fullname);
+ if(!names)
+ continue;
+
+ for(name = names; *name; name++) {
+ if(fullname[0] != '/') {
+ char *n;
+ n = dsprintf("%s%s", encodingPrefix, fullname);
+ if(n == NULL) {
+ fprintf(stderr, "Couldn't allocate name\n");
+ return -1;
+ }
+ free(fullname);
+ fullname = n;
+ }
+ encodingsToDo = acons(fullname, *name, encodingsToDo);
+ if(encodingsToDo == NULL) {
+ fprintf(stderr, "Couldn't allocate encodings\n");
+ return -1;
+ }
+ }
+ free(names); /* only the spine */
+ }
+ return 0;
+}
Modified: people/jch/xc/programs/mkfontscale/list.c
==============================================================================
--- people/jch/xc/programs/mkfontscale/list.c 2003-06-03 17:51:44 UTC (rev 131)
+++ people/jch/xc/programs/mkfontscale/list.c 2003-06-03 17:52:54 UTC (rev 132)
@@ -1,5 +1,5 @@
/*
- Copyright (c) 2002 by Juliusz Chroboczek
+ Copyright (c) 2002-2003 by Juliusz Chroboczek
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
@@ -32,6 +32,17 @@
#include "snprintf.c"
#endif
+int
+listMember(char *elt, ListPtr list)
+{
+ while(list != NULL) {
+ if(strcmp(elt, list->value) == 0)
+ return 1;
+ list = list->next;
+ }
+ return 0;
+}
+
ListPtr
listCons(char *car, ListPtr cdr)
{
@@ -44,6 +55,46 @@
}
ListPtr
+listAdjoin(char *car, ListPtr cdr)
+{
+ ListPtr lcar;
+
+ if(listMember(car, cdr)) {
+ free(car);
+ return cdr;
+ }
+ return listCons(car, cdr);
+}
+
+char *
+dsprintf(char *f, ...)
+{
+ va_list args;
+ char *string;
+ {
+ int n, size = 20;
+ while(1) {
+ if(size > 4096)
+ return NULL;
+ string = malloc(size);
+ if(!string)
+ return NULL;
+ va_start(args, f);
+ n = vsnprintf(string, size, f, args);
+ va_end(args);
+ if(n >= 0 && n < size)
+ return string;
+ else if(n >= size)
+ size = n + 1;
+ else
+ size = size * 3 / 2 + 1;
+ free(string);
+ }
+ }
+}
+
+
+ListPtr
listConsF(ListPtr cdr, char *f, ...)
{
va_list args;
@@ -70,6 +121,33 @@
}
}
+ListPtr
+listAdjoinF(ListPtr cdr, char *f, ...)
+{
+ va_list args;
+ char *string;
+ {
+ int n, size = 20;
+ while(1) {
+ if(size > 4096)
+ return NULL;
+ string = malloc(size);
+ if(!string)
+ return NULL;
+ va_start(args, f);
+ n = vsnprintf(string, size, f, args);
+ va_end(args);
+ if(n >= 0 && n < size)
+ return listAdjoin(string, cdr);
+ else if(n >= size)
+ size = n + 1;
+ else
+ size = size * 3 / 2 + 1;
+ free(string);
+ }
+ }
+}
+
int
listLength(ListPtr list)
{
@@ -176,3 +254,88 @@
}
}
+AcellPtr
+acell(ListPtr alist)
+{
+ return (AcellPtr)alist->value;
+}
+
+AcellPtr
+assoc(char *key, ListPtr alist)
+{
+ ListPtr l;
+ AcellPtr acell;
+ l = alist;
+ while(l) {
+ acell = (AcellPtr)l->value;
+ if(strcmp(acell->key, key) == 0)
+ return acell;
+ l = l->next;
+ }
+ return NULL;
+}
+
+ListPtr
+acons(char *key, char *value, ListPtr alist)
+{
+ AcellPtr acell;
+ acell = malloc(sizeof(AcellRec));
+ if(acell == NULL)
+ return NULL;
+ acell->key = key;
+ acell->value = value;
+ acell->prio = 0;
+ return listCons((char*)acell, alist);
+}
+
+ListPtr
+aconsPrio(char *key, char *value, int prio, ListPtr alist)
+{
+ ListPtr l;
+ AcellPtr acell;
+ l = alist;
+ while(l) {
+ acell = (AcellPtr)l->value;
+ if(strcmp(acell->key, key) == 0)
+ break;
+ l = l->next;
+ }
+ if(l && acell->prio >= prio)
+ return alist;
+
+ acell = malloc(sizeof(AcellRec));
+ if(acell == NULL)
+ return NULL;
+ acell->key = key;
+ acell->value = value;
+ acell->prio = prio;
+ return listCons((char*)acell, alist);
+}
+
+void
+destroyAlist(ListPtr old)
+{
+ return deepDestroyList(old);
+}
+
+void
+deepDestroyAlist(ListPtr old)
+{
+ ListPtr next;
+ AcellPtr acell;
+
+ if(!old)
+ return;
+ next = old->next;
+ while(old) {
+ acell = (AcellPtr)old->value;
+ free(acell->key);
+ free(acell->value);
+ free(acell);
+ free(old);
+ old = next;
+ next = old->next;
+ }
+}
+
+
Reply to: