diff options
-rw-r--r-- | constlist.c | 24 | ||||
-rw-r--r-- | hash.c | 62 | ||||
-rw-r--r-- | ident.c | 270 | ||||
-rw-r--r-- | list.c | 164 | ||||
-rw-r--r-- | mkfontscale.c | 833 |
5 files changed, 724 insertions, 629 deletions
diff --git a/constlist.c b/constlist.c index b57fc97..bdff352 100644 --- a/constlist.c +++ b/constlist.c @@ -29,13 +29,13 @@ appendConstList(ConstListPtr first, ConstListPtr second) { ConstListPtr current; - if(second == NULL) + if (second == NULL) return first; - if(first == NULL) + if (first == NULL) return second; - for(current = first; current->next; current = current->next) + for (current = first; current->next; current = current->next) ; current->next = second; @@ -48,20 +48,20 @@ makeConstList(const char **a, int n, ConstListPtr old, int begin) ConstListPtr first, current, next; int i; - if(n == 0) + if (n == 0) return old; first = malloc(sizeof(ConstListRec)); - if(!first) + if (!first) return NULL; first->value = a[0]; first->next = NULL; current = first; - for(i = 1; i < n; i++) { + for (i = 1; i < n; i++) { next = malloc(sizeof(ConstListRec)); - if(!next) { + if (!next) { destroyConstList(first); return NULL; } @@ -71,10 +71,11 @@ makeConstList(const char **a, int n, ConstListPtr old, int begin) current->next = next; current = next; } - if(begin) { + if (begin) { current->next = old; return first; - } else { + } + else { return appendConstList(old, first); } } @@ -83,9 +84,10 @@ void destroyConstList(ConstListPtr old) { ConstListPtr next; - if(!old) + + if (!old) return; - while(old) { + while (old) { next = old->next; free(old); old = next; @@ -39,15 +39,16 @@ hash(const char *string) { int i; unsigned u = 0; - for(i = 0; string[i] != '\0'; i++) - u = (u<<5) + (u >> (LOG2_NUMBUCKETS - 5)) + (unsigned char)string[i]; + + for (i = 0; string[i] != '\0'; i++) + u = (u << 5) + (u >> (LOG2_NUMBUCKETS - 5)) + (unsigned char) string[i]; return (u & (NUMBUCKETS - 1)); } static void str_tolower(char *s) { - while(*s != '\0') { + while (*s != '\0') { *s = tolower(*s); s++; } @@ -65,8 +66,8 @@ destroyHashTable(HashTablePtr table) int i; HashBucketPtr bp; - for(i = 0; i < NUMBUCKETS; i++) { - while(table[i]) { + for (i = 0; i < NUMBUCKETS; i++) { + while (table[i]) { bp = table[i]; table[i] = table[i]->next; free(bp->key); @@ -82,8 +83,9 @@ getHash(HashTablePtr table, const char *key) { unsigned int i = hash(key); HashBucketPtr bp; - for(bp = table[i]; bp; bp = bp->next) { - if(strcasecmp(bp->key, key) == 0) + + for (bp = table[i]; bp; bp = bp->next) { + if (strcasecmp(bp->key, key) == 0) return bp->value; } return NULL; @@ -95,14 +97,17 @@ putHash(HashTablePtr table, char *key, char *value, int prio) unsigned int i = hash(key); char *keycopy = NULL, *valuecopy = NULL; HashBucketPtr bp; - for(bp = table[i]; bp; bp = bp->next) { - if(strcasecmp(bp->key, key) == 0) { - if(prio > bp->prio) { + + for (bp = table[i]; bp; bp = bp->next) { + if (strcasecmp(bp->key, key) == 0) { + if (prio > bp->prio) { keycopy = strdup(key); - if(keycopy == NULL) goto fail; + if (keycopy == NULL) + goto fail; str_tolower(keycopy); valuecopy = strdup(value); - if(valuecopy == NULL) goto fail; + if (valuecopy == NULL) + goto fail; free(bp->key); free(bp->value); bp->key = keycopy; @@ -112,14 +117,14 @@ putHash(HashTablePtr table, char *key, char *value, int prio) } } keycopy = strdup(key); - if(keycopy == NULL) + if (keycopy == NULL) goto fail; str_tolower(keycopy); valuecopy = strdup(value); - if(valuecopy == NULL) + if (valuecopy == NULL) goto fail; bp = malloc(sizeof(HashBucketRec)); - if(bp == NULL) + if (bp == NULL) goto fail; bp->key = keycopy; bp->value = valuecopy; @@ -129,8 +134,10 @@ putHash(HashTablePtr table, char *key, char *value, int prio) return 1; fail: - if(keycopy) free(keycopy); - if(valuecopy) free(valuecopy); + if (keycopy) + free(keycopy); + if (valuecopy) + free(valuecopy); return -1; } @@ -141,8 +148,8 @@ hashElements(HashTablePtr table) HashBucketPtr bp; n = 0; - for(i = 0; i < NUMBUCKETS; i++) { - for(bp = table[i]; bp; bp = bp->next) { + for (i = 0; i < NUMBUCKETS; i++) { + for (bp = table[i]; bp; bp = bp->next) { n++; } } @@ -154,7 +161,9 @@ key_first_cmp(const void *v1, const void *v2) { const HashBucketPtr *b1 = v1, *b2 = v2; int c1 = strcasecmp((*b1)->key, (*b2)->key); - if(c1 != 0) return c1; + + if (c1 != 0) + return c1; return strcmp((*b1)->value, (*b2)->value); } @@ -163,7 +172,9 @@ value_first_cmp(const void *v1, const void *v2) { const HashBucketPtr *b1 = v1, *b2 = v2; int c1 = strcmp((*b1)->value, (*b2)->value); - if(c1 != 0) return c1; + + if (c1 != 0) + return c1; return strcasecmp((*b1)->key, (*b2)->key); } @@ -175,12 +186,12 @@ hashArray(HashTablePtr table, int value_first) n = hashElements(table); dst = malloc((n + 1) * sizeof(HashBucketPtr)); - if(dst == NULL) + if (dst == NULL) return NULL; j = 0; - for(i = 0; i < NUMBUCKETS; i++) { - while(table[i]) { + for (i = 0; i < NUMBUCKETS; i++) { + while (table[i]) { dst[j++] = table[i]; table[i] = table[i]->next; } @@ -197,7 +208,8 @@ void destroyHashArray(HashBucketPtr *array) { int i = 0; - while(array[i]) { + + while (array[i]) { free(array[i]->key); free(array[i]->value); free(array[i]); @@ -57,7 +57,7 @@ #include "ident.h" #ifdef X_BZIP2_FONT_COMPRESSION -# include <bzlib.h> +#include <bzlib.h> #endif #define PCF_VERSION (('p'<<24)|('c'<<16)|('f'<<8)|1) @@ -73,25 +73,27 @@ typedef struct _Prop { typedef struct { enum { gzFontFile, bz2FontFile } type; union { - gzFile gz; - BZFILE *bz2; + gzFile gz; + BZFILE *bz2; } f; unsigned long pos; } fontFile; static inline void * -fontFileOpen(fontFile *ff, const char *filename) { +fontFileOpen(fontFile *ff, const char *filename) +{ size_t n = strlen(filename); if (n > 4 && strcmp(filename + n - 4, ".bz2") == 0) { - ff->type = bz2FontFile; - ff->f.bz2 = BZ2_bzopen(filename, "rb"); - ff->pos = 0; - return ff->f.bz2; - } else { - ff->type = gzFontFile; - ff->f.gz = gzopen(filename, "rb"); - return ff->f.gz; + ff->type = bz2FontFile; + ff->f.bz2 = BZ2_bzopen(filename, "rb"); + ff->pos = 0; + return ff->f.bz2; + } + else { + ff->type = gzFontFile; + ff->f.gz = gzopen(filename, "rb"); + return ff->f.gz; } } @@ -99,11 +101,13 @@ static inline int fontFileRead(fontFile *ff, void *buf, unsigned len) { if (ff->type == gzFontFile) { - return gzread(ff->f.gz, buf, len); - } else { - int r = BZ2_bzread(ff->f.bz2, buf, len); - ff->pos += r; - return r; + return gzread(ff->f.gz, buf, len); + } + else { + int r = BZ2_bzread(ff->f.bz2, buf, len); + + ff->pos += r; + return r; } } @@ -111,15 +115,18 @@ static inline int fontFileGetc(fontFile *ff) { if (ff->type == gzFontFile) { - return gzgetc(ff->f.gz); - } else { - char buf; - if (BZ2_bzread(ff->f.bz2, &buf, 1) != 1) { - return -1; - } else { - ff->pos += 1; - return (int) buf; - } + return gzgetc(ff->f.gz); + } + else { + char buf; + + if (BZ2_bzread(ff->f.bz2, &buf, 1) != 1) { + return -1; + } + else { + ff->pos += 1; + return (int) buf; + } } } @@ -127,56 +134,58 @@ static long fontFileSeek(fontFile *ff, z_off_t offset, int whence) { if (ff->type == gzFontFile) { - return gzseek(ff->f.gz, offset, whence); - } else { - /* bzlib has no easy equivalent so we have to fake it, - * fortunately, we only have to handle a couple of cases - */ - z_off_t n; - char buf[BUFSIZ]; - - switch (whence) { - case SEEK_SET: - n = offset - ff->pos; - break; - case SEEK_CUR: - n = offset; - break; - default: - return -1; - } - - while (n > BUFSIZ) { - if (BZ2_bzread(ff->f.bz2, buf, BUFSIZ) != BUFSIZ) - return -1; - n -= BUFSIZ; - } - if (BZ2_bzread(ff->f.bz2, buf, (int) n) != n) - return -1; - ff->pos = offset; - return offset; + return gzseek(ff->f.gz, offset, whence); } -} + else { + /* bzlib has no easy equivalent so we have to fake it, + * fortunately, we only have to handle a couple of cases + */ + z_off_t n; + char buf[BUFSIZ]; + + switch (whence) { + case SEEK_SET: + n = offset - ff->pos; + break; + case SEEK_CUR: + n = offset; + break; + default: + return -1; + } + while (n > BUFSIZ) { + if (BZ2_bzread(ff->f.bz2, buf, BUFSIZ) != BUFSIZ) + return -1; + n -= BUFSIZ; + } + if (BZ2_bzread(ff->f.bz2, buf, (int) n) != n) + return -1; + ff->pos = offset; + return offset; + } +} static inline int fontFileClose(fontFile *ff) { if (ff->type == gzFontFile) { - return gzclose(ff->f.gz); - } else { - BZ2_bzclose(ff->f.bz2); - return 0; + return gzclose(ff->f.gz); + } + else { + BZ2_bzclose(ff->f.bz2); + return 0; } } -#else /* no bzip2, only gzip */ +#else /* no bzip2, only gzip */ typedef gzFile fontFile; -# define fontFileOpen(ff, filename) (*(ff) = gzopen(filename, "rb")) -# define fontFileRead(ff, buf, len) gzread(*(ff), buf, len) -# define fontFileGetc(ff) gzgetc(*(ff)) -# define fontFileSeek(ff, off, whence) gzseek(*(ff), off, whence) -# define fontFileClose(ff) gzclose(*(ff)) + +#define fontFileOpen(ff, filename) (*(ff) = gzopen(filename, "rb")) +#define fontFileRead(ff, buf, len) gzread(*(ff), buf, len) +#define fontFileGetc(ff) gzgetc(*(ff)) +#define fontFileSeek(ff, off, whence) gzseek(*(ff), off, whence) +#define fontFileClose(ff) gzclose(*(ff)) #endif static int pcfIdentify(fontFile *f, char **name); @@ -189,7 +198,7 @@ getLSB32(fontFile *f) unsigned char c[4]; rc = fontFileRead(f, c, 4); - if(rc != 4) + if (rc != 4) return -1; return (c[0]) | (c[1] << 8) | (c[2] << 16) | (c[3] << 24); } @@ -201,7 +210,7 @@ getInt8(fontFile *f, int format) int rc; rc = fontFileRead(f, &c, 1); - if(rc != 1) + if (rc != 1) return -1; return c; } @@ -213,15 +222,16 @@ getInt32(fontFile *f, int format) unsigned char c[4]; rc = fontFileRead(f, c, 4); - if(rc != 4) + if (rc != 4) return -1; - unsigned int u[4] = {c[0], c[1], c[2], c[3]}; + unsigned int u[4] = { c[0], c[1], c[2], c[3] }; - if(format & (1 << 2)) { - return (int)((u[0] << 24) | (u[1] << 16) | (u[2] << 8) | (u[3])); - } else { - return (int)((u[0]) | (u[1] << 8) | (u[2] << 16) | (u[3] << 24)); + if (format & (1 << 2)) { + return (int) ((u[0] << 24) | (u[1] << 16) | (u[2] << 8) | (u[3])); + } + else { + return (int) ((u[0]) | (u[1] << 8) | (u[2] << 16) | (u[3] << 24)); } } @@ -232,12 +242,12 @@ bitmapIdentify(const char *filename, char **name) int magic; if (fontFileOpen(&ff, filename) == NULL) - return -1; + return -1; magic = getLSB32(&ff); - if(magic == PCF_VERSION) + if (magic == PCF_VERSION) return pcfIdentify(&ff, name); - else if(magic == ('S' | ('T' << 8) | ('A' << 16) | ('R') << 24)) + else if (magic == ('S' | ('T' << 8) | ('A' << 16) | ('R') << 24)) return bdfIdentify(&ff, name); fontFileClose(&ff); @@ -254,74 +264,74 @@ pcfIdentify(fontFile *f, char **name) char *strings = NULL, *s; count = getLSB32(f); - if(count <= 0) + if (count <= 0) goto fail; prop_position = -1; - for(i = 0; i < count; i++) { + for (i = 0; i < count; i++) { int type, offset; + type = getLSB32(f); (void) getLSB32(f); (void) getLSB32(f); offset = getLSB32(f); - if(type == PCF_PROPERTIES) { + if (type == PCF_PROPERTIES) { prop_position = offset; break; } } - if(prop_position < 0) + if (prop_position < 0) goto fail; rc = fontFileSeek(f, prop_position, SEEK_SET); - if(rc < 0) + if (rc < 0) goto fail; format = getLSB32(f); - if((format & 0xFFFFFF00) != 0) + if ((format & 0xFFFFFF00) != 0) goto fail; nprops = getInt32(f, format); - if(nprops <= 0 || nprops > 1000) + if (nprops <= 0 || nprops > 1000) goto fail; props = malloc(nprops * sizeof(PropRec)); - if(props == NULL) + if (props == NULL) goto fail; - for(i = 0; i < nprops; i++) { + for (i = 0; i < nprops; i++) { props[i].name = getInt32(f, format); props[i].isString = getInt8(f, format); props[i].value = getInt32(f, format); } - if(nprops & 3) { - rc = fontFileSeek(f, 4 - (nprops & 3), SEEK_CUR); - if(rc < 0) + if (nprops & 3) { + rc = fontFileSeek(f, 4 - (nprops & 3), SEEK_CUR); + if (rc < 0) goto fail; } string_size = getInt32(f, format); - if(string_size < 0 || string_size > 100000) + if (string_size < 0 || string_size > 100000) goto fail; strings = malloc(string_size); - if(!strings) + if (!strings) goto fail; rc = fontFileRead(f, strings, string_size); - if(rc != string_size) + if (rc != string_size) goto fail; - for(i = 0; i < nprops; i++) { - if(!props[i].isString || - props[i].name >= string_size - 4 || - props[i].value >= string_size) + for (i = 0; i < nprops; i++) { + if (!props[i].isString || + props[i].name >= string_size - 4 || props[i].value >= string_size) continue; - if(strcmp(strings + props[i].name, "FONT") == 0) + if (strcmp(strings + props[i].name, "FONT") == 0) break; } - if(i >= nprops) + if (i >= nprops) goto fail; s = strdup(strings + props[i].value); - if(s == NULL) + if (s == NULL) goto fail; *name = s; free(strings); @@ -330,31 +340,34 @@ pcfIdentify(fontFile *f, char **name) return 1; fail: - if(strings) free(strings); - if(props) free(props); + if (strings) + free(strings); + if (props) + free(props); fontFileClose(f); return 0; } #define NKEY 20 -static char* +static char * getKeyword(fontFile *f, int *eol) { static char keyword[NKEY + 1]; int c, i; + i = 0; - while(i < NKEY) { + while (i < NKEY) { c = fontFileGetc(f); - if(c == ' ' || c == '\n') { - if(i <= 0) + if (c == ' ' || c == '\n') { + if (i <= 0) return NULL; - if(eol) + if (eol) *eol = (c == '\n'); keyword[i] = '\0'; return keyword; } - if(c < 'A' || c > 'Z') + if (c < 'A' || c > 'Z') return NULL; keyword[i++] = c; } @@ -365,10 +378,11 @@ static int bdfskip(fontFile *f) { int c; + do { c = fontFileGetc(f); - } while(c >= 0 && c != '\n'); - if(c < 0) + } while (c >= 0 && c != '\n'); + if (c < 0) return -1; return 1; } @@ -385,24 +399,26 @@ bdfend(fontFile *f) c = fontFileGetc(f); } while (c == ' '); - while(i < 1000) { - if(c < 0 || (c == '\n' && i == 0)) { + while (i < 1000) { + if (c < 0 || (c == '\n' && i == 0)) { goto fail; } - if(bufsize < i + 1) { + if (bufsize < i + 1) { char *newbuf; - if(bufsize == 0) { + + if (bufsize == 0) { bufsize = 20; newbuf = malloc(bufsize); - } else { + } + else { bufsize = 2 * bufsize; newbuf = realloc(buf, bufsize); } - if(newbuf == NULL) + if (newbuf == NULL) goto fail; buf = newbuf; } - if(c == '\n') { + if (c == '\n') { buf[i] = '\0'; return buf; } @@ -411,7 +427,7 @@ bdfend(fontFile *f) } fail: - if(buf) + if (buf) free(buf); return NULL; } @@ -422,32 +438,34 @@ bdfIdentify(fontFile *f, char **name) char *k; int rc; int eol; + /* bitmapIdentify already read "STAR", so we need to check for "TFONT" */ k = getKeyword(f, &eol); - if(k == NULL || eol) + if (k == NULL || eol) goto fail; - if(strcmp(k, "TFONT") != 0) + if (strcmp(k, "TFONT") != 0) goto fail; - while(1) { - if(!eol) { + while (1) { + if (!eol) { rc = bdfskip(f); - if(rc < 0) + if (rc < 0) goto fail; } k = getKeyword(f, &eol); - if(k == NULL) + if (k == NULL) goto fail; - else if(strcmp(k, "FONT") == 0) { - if(eol) + else if (strcmp(k, "FONT") == 0) { + if (eol) goto fail; k = bdfend(f); - if(k == NULL) + if (k == NULL) goto fail; *name = k; fontFileClose(f); return 1; - } else if(strcmp(k, "CHARS") == 0) + } + else if (strcmp(k, "CHARS") == 0) goto fail; } fail: @@ -31,8 +31,8 @@ int listMember(const char *elt, ListPtr list) { - while(list != NULL) { - if(strcmp(elt, list->value) == 0) + while (list != NULL) { + if (strcmp(elt, list->value) == 0) return 1; list = list->next; } @@ -43,17 +43,18 @@ ListPtr listCons(char *car, ListPtr cdr) { ListPtr lcar = malloc(sizeof(ListRec)); - if(!lcar) + + if (!lcar) return NULL; - lcar -> value = car; - lcar -> next = cdr; + lcar->value = car; + lcar->next = cdr; return lcar; } ListPtr listAdjoin(char *car, ListPtr cdr) { - if(listMember(car, cdr)) { + if (listMember(car, cdr)) { free(car); return cdr; } @@ -65,6 +66,7 @@ dsprintf(const char *f, ...) { va_list args; char *string; + #ifdef HAVE_VASPRINTF va_start(args, f); if (vasprintf(&string, f, args) == -1) @@ -73,53 +75,55 @@ dsprintf(const char *f, ...) return string; #else { - 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) + 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); - } + else if (n >= size) + size = n + 1; + else + size = size * 3 / 2 + 1; + free(string); + } } #endif } - ListPtr listConsF(ListPtr cdr, const 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 listCons(string, cdr); - else if(n >= size) - size = n + 1; - else - size = size * 3 / 2 + 1; - free(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 listCons(string, cdr); + else if (n >= size) + size = n + 1; + else + size = size * 3 / 2 + 1; + free(string); + } } } @@ -128,25 +132,27 @@ listAdjoinF(ListPtr cdr, const 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 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); + } } } @@ -154,7 +160,8 @@ int listLength(ListPtr list) { int n = 0; - while(list) { + + while (list) { n++; list = list->next; } @@ -166,14 +173,13 @@ appendList(ListPtr first, ListPtr second) { ListPtr current; - if(second == NULL) + if (second == NULL) return first; - if(first == NULL) + if (first == NULL) return second; - for(current = first; current->next; current = current->next) - ; + for (current = first; current->next; current = current->next); current->next = second; return first; @@ -185,20 +191,20 @@ makeList(char **a, int n, ListPtr old, int begin) ListPtr first, current, next; int i; - if(n == 0) + if (n == 0) return old; first = malloc(sizeof(ListRec)); - if(!first) + if (!first) return NULL; first->value = a[0]; first->next = NULL; current = first; - for(i = 1; i < n; i++) { + for (i = 1; i < n; i++) { next = malloc(sizeof(ListRec)); - if(!next) { + if (!next) { destroyList(first); return NULL; } @@ -208,10 +214,11 @@ makeList(char **a, int n, ListPtr old, int begin) current->next = next; current = next; } - if(begin) { + if (begin) { current->next = old; return first; - } else { + } + else { return appendList(old, first); } } @@ -220,7 +227,8 @@ ListPtr reverseList(ListPtr old) { ListPtr new = NULL, current; - while(old) { + + while (old) { current = old; old = old->next; current->next = new; @@ -261,7 +269,7 @@ sortList(ListPtr old) qsort(sorted, i, sizeof(ListPtr), compareListEntries); n = sorted[0]; for (i = 0; i < (l - 1); i++) { - sorted[i]->next = sorted[i+1]; + sorted[i]->next = sorted[i + 1]; } sorted[i]->next = NULL; free(sorted); @@ -272,9 +280,10 @@ void destroyList(ListPtr old) { ListPtr next; - if(!old) + + if (!old) return; - while(old) { + while (old) { next = old->next; free(old); old = next; @@ -285,9 +294,10 @@ void deepDestroyList(ListPtr old) { ListPtr next; - if(!old) + + if (!old) return; - while(old) { + while (old) { next = old->next; free(old->value); free(old); diff --git a/mkfontscale.c b/mkfontscale.c index 356417f..d692e3c 100644 --- a/mkfontscale.c +++ b/mkfontscale.c @@ -68,24 +68,24 @@ #define QUOTE(x) #x #define STRINGIFY(x) QUOTE(x) -static const char *encodings_array[] = - { "ascii-0", - "iso8859-1", "iso8859-2", "iso8859-3", "iso8859-4", "iso8859-5", - "iso8859-6", "iso8859-6.8", "iso8859-6.8x", "iso8859-6.16", - "iso8859-7", "iso8859-8", "iso8859-9", "iso8859-10", - "iso8859-11", "iso8859-12", "iso8859-13", "iso8859-14", - "iso8859-15", "iso8859-16", - "ansi-1251", "koi8-r", "koi8-u", "koi8-ru", "koi8-e", "koi8-uni", - "tis620-2", - "sun.unicode.india-0", "suneu-greek", - "adobe-standard", "adobe-symbol", - "ibm-cp437", "ibm-cp850", "ibm-cp852", "ibm-cp866", "microsoft-cp1252", - /* But not "adobe-dingbats", as it uses generic glyph names. */ - "cns11643-1", "cns11643-2", "cns11643-3", - "jisx0201.1976-0", "jisx0208.1983-0", "jisx0208.1990-0", - "jisx0212.1990-0", "big5-0", "big5.eten-0", "big5hkscs-0", - "gb2312.1980-0", "gb18030.2000-0", "gb18030.2000-1", - "ksc5601.1987-0", "ksc5601.1992-3"}; +static const char *encodings_array[] = { "ascii-0", + "iso8859-1", "iso8859-2", "iso8859-3", "iso8859-4", "iso8859-5", + "iso8859-6", "iso8859-6.8", "iso8859-6.8x", "iso8859-6.16", + "iso8859-7", "iso8859-8", "iso8859-9", "iso8859-10", + "iso8859-11", "iso8859-12", "iso8859-13", "iso8859-14", + "iso8859-15", "iso8859-16", + "ansi-1251", "koi8-r", "koi8-u", "koi8-ru", "koi8-e", "koi8-uni", + "tis620-2", + "sun.unicode.india-0", "suneu-greek", + "adobe-standard", "adobe-symbol", + "ibm-cp437", "ibm-cp850", "ibm-cp852", "ibm-cp866", "microsoft-cp1252", + /* But not "adobe-dingbats", as it uses generic glyph names. */ + "cns11643-1", "cns11643-2", "cns11643-3", + "jisx0201.1976-0", "jisx0208.1983-0", "jisx0208.1990-0", + "jisx0212.1990-0", "big5-0", "big5.eten-0", "big5hkscs-0", + "gb2312.1980-0", "gb18030.2000-0", "gb18030.2000-1", + "ksc5601.1987-0", "ksc5601.1992-3" +}; static const char *extra_encodings_array[] = { "iso10646-1", "adobe-fontspecific", "microsoft-symbol" }; @@ -95,12 +95,13 @@ static const char *outfilename; #define countof(_a) (sizeof(_a)/sizeof((_a)[0])) -static int doDirectory(const char*, int, ListPtr); +static int doDirectory(const char *, int, ListPtr); static int checkEncoding(FT_Face face, const char *encoding_name); -static int checkExtraEncoding(FT_Face face, const char *encoding_name, int found); +static int checkExtraEncoding(FT_Face face, const char *encoding_name, + int found); static int find_cmap(int type, int pid, int eid, FT_Face face); -static const char* notice_foundry(const char *notice); -static const char* vendor_foundry(const signed char *vendor); +static const char *notice_foundry(const char *notice); +static const char *vendor_foundry(const signed char *vendor); static int readFontScale(HashTablePtr entries, char *dirname); ListPtr makeXLFD(char *filename, FT_Face face, int); static int readEncodings(ListPtr encodings, char *dirname); @@ -131,7 +132,7 @@ usage(void) } static void _X_NORETURN _X_COLD -missing_arg (const char *option) +missing_arg(const char *option) { fprintf(stderr, "%s: %s requires an argument\n", ProgramName, option); usage(); @@ -149,22 +150,22 @@ main(int argc, char **argv) encodingPrefix = NULL; exclusionSuffix = NULL; - if(getcwd(prefix, NPREFIX - 1) == NULL) { + if (getcwd(prefix, NPREFIX - 1) == NULL) { perror("Couldn't get cwd"); exit(1); } - if(prefix[strlen(prefix) - 1] != '/') + if (prefix[strlen(prefix) - 1] != '/') encodingPrefix = dsprintf("%s/", prefix); else encodingPrefix = strdup(prefix); outfilename = NULL; - encodings = makeConstList(encodings_array, countof(encodings_array), NULL, 0); + encodings = + makeConstList(encodings_array, countof(encodings_array), NULL, 0); extra_encodings = makeConstList(extra_encodings_array, - countof(extra_encodings_array), - NULL, 0); + countof(extra_encodings_array), NULL, 0); doBitmaps = 0; doISO10646_1_encoding = 1; doScalable = 1; @@ -174,29 +175,32 @@ main(int argc, char **argv) encodingsToDo = NULL; argn = 1; - while(argn < argc) { - if(argv[argn][0] == '\0' || argv[argn][0] != '-') + while (argn < argc) { + if (argv[argn][0] == '\0' || argv[argn][0] != '-') break; - if(argv[argn][1] == '-') { + if (argv[argn][1] == '-') { argn++; break; - } else if (strcmp(argv[argn], "-x") == 0) { - if(argn >= argc - 1) { + } + else if (strcmp(argv[argn], "-x") == 0) { + if (argn >= argc - 1) { missing_arg("-x"); } exclusionSuffix = argv[argn + 1]; argn += 2; - } else if(strcmp(argv[argn], "-a") == 0) { - if(argn >= argc - 1) { + } + else if (strcmp(argv[argn], "-a") == 0) { + if (argn >= argc - 1) { missing_arg("-a"); } - makeConstList((const char **)&argv[argn + 1], 1, encodings, 0); + makeConstList((const char **) &argv[argn + 1], 1, encodings, 0); argn += 2; - } else if(strcmp(argv[argn], "-p") == 0) { - if(argn >= argc - 1) { + } + else if (strcmp(argv[argn], "-p") == 0) { + if (argn >= argc - 1) { missing_arg("-p"); } - if(strlen(argv[argn + 1]) > NPREFIX - 1) { + if (strlen(argv[argn + 1]) > NPREFIX - 1) { fprintf(stderr, "%s: argument to -p cannot be longer than " "%d characters\n", ProgramName, NPREFIX - 1); usage(); @@ -204,64 +208,76 @@ main(int argc, char **argv) free(encodingPrefix); encodingPrefix = strdup(argv[argn + 1]); argn += 2; - } else if(strcmp(argv[argn], "-e") == 0) { - if(argn >= argc - 1) { + } + else if (strcmp(argv[argn], "-e") == 0) { + if (argn >= argc - 1) { missing_arg("-e"); } rc = readEncodings(encodingsToDo, argv[argn + 1]); - if(rc < 0) + if (rc < 0) exit(1); argn += 2; - } else if(strcmp(argv[argn], "-b") == 0) { + } + else if (strcmp(argv[argn], "-b") == 0) { doBitmaps = 1; argn++; - } else if(strcmp(argv[argn], "-u") == 0) { + } + else if (strcmp(argv[argn], "-u") == 0) { doISO10646_1_encoding = 0; argn++; - } else if(strcmp(argv[argn], "-U") == 0) { + } + else if (strcmp(argv[argn], "-U") == 0) { doISO10646_1_encoding = 1; argn++; - } else if(strcmp(argv[argn], "-s") == 0) { + } + else if (strcmp(argv[argn], "-s") == 0) { doScalable = 0; argn++; - } else if(strcmp(argv[argn], "-n") == 0) { + } + else if (strcmp(argv[argn], "-n") == 0) { onlyEncodings = 1; argn++; - } else if(strcmp(argv[argn], "-r") == 0) { + } + else if (strcmp(argv[argn], "-r") == 0) { relative = 1; argn++; - } else if(strcmp(argv[argn], "-l") == 0) { + } + else if (strcmp(argv[argn], "-l") == 0) { reencodeLegacy = !reencodeLegacy; argn++; - } else if(strcmp(argv[argn], "-o") == 0) { - if(argn >= argc - 1) { + } + else if (strcmp(argv[argn], "-o") == 0) { + if (argn >= argc - 1) { missing_arg("-o"); } outfilename = argv[argn + 1]; argn += 2; - } else if(strcmp(argv[argn], "-f") == 0) { - if(argn >= argc - 1) { + } + else if (strcmp(argv[argn], "-f") == 0) { + if (argn >= argc - 1) { missing_arg("-f"); } bigEncodingFuzz = atof(argv[argn + 1]) / 100.0; argn += 2; - } else if (strcmp(argv[argn], "-v") == 0) { - printf("%s\n", PACKAGE_STRING); - exit(0); - } else { + } + else if (strcmp(argv[argn], "-v") == 0) { + printf("%s\n", PACKAGE_STRING); + exit(0); + } + else { usage(); } } - if(outfilename == NULL) { - if(doBitmaps) + if (outfilename == NULL) { + if (doBitmaps) outfilename = "fonts.dir"; else outfilename = "fonts.scale"; } ftrc = FT_Init_FreeType(&ft_library); - if(ftrc) { + if (ftrc) { fprintf(stderr, "Could not initialise FreeType library: %d\n", ftrc); exit(1); } @@ -271,7 +287,7 @@ main(int argc, char **argv) if (argn == argc) doDirectory(".", ll, encodingsToDo); else - while(argn < argc) { + while (argn < argc) { doDirectory(argv[argn], ll, encodingsToDo); argn++; } @@ -286,30 +302,29 @@ getNameHelper(FT_Face face, int nid, int pid, int eid, int n, i; n = FT_Get_Sfnt_Name_Count(face); - if(n <= 0) + if (n <= 0) return 0; - for(i = 0; i < n; i++) { - if(FT_Get_Sfnt_Name(face, i, &name)) + for (i = 0; i < n; i++) { + if (FT_Get_Sfnt_Name(face, i, &name)) continue; - if(name.name_id == nid && - name.platform_id == pid && - (eid < 0 || name.encoding_id == eid)) { - switch(name.platform_id) { + if (name.name_id == nid && + name.platform_id == pid && (eid < 0 || name.encoding_id == eid)) { + switch (name.platform_id) { case TT_PLATFORM_APPLE_UNICODE: case TT_PLATFORM_MACINTOSH: - if(name.language_id != TT_MAC_LANGID_ENGLISH) + if (name.language_id != TT_MAC_LANGID_ENGLISH) continue; break; case TT_PLATFORM_MICROSOFT: - if(name.language_id != TT_MS_LANGID_ENGLISH_UNITED_STATES && - name.language_id != TT_MS_LANGID_ENGLISH_UNITED_KINGDOM) + if (name.language_id != TT_MS_LANGID_ENGLISH_UNITED_STATES && + name.language_id != TT_MS_LANGID_ENGLISH_UNITED_KINGDOM) continue; break; default: continue; } - if(name.string_len > 0) { + if (name.string_len > 0) { *name_return = name; return 1; } @@ -325,17 +340,16 @@ getName(FT_Face face, int nid) char *string; unsigned int i; - if(getNameHelper(face, nid, - TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, &name) || - getNameHelper(face, nid, - TT_PLATFORM_APPLE_UNICODE, -1, &name)) { + if (getNameHelper(face, nid, + TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, &name) || + getNameHelper(face, nid, TT_PLATFORM_APPLE_UNICODE, -1, &name)) { string = malloc(name.string_len / 2 + 1); - if(string == NULL) { + if (string == NULL) { fprintf(stderr, "Couldn't allocate name\n"); exit(1); } - for(i = 0; i < name.string_len / 2; i++) { - if(name.string[2 * i] != 0) + for (i = 0; i < name.string_len / 2; i++) { + if (name.string[2 * i] != 0) string[i] = '?'; else string[i] = name.string[2 * i + 1]; @@ -345,10 +359,9 @@ getName(FT_Face face, int nid) } /* Pretend that Apple Roman is ISO 8859-1. */ - if(getNameHelper(face, nid, TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, - &name)) { + if (getNameHelper(face, nid, TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, &name)) { string = malloc(name.string_len + 1); - if(string == NULL) { + if (string == NULL) { fprintf(stderr, "Couldn't allocate name\n"); exit(1); } @@ -360,47 +373,47 @@ getName(FT_Face face, int nid) return NULL; } -static const char* +static const char * os2Weight(int weight) { - if(weight < 150) + if (weight < 150) return "thin"; - else if(weight < 250) + else if (weight < 250) return "extralight"; - else if(weight < 350) + else if (weight < 350) return "light"; - else if(weight < 450) + else if (weight < 450) return "medium"; /* officially "normal" */ - else if(weight < 550) + else if (weight < 550) return "medium"; - else if(weight < 650) + else if (weight < 650) return "semibold"; - else if(weight < 750) + else if (weight < 750) return "bold"; - else if(weight < 850) + else if (weight < 850) return "extrabold"; else return "black"; } -static const char* +static const char * os2Width(int width) { - if(width <= 1) + if (width <= 1) return "ultracondensed"; - else if(width <= 2) + else if (width <= 2) return "extracondensed"; - else if(width <= 3) + else if (width <= 3) return "condensed"; - else if(width <= 4) + else if (width <= 4) return "semicondensed"; - else if(width <= 5) + else if (width <= 5) return "normal"; - else if(width <= 6) + else if (width <= 6) return "semiexpanded"; - else if(width <= 7) + else if (width <= 7) return "expanded"; - else if(width <= 8) + else if (width <= 8) return "extraexpanded"; else return "ultraexpanded"; @@ -413,60 +426,61 @@ static const char *widths[] = { #define NUMWIDTHS (sizeof(widths) / sizeof(widths[0])) -static const char* +static const char * nameWidth(const char *name) { char buf[500]; unsigned int i; size_t n = strlen(name); - if(n >= 499) return NULL; - for(i = 0; i < n; i++) + if (n >= 499) + return NULL; + for (i = 0; i < n; i++) buf[i] = tolower(name[i]); buf[i] = '\0'; - for(i = 0; i < NUMWIDTHS; i++) - if(strstr(buf, widths[i])) + for (i = 0; i < NUMWIDTHS; i++) + if (strstr(buf, widths[i])) return widths[i]; return NULL; } -static const char* +static const char * t1Weight(const char *weight) { - if(!weight) + if (!weight) return NULL; - if(strcasecmp(weight, "Thin") == 0) + if (strcasecmp(weight, "Thin") == 0) return "thin"; - if(strcasecmp(weight, "ExtraLight") == 0) /* FontForge uses this for 200*/ + if (strcasecmp(weight, "ExtraLight") == 0) /* FontForge uses this for 200 */ return "extralight"; - if(strcasecmp(weight, "Light") == 0) + if (strcasecmp(weight, "Light") == 0) return "light"; - if(strcasecmp(weight, "Regular") == 0) + if (strcasecmp(weight, "Regular") == 0) return "medium"; - if(strcasecmp(weight, "Normal") == 0) + if (strcasecmp(weight, "Normal") == 0) return "medium"; - if(strcasecmp(weight, "Plain") == 0) + if (strcasecmp(weight, "Plain") == 0) return "medium"; - if(strcasecmp(weight, "Medium") == 0) + if (strcasecmp(weight, "Medium") == 0) return "medium"; - if(strcasecmp(weight, "Book") == 0) + if (strcasecmp(weight, "Book") == 0) return "medium"; - if(strcasecmp(weight, "Roman") == 0) /* Some URW++ fonts do that! */ + if (strcasecmp(weight, "Roman") == 0) /* Some URW++ fonts do that! */ return "medium"; - if(strcasecmp(weight, "Demi") == 0) + if (strcasecmp(weight, "Demi") == 0) return "semibold"; - if(strcasecmp(weight, "DemiBold") == 0) + if (strcasecmp(weight, "DemiBold") == 0) return "semibold"; - if(strcasecmp(weight, "SemiBold") == 0) /* some TeX fonts apparently do that */ + if (strcasecmp(weight, "SemiBold") == 0) /* some TeX fonts apparently do that */ return "semibold"; - else if(strcasecmp(weight, "Bold") == 0) + else if (strcasecmp(weight, "Bold") == 0) return "bold"; - else if(strcasecmp(weight, "ExtraBold") == 0) /* freefonts uses this */ + else if (strcasecmp(weight, "ExtraBold") == 0) /* freefonts uses this */ return "extrabold"; - else if(strcasecmp(weight, "Heavy") == 0) /* FontForge uses this for 800*/ + else if (strcasecmp(weight, "Heavy") == 0) /* FontForge uses this for 800 */ return "extrabold"; - else if(strcasecmp(weight, "Black") == 0) + else if (strcasecmp(weight, "Black") == 0) return "black"; else { fprintf(stderr, "Unknown Type 1 weight \"%s\"\n", weight); @@ -483,29 +497,30 @@ unsafe(char c) } static const char * -safe(const char* s) +safe(const char *s) { int i, len, safe_flag = 1; char *t; i = 0; - while(s[i] != '\0') { - if(unsafe(s[i])) + while (s[i] != '\0') { + if (unsafe(s[i])) safe_flag = 0; i++; } - if(safe_flag) return strdup(s); + if (safe_flag) + return strdup(s); len = i; t = malloc(len + 1); - if(t == NULL) { + if (t == NULL) { perror("Couldn't allocate string"); exit(1); } - for(i = 0; i < len; i++) { - if(unsafe(s[i])) + for (i = 0; i < len; i++) { + if (unsafe(s[i])) t[i] = ' '; else t[i] = s[i]; @@ -542,66 +557,68 @@ makeXLFD(char *filename, FT_Face face, int isBitmap) post = FT_Get_Sfnt_Table(face, ft_sfnt_post); rc = FT_Get_PS_Font_Info(face, &t1info_rec); - if(rc == 0) + if (rc == 0) t1info = &t1info_rec; else t1info = NULL; - if(!family) + if (!family) family = getName(face, TT_NAME_ID_FONT_FAMILY); - if(!family) + if (!family) family = getName(face, TT_NAME_ID_FULL_NAME); - if(!family) + if (!family) family = getName(face, TT_NAME_ID_PS_NAME); - if(!full_name) + if (!full_name) full_name = getName(face, TT_NAME_ID_FULL_NAME); - if(!full_name) + if (!full_name) full_name = getName(face, TT_NAME_ID_PS_NAME); - if(os2 && os2->version != 0xFFFF) { - if(!weight) + if (os2 && os2->version != 0xFFFF) { + if (!weight) weight = os2Weight(os2->usWeightClass); - if(!sWidth) + if (!sWidth) sWidth = os2Width(os2->usWidthClass); - if(!foundry) + if (!foundry) foundry = vendor_foundry(os2->achVendID); - if(!slant) + if (!slant) slant = os2->fsSelection & 1 ? "i" : "r"; } - if(post) { - if(!spacing) { - if(post->isFixedPitch) { - if(hhea->min_Left_Side_Bearing >= 0 && - hhea->xMax_Extent <= hhea->advance_Width_Max) { + if (post) { + if (!spacing) { + if (post->isFixedPitch) { + if (hhea->min_Left_Side_Bearing >= 0 && + hhea->xMax_Extent <= hhea->advance_Width_Max) { spacing = "c"; - } else { + } + else { spacing = "m"; } - } else { + } + else { spacing = "p"; } } } - if(t1info) { - if(!family && t1info->family_name) + if (t1info) { + if (!family && t1info->family_name) family = strdup(t1info->family_name); - if(!family && t1info->full_name) + if (!family && t1info->full_name) family = strdup(t1info->full_name); /* Hershey fonts miss /FamilyName */ - if(!family && face->family_name) + if (!family && face->family_name) family = strdup(face->family_name); - if(!full_name && t1info->full_name) + if (!full_name && t1info->full_name) full_name = strdup(t1info->full_name); - if(!foundry) + if (!foundry) foundry = notice_foundry(t1info->notice); - if(!weight) + if (!weight) weight = t1Weight(t1info->weight); - if(!spacing) + if (!spacing) spacing = t1info->is_fixed_pitch ? "m" : "p"; - if(!slant) { + if (!slant) { /* Bitstream fonts have positive italic angle. */ slant = t1info->italic_angle <= -4 || t1info->italic_angle >= 4 ? @@ -609,97 +626,105 @@ makeXLFD(char *filename, FT_Face face, int isBitmap) } } - if(!full_name) { + if (!full_name) { fprintf(stderr, "Couldn't determine full name for %s\n", filename); full_name = strdup(filename); } - if(head) { - if(!slant) + if (head) { + if (!slant) slant = head->Mac_Style & 2 ? "i" : "r"; - if(!weight) + if (!weight) weight = head->Mac_Style & 1 ? "bold" : "medium"; } - if(!slant) { + if (!slant) { fprintf(stderr, "Couldn't determine slant for %s\n", filename); slant = "r"; } - if(!weight) { + if (!weight) { fprintf(stderr, "Couldn't determine weight for %s\n", filename); weight = "medium"; } - if(!foundry) { + if (!foundry) { char *notice; + notice = getName(face, TT_NAME_ID_TRADEMARK); - if(notice) { + if (notice) { foundry = notice_foundry(notice); free(notice); } - if(!foundry) { + if (!foundry) { notice = getName(face, TT_NAME_ID_MANUFACTURER); - if(notice) { + if (notice) { foundry = notice_foundry(notice); free(notice); } } } - if(strcmp(slant, "i") == 0) { - if(strstr(full_name, "Oblique")) + if (strcmp(slant, "i") == 0) { + if (strstr(full_name, "Oblique")) slant = "o"; - if(strstr(full_name, "Slanted")) + if (strstr(full_name, "Slanted")) slant = "o"; } - if(!sWidth) + if (!sWidth) sWidth = nameWidth(full_name); - if(!foundry) foundry = "misc"; - if(!family) { + if (!foundry) + foundry = "misc"; + if (!family) { fprintf(stderr, "Couldn't get family name for %s\n", filename); family = strdup(filename); } - if(!weight) weight = "medium"; - if(!slant) slant = "r"; - if(!sWidth) sWidth = "normal"; - if(!adstyle) adstyle = ""; - if(!spacing) spacing = "p"; + if (!weight) + weight = "medium"; + if (!slant) + slant = "r"; + if (!sWidth) + sWidth = "normal"; + if (!adstyle) + adstyle = ""; + if (!spacing) + spacing = "p"; foundry = safe(foundry); tmp = family; family = safe(family); - free((void *)tmp); + free((void *) tmp); - if(!isBitmap) { + if (!isBitmap) { xlfd = listConsF(xlfd, "-%s-%s-%s-%s-%s-%s-0-0-0-0-%s-0", foundry, family, weight, slant, sWidth, adstyle, spacing); - } else { + } + else { int i, w, h, xres, yres; - for(i = 0; i < face->num_fixed_sizes; i++) { + + for (i = 0; i < face->num_fixed_sizes; i++) { w = face->available_sizes[i].width; h = face->available_sizes[i].height; xres = 75; - yres = (double)h / w * xres; + yres = (double) h / w * xres; xlfd = listConsF(xlfd, "-%s-%s-%s-%s-%s-%s-%d-%d-%d-%d-%s-%d", foundry, family, weight, slant, sWidth, adstyle, - h, (int)(h / (double)yres * 72.27 * 10 + 0.5), - xres, yres, - spacing, 60); + h, (int) (h / (double) yres * 72.27 * 10 + 0.5), + xres, yres, spacing, 60); } } - free((void *)family); - free((void *)foundry); - free((void *)full_name); + free((void *) family); + free((void *) foundry); + free((void *) full_name); return xlfd; } @@ -710,36 +735,36 @@ readFontScale(HashTablePtr entries, char *dirname) char *filename; FILE *in; int rc, count, i; - char file[MAXFONTFILENAMELEN+1], font[MAXFONTNAMELEN+1]; + char file[MAXFONTFILENAMELEN + 1], font[MAXFONTNAMELEN + 1]; - if(dirname[n - 1] == '/') + if (dirname[n - 1] == '/') filename = dsprintf("%sfonts.scale", dirname); else filename = dsprintf("%s/fonts.scale", dirname); - if(filename == NULL) + if (filename == NULL) return -1; in = fopen(filename, "r"); free(filename); - if(in == NULL) { - if(errno != ENOENT) + if (in == NULL) { + if (errno != ENOENT) perror("open(fonts.scale)"); return -1; } rc = fscanf(in, "%d\n", &count); - if(rc != 1) { + if (rc != 1) { fprintf(stderr, "Invalid fonts.scale in %s.\n", dirname); fclose(in); return -1; } - for(i = 0; i < count; i++) { + for (i = 0; i < count; i++) { rc = fscanf(in, - "%" STRINGIFY(MAXFONTFILENAMELEN) "s " - "%" STRINGIFY(MAXFONTNAMELEN) "[^\n]\n", - file, font); - if(rc != 2) + "%" STRINGIFY(MAXFONTFILENAMELEN) "s " + "%" STRINGIFY(MAXFONTNAMELEN) "[^\n]\n", + file, font); + if (rc != 2) break; putHash(entries, font, file, 100); } @@ -751,31 +776,32 @@ static int filePrio(char *filename) { size_t n = strlen(filename); - if(n < 4) + + if (n < 4) return 0; - if(strcmp(filename + n - 4, ".otf") == 0) + if (strcmp(filename + n - 4, ".otf") == 0) return 6; - if(strcmp(filename + n - 4, ".OTF") == 0) + if (strcmp(filename + n - 4, ".OTF") == 0) return 6; - if(strcmp(filename + n - 4, ".ttf") == 0) + if (strcmp(filename + n - 4, ".ttf") == 0) return 5; - if(strcmp(filename + n - 4, ".TTF") == 0) + if (strcmp(filename + n - 4, ".TTF") == 0) return 5; - if(strcmp(filename + n - 4, ".pcf") == 0) + if (strcmp(filename + n - 4, ".pcf") == 0) return 4; - if(strcmp(filename + n - 4, ".PCF") == 0) + if (strcmp(filename + n - 4, ".PCF") == 0) return 4; - if(strcmp(filename + n - 3, ".gz") == 0) + if (strcmp(filename + n - 3, ".gz") == 0) return 3; #ifdef X_BZIP2_FONT_COMPRESSION - if(strcmp(filename + n - 4, ".bz2") == 0) + if (strcmp(filename + n - 4, ".bz2") == 0) return 2; #endif - if(strcmp(filename + n - 2, ".Z") == 0) + if (strcmp(filename + n - 2, ".Z") == 0) return 2; - if(strcmp(filename + n - 4, ".bdf") == 0) + if (strcmp(filename + n - 4, ".bdf") == 0) return 1; - if(strcmp(filename + n - 4, ".BDF") == 0) + if (strcmp(filename + n - 4, ".BDF") == 0) return 1; return 0; } @@ -785,7 +811,7 @@ doDirectory(const char *dirname_given, int numEncodings, ListPtr encodingsToDo) { char *dirname, *fontscale_name, *filename, *encdir; FILE *fontscale, *encfile; - struct dirent** namelist; + struct dirent **namelist; FT_Error ftrc; FT_Face face; ConstListPtr encoding; @@ -793,206 +819,218 @@ doDirectory(const char *dirname_given, int numEncodings, ListPtr encodingsToDo) HashTablePtr entries; HashBucketPtr *array; int i, n, dirn, diri, found, rc; - int isBitmap=0; - size_t d, xl=0; + int isBitmap = 0; + size_t d, xl = 0; if (exclusionSuffix) - xl = strlen (exclusionSuffix); + xl = strlen(exclusionSuffix); d = strlen(dirname_given); - if(d == 0) + if (d == 0) dirname = dsprintf("./"); - else if(dirname_given[d - 1] != '/') + else if (dirname_given[d - 1] != '/') dirname = dsprintf("%s/", dirname_given); else dirname = strdup(dirname_given); - if(dirname == NULL) { + if (dirname == NULL) { perror("dirname"); exit(1); } if (onlyEncodings) - goto encodings; + goto encodings; entries = makeHashTable(); - if(doBitmaps && !doScalable) { + if (doBitmaps && !doScalable) { readFontScale(entries, dirname); } - if(strcmp(outfilename, "-") == 0) + if (strcmp(outfilename, "-") == 0) fontscale_name = NULL; else { - if(outfilename[0] == '/') + if (outfilename[0] == '/') fontscale_name = strdup(outfilename); else fontscale_name = dsprintf("%s%s", dirname, outfilename); - if(fontscale_name == NULL) { + if (fontscale_name == NULL) { perror("fontscale_name"); exit(1); } } dirn = scandir(dirname, &namelist, NULL, alphasort); - if(dirn < 0) { + if (dirn < 0) { fprintf(stderr, "%s: ", dirname); perror("scandir"); return 0; } - if(fontscale_name == NULL) + if (fontscale_name == NULL) fontscale = stdout; else fontscale = fopen(fontscale_name, "wb"); - if(fontscale == NULL) { + if (fontscale == NULL) { fprintf(stderr, "%s: ", fontscale_name); perror("fopen(w)"); return 0; } - for(diri = dirn - 1; diri >= 0; diri--) { + for (diri = dirn - 1; diri >= 0; diri--) { struct dirent *entry = namelist[diri]; int have_face = 0; char *xlfd_name = NULL; - struct stat f_stat; - int tprio = 1; + struct stat f_stat; + int tprio = 1; xlfd = NULL; - if (xl) { - size_t dl = strlen (entry->d_name); - if (strcmp (entry->d_name + dl - xl, exclusionSuffix) == 0) - continue; - } + if (xl) { + size_t dl = strlen(entry->d_name); + + if (strcmp(entry->d_name + dl - xl, exclusionSuffix) == 0) + continue; + } filename = dsprintf("%s%s", dirname, entry->d_name); #define PRIO(x) ((x << 1) + tprio) #ifdef DT_LNK - if (entry->d_type != DT_UNKNOWN) { - if (entry->d_type == DT_LNK) - tprio = 0; - } else + if (entry->d_type != DT_UNKNOWN) { + if (entry->d_type == DT_LNK) + tprio = 0; + } + else #endif #ifdef S_ISLNK - { - if (lstat(filename, &f_stat)) - goto done; - if (S_ISLNK(f_stat.st_mode)) - tprio = 0; - } + { + if (lstat(filename, &f_stat)) + goto done; + if (S_ISLNK(f_stat.st_mode)) + tprio = 0; + } #else - ; + ; #endif - if(doBitmaps) + if (doBitmaps) rc = bitmapIdentify(filename, &xlfd_name); else rc = 0; - if(rc < 0) + if (rc < 0) goto done; - if(rc == 0) { + if (rc == 0) { ftrc = FT_New_Face(ft_library, filename, 0, &face); - if(ftrc) + if (ftrc) goto done; have_face = 1; isBitmap = ((face->face_flags & FT_FACE_FLAG_SCALABLE) == 0); - if(!isBitmap) { + if (!isBitmap) { /* Workaround for bitmap-only SFNT fonts */ - if(FT_IS_SFNT(face) && face->num_fixed_sizes > 0 && - strcmp(FT_Get_X11_Font_Format(face), "TrueType") == 0) { + if (FT_IS_SFNT(face) && face->num_fixed_sizes > 0 && + strcmp(FT_Get_X11_Font_Format(face), "TrueType") == 0) { TT_MaxProfile *maxp; + maxp = FT_Get_Sfnt_Table(face, ft_sfnt_maxp); - if(maxp != NULL && maxp->maxContours == 0) + if (maxp != NULL && maxp->maxContours == 0) isBitmap = 1; } } - if(isBitmap) { - if(!doBitmaps) + if (isBitmap) { + if (!doBitmaps) goto done; - } else { - if(!doScalable) + } + else { + if (!doScalable) goto done; } - if(isBitmap) { + if (isBitmap) { BDF_PropertyRec prop; + rc = FT_Get_BDF_Property(face, "FONT", &prop); - if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_ATOM) { + if (rc == 0 && prop.type == BDF_PROPERTY_TYPE_ATOM) { xlfd_name = strdup(prop.u.atom); - if(xlfd_name == NULL) + if (xlfd_name == NULL) goto done; } } } - if(xlfd_name) { + if (xlfd_name) { /* We know it's a bitmap font, and we know its XLFD */ size_t l = strlen(xlfd_name); - if(reencodeLegacy && - l >= 12 && strcasecmp(xlfd_name + l - 11, "-iso10646-1") == 0) { + + if (reencodeLegacy && + l >= 12 && strcasecmp(xlfd_name + l - 11, "-iso10646-1") == 0) { char *s; s = malloc(l - 10); memcpy(s, xlfd_name, l - 11); s[l - 11] = '\0'; xlfd = listCons(s, xlfd); - } else { + } + else { /* Not a reencodable font -- skip all the rest of the loop body */ - putHash(entries, xlfd_name, entry->d_name, PRIO(filePrio(entry->d_name))); + putHash(entries, xlfd_name, entry->d_name, + PRIO(filePrio(entry->d_name))); goto done; } } - if(!have_face) { + if (!have_face) { ftrc = FT_New_Face(ft_library, filename, 0, &face); - if(ftrc) + if (ftrc) goto done; have_face = 1; isBitmap = ((face->face_flags & FT_FACE_FLAG_SCALABLE) == 0); - if(!isBitmap) { - if(face->num_fixed_sizes > 0) { + if (!isBitmap) { + if (face->num_fixed_sizes > 0) { TT_MaxProfile *maxp; + maxp = FT_Get_Sfnt_Table(face, ft_sfnt_maxp); - if(maxp != NULL && maxp->maxContours == 0) + if (maxp != NULL && maxp->maxContours == 0) isBitmap = 1; } } } - if(xlfd == NULL) + if (xlfd == NULL) xlfd = makeXLFD(entry->d_name, face, isBitmap); found = 0; - for(lp = xlfd; lp; lp = lp->next) { + for (lp = xlfd; lp; lp = lp->next) { char buf[MAXFONTNAMELEN]; - for(encoding = encodings; encoding; encoding = encoding->next) { - if(checkEncoding(face, encoding->value)) { + + for (encoding = encodings; encoding; encoding = encoding->next) { + if (checkEncoding(face, encoding->value)) { found = 1; snprintf(buf, MAXFONTNAMELEN, "%s-%s", - lp->value, encoding->value); - putHash(entries, buf, entry->d_name, PRIO(filePrio(entry->d_name))); + lp->value, encoding->value); + putHash(entries, buf, entry->d_name, + PRIO(filePrio(entry->d_name))); } } - for(encoding = extra_encodings; encoding; - encoding = encoding->next) { - if(checkExtraEncoding(face, encoding->value, found)) { + for (encoding = extra_encodings; encoding; + encoding = encoding->next) { + if (checkExtraEncoding(face, encoding->value, found)) { /* Do not set found! */ snprintf(buf, MAXFONTNAMELEN, "%s-%s", - lp->value, encoding->value); - putHash(entries, buf, entry->d_name, PRIO(filePrio(entry->d_name))); + lp->value, encoding->value); + putHash(entries, buf, entry->d_name, + PRIO(filePrio(entry->d_name))); } } } - done: - if(have_face) + done: + if (have_face) FT_Done_Face(face); deepDestroyList(xlfd); xlfd = NULL; @@ -1000,17 +1038,17 @@ doDirectory(const char *dirname_given, int numEncodings, ListPtr encodingsToDo) #undef PRIO } - while(dirn--) + while (dirn--) free(namelist[dirn]); free(namelist); n = hashElements(entries); fprintf(fontscale, "%d\n", n); array = hashArray(entries, 1); - for(i = 0; i < n; i++) + for (i = 0; i < n; i++) fprintf(fontscale, "%s %s\n", array[i]->value, array[i]->key); destroyHashArray(array); entries = NULL; - if(fontscale_name) { + if (fontscale_name) { fclose(fontscale); free(fontscale_name); } @@ -1018,24 +1056,24 @@ doDirectory(const char *dirname_given, int numEncodings, ListPtr encodingsToDo) encodings: encdir = dsprintf("%s%s", dirname, "encodings.dir"); - if(encdir == NULL) { - perror("encodings"); - exit(1); + if (encdir == NULL) { + perror("encodings"); + exit(1); } unlink(encdir); if (numEncodings) { - encfile = fopen(encdir, "w"); - if(encfile == NULL) { - perror("open(encodings.dir)"); - exit(1); - } + encfile = fopen(encdir, "w"); + if (encfile == NULL) { + perror("open(encodings.dir)"); + exit(1); + } fprintf(encfile, "%d\n", numEncodings); encodingsToDo = sortList(encodingsToDo); - for(lp = encodingsToDo; lp; lp = lp->next) { + for (lp = encodingsToDo; lp; lp = lp->next) { fprintf(encfile, "%s\n", lp->value); } - fclose (encfile); + fclose(encfile); } free(dirname); @@ -1055,12 +1093,12 @@ checkEncoding(FT_Face face, const char *encoding_name) char *n; encoding = FontEncFind(encoding_name, NULL); - if(!encoding) + if (!encoding) return 0; /* An encoding is ``small'' if one of the following is true: - - it is linear and has no more than 256 codepoints; or - - it is a matrix encoding and has no more than one column. + - it is linear and has no more than 256 codepoints; or + - it is a matrix encoding and has no more than one column. For small encodings using Unicode indices, we require perfect coverage except for CODE_IGNORED and KOI-8 IBM-PC compatibility. @@ -1070,26 +1108,25 @@ checkEncoding(FT_Face face, const char *encoding_name) For encodings using PS names (currently Adobe Standard and Adobe Symbol only), we require perfect coverage. */ - - if(FT_Has_PS_Glyph_Names(face)) { - for(mapping = encoding->mappings; mapping; mapping = mapping->next) { - if(mapping->type == FONT_ENCODING_POSTSCRIPT) { - if(encoding->row_size > 0) { - for(i = encoding->first; i < encoding->size; i++) { - for(j = encoding->first_col; - j < encoding->row_size; - j++) { - n = FontEncName((i<<8) | j, mapping); - if(n && FT_Get_Name_Index(face, n) == 0) { + if (FT_Has_PS_Glyph_Names(face)) { + for (mapping = encoding->mappings; mapping; mapping = mapping->next) { + if (mapping->type == FONT_ENCODING_POSTSCRIPT) { + if (encoding->row_size > 0) { + for (i = encoding->first; i < encoding->size; i++) { + for (j = encoding->first_col; + j < encoding->row_size; j++) { + n = FontEncName((i << 8) | j, mapping); + if (n && FT_Get_Name_Index(face, n) == 0) { return 0; } } } return 1; - } else { - for(i = encoding->first; i < encoding->size; i++) { + } + else { + for (i = encoding->first; i < encoding->size; i++) { n = FontEncName(i, mapping); - if(n && FT_Get_Name_Index(face, n) == 0) { + if (n && FT_Get_Name_Index(face, n) == 0) { return 0; } } @@ -1099,61 +1136,66 @@ checkEncoding(FT_Face face, const char *encoding_name) } } - for(mapping = encoding->mappings; mapping; mapping = mapping->next) { - if(find_cmap(mapping->type, mapping->pid, mapping->eid, face)) { + for (mapping = encoding->mappings; mapping; mapping = mapping->next) { + if (find_cmap(mapping->type, mapping->pid, mapping->eid, face)) { int total = 0, failed = 0; - if(encoding->row_size > 0) { + + if (encoding->row_size > 0) { int estimate = (encoding->size - encoding->first) * (encoding->row_size - encoding->first_col); - for(i = encoding->first; i < encoding->size; i++) { - for(j = encoding->first_col; - j < encoding->row_size; - j++) { - c = FontEncRecode((i<<8) | j, mapping); - if(CODE_IGNORED(c)) { + for (i = encoding->first; i < encoding->size; i++) { + for (j = encoding->first_col; j < encoding->row_size; j++) { + c = FontEncRecode((i << 8) | j, mapping); + if (CODE_IGNORED(c)) { continue; - } else { - if(FT_Get_Char_Index(face, c) == 0) { + } + else { + if (FT_Get_Char_Index(face, c) == 0) { failed++; } total++; - if((encoding->size <= 1 && failed > 0) || - ((float)failed >= bigEncodingFuzz * estimate)) { + if ((encoding->size <= 1 && failed > 0) || + ((float) failed >= + bigEncodingFuzz * estimate)) { return 0; } } } } - if((float)failed >= total * bigEncodingFuzz) + if ((float) failed >= total * bigEncodingFuzz) return 0; else return 1; - } else { + } + else { int estimate = encoding->size - encoding->first; + /* For the KOI8 encodings, we ignore the lack of linedrawing and pseudo-math characters */ - if(strncmp(encoding->name, "koi8-", 5) == 0) + if (strncmp(encoding->name, "koi8-", 5) == 0) koi8 = 1; else koi8 = 0; - for(i = encoding->first; i < encoding->size; i++) { + for (i = encoding->first; i < encoding->size; i++) { c = FontEncRecode(i, mapping); - if(CODE_IGNORED(c) || - (koi8 && ((c >= 0x2200 && c < 0x2600) || c == 0x00b2))) { + if (CODE_IGNORED(c) || + (koi8 && + ((c >= 0x2200 && c < 0x2600) || c == 0x00b2))) { continue; - } else { - if(FT_Get_Char_Index(face, c) == 0) { + } + else { + if (FT_Get_Char_Index(face, c) == 0) { failed++; } total++; - if((encoding->size <= 256 && failed > 0) || - ((float)failed >= bigEncodingFuzz * estimate)) { + if ((encoding->size <= 256 && failed > 0) || + ((float) failed >= bigEncodingFuzz * estimate)) { return 0; } } } - if((float)failed >= total * bigEncodingFuzz) + if ((float) failed >= total * bigEncodingFuzz) return 0; else return 1; @@ -1171,43 +1213,43 @@ find_cmap(int type, int pid, int eid, FT_Face face) n = face->num_charmaps; - switch(type) { - case FONT_ENCODING_TRUETYPE: /* specific cmap */ - for(i=0; i<n; i++) { + switch (type) { + case FONT_ENCODING_TRUETYPE: /* specific cmap */ + for (i = 0; i < n; i++) { cmap = face->charmaps[i]; - if(cmap->platform_id == pid && cmap->encoding_id == eid) { + if (cmap->platform_id == pid && cmap->encoding_id == eid) { rc = FT_Set_Charmap(face, cmap); - if(rc == 0) + if (rc == 0) return 1; } } break; - case FONT_ENCODING_UNICODE: /* any Unicode cmap */ + case FONT_ENCODING_UNICODE: /* any Unicode cmap */ /* prefer Microsoft Unicode */ - for(i=0; i<n; i++) { + for (i = 0; i < n; i++) { cmap = face->charmaps[i]; - if(cmap->platform_id == TT_PLATFORM_MICROSOFT && - cmap->encoding_id == TT_MS_ID_UNICODE_CS) { + if (cmap->platform_id == TT_PLATFORM_MICROSOFT && + cmap->encoding_id == TT_MS_ID_UNICODE_CS) { rc = FT_Set_Charmap(face, cmap); - if(rc == 0) + if (rc == 0) return 1; } } /* Try Apple Unicode */ - for(i=0; i<n; i++) { + for (i = 0; i < n; i++) { cmap = face->charmaps[i]; - if(cmap->platform_id == TT_PLATFORM_APPLE_UNICODE) { + if (cmap->platform_id == TT_PLATFORM_APPLE_UNICODE) { rc = FT_Set_Charmap(face, cmap); - if(rc == 0) + if (rc == 0) return 1; } } /* ISO Unicode? */ - for(i=0; i<n; i++) { + for (i = 0; i < n; i++) { cmap = face->charmaps[i]; - if(cmap->platform_id == TT_PLATFORM_ISO) { + if (cmap->platform_id == TT_PLATFORM_ISO) { rc = FT_Set_Charmap(face, cmap); - if(rc == 0) + if (rc == 0) return 1; } } @@ -1223,49 +1265,56 @@ checkExtraEncoding(FT_Face face, const char *encoding_name, int found) { int c; - if(strcasecmp(encoding_name, "iso10646-1") == 0) { - if(doISO10646_1_encoding && find_cmap(FONT_ENCODING_UNICODE, -1, -1, face)) { + if (strcasecmp(encoding_name, "iso10646-1") == 0) { + if (doISO10646_1_encoding && + find_cmap(FONT_ENCODING_UNICODE, -1, -1, face)) { int cfound = 0; - /* Export as Unicode if there are at least 15 BMP + + /* Export as Unicode if there are at least 15 BMP characters that are not a space or ignored. */ - for(c = 0x21; c < 0x10000; c++) { - if(CODE_IGNORED(c)) + for (c = 0x21; c < 0x10000; c++) { + if (CODE_IGNORED(c)) continue; - if(FT_Get_Char_Index(face, c) > 0) + if (FT_Get_Char_Index(face, c) > 0) cfound++; - if(cfound >= 15) + if (cfound >= 15) return 1; } return 0; - } else + } + else return 0; - } else if(strcasecmp(encoding_name, "microsoft-symbol") == 0) { - if(find_cmap(FONT_ENCODING_TRUETYPE, - TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, - face)) + } + else if (strcasecmp(encoding_name, "microsoft-symbol") == 0) { + if (find_cmap(FONT_ENCODING_TRUETYPE, + TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, face)) return 1; else return 0; - } else if(strcasecmp(encoding_name, "adobe-fontspecific") == 0) { - if(!found) { - if(FT_Has_PS_Glyph_Names(face)) + } + else if (strcasecmp(encoding_name, "adobe-fontspecific") == 0) { + if (!found) { + if (FT_Has_PS_Glyph_Names(face)) return 1; else return 0; - } else + } + else return 0; - } else { + } + else { fprintf(stderr, "Unknown extra encoding %s\n", encoding_name); return 0; } } -static const char* +static const char * notice_foundry(const char *notice) { unsigned int i; - for(i = 0; i < countof(notice_foundries); i++) - if(notice && strstr(notice, notice_foundries[i][0])) + + for (i = 0; i < countof(notice_foundries); i++) + if (notice && strstr(notice, notice_foundries[i][0])) return notice_foundries[i][1]; return NULL; } @@ -1275,21 +1324,23 @@ vendor_match(const signed char *vendor, const char *vendor_string) { /* vendor is not necessarily NUL-terminated. */ size_t i, len; + len = strlen(vendor_string); - if(memcmp(vendor, vendor_string, len) != 0) + if (memcmp(vendor, vendor_string, len) != 0) return 0; - for(i = len; i < 4; i++) - if(vendor[i] != ' ' && vendor[i] != '\0') + for (i = len; i < 4; i++) + if (vendor[i] != ' ' && vendor[i] != '\0') return 0; return 1; } -static const char* +static const char * vendor_foundry(const signed char *vendor) { unsigned int i; - for(i = 0; i < countof(vendor_foundries); i++) - if(vendor_match(vendor, vendor_foundries[i][0])) + + for (i = 0; i < countof(vendor_foundries); i++) + if (vendor_match(vendor, vendor_foundries[i][0])) return vendor_foundries[i][1]; return NULL; } @@ -1302,43 +1353,45 @@ readEncodings(ListPtr encodings, char *dirname) struct dirent *file; char **names, **name; - if(strlen(dirname) > 1 && dirname[strlen(dirname) - 1] == '/') + if (strlen(dirname) > 1 && dirname[strlen(dirname) - 1] == '/') dirname[strlen(dirname) - 1] = '\0'; dirp = opendir(dirname); - if(dirp == NULL) { + if (dirp == NULL) { perror("opendir"); return -1; } - while((file = readdir(dirp)) != NULL) { + while ((file = readdir(dirp)) != NULL) { fullname = dsprintf("%s/%s", dirname, file->d_name); - if(fullname == NULL) { + if (fullname == NULL) { fprintf(stderr, "Couldn't allocate fullname\n"); closedir(dirp); return -1; } names = FontEncIdentify(fullname); - if(!names) + if (!names) continue; - for(name = names; *name; name++) { - if(fullname[0] != '/' && !relative) { + for (name = names; *name; name++) { + if (fullname[0] != '/' && !relative) { char *n; + n = dsprintf("%s%s", encodingPrefix, fullname); - if(n == NULL) { + if (n == NULL) { fprintf(stderr, "Couldn't allocate name\n"); closedir(dirp); return -1; } encodingsToDo = listConsF(encodingsToDo, "%s %s", *name, n); free(n); - } else { + } + else { encodingsToDo = listConsF(encodingsToDo, "%s %s", *name, fullname); } - if(encodingsToDo == NULL) { + if (encodingsToDo == NULL) { fprintf(stderr, "Couldn't allocate encodings\n"); closedir(dirp); return -1; |