sync with OpenBSD -current

This commit is contained in:
purplerain 2024-04-29 00:35:41 +00:00
parent 5d45cd7ee8
commit 155eb8555e
Signed by: purplerain
GPG key ID: F42C07F07E2E35B7
5506 changed files with 1786257 additions and 1416034 deletions

View file

@ -20,7 +20,7 @@
THE SOFTWARE.
*/
/*
* Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, Oracle and/or its affiliates.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@ -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];
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;
}
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;
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,13 +222,17 @@ getInt32(fontFile *f, int format)
unsigned char c[4];
rc = fontFileRead(f, c, 4);
if(rc != 4)
if (rc != 4)
return -1;
else {
unsigned int u[4] = { c[0], c[1], c[2], c[3] };
if(format & (1 << 2)) {
return (c[0] << 24) | (c[1] << 16) | (c[2] << 8) | (c[3]);
} else {
return (c[0]) | (c[1] << 8) | (c[2] << 16) | (c[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));
}
}
}
@ -230,12 +243,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);
@ -252,74 +265,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);
@ -328,31 +341,33 @@ 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) {
c = fontFileGetc(f);
if(c == ' ' || c == '\n') {
if(i <= 0)
int i = 0;
while (i < NKEY) {
int c = fontFileGetc(f);
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;
}
@ -363,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;
}
@ -376,31 +392,33 @@ bdfend(fontFile *f)
{
int c;
char *buf = NULL;
int bufsize = 0;
int i = 0;
size_t bufsize = 0;
unsigned int i = 0;
do {
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;
}
@ -409,7 +427,7 @@ bdfend(fontFile *f)
}
fail:
if(buf)
if (buf)
free(buf);
return NULL;
}
@ -418,34 +436,35 @@ static int
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) {
rc = bdfskip(f);
if(rc < 0)
while (1) {
if (!eol) {
int rc = bdfskip(f);
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: