[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: