#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdarg.h>
#include <X11/fonts/fntfilst.h>
#include <X11/fonts/fontstruct.h>
#include <X11/fonts/bitmap.h>
#include <X11/fonts/bdfint.h>
int bdfFileLineNum;
void
bdfError(char* message, ...)
{
va_list args;
va_start (args, message);
fprintf(stderr, "BDF Error on line %d: ", bdfFileLineNum);
vfprintf(stderr, message, args);
va_end (args);
}
void
bdfWarning(char *message, ...)
{
va_list args;
va_start (args, message);
fprintf(stderr, "BDF Warning on line %d: ", bdfFileLineNum);
vfprintf(stderr, message, args);
va_end (args);
}
unsigned char *
bdfGetLine(FontFilePtr file, unsigned char *buf, int len)
{
int c;
unsigned char *b;
for (;;) {
b = buf;
while ((c = FontFileGetc(file)) != FontFileEOF) {
if (c == '\r')
continue;
if (c == '\n') {
bdfFileLineNum++;
break;
}
if (b - buf >= (len - 1))
break;
*b++ = c;
}
*b = '\0';
if (c == FontFileEOF)
return NULL;
if (b != buf && !bdfIsPrefix(buf, "COMMENT"))
break;
}
return buf;
}
Atom
bdfForceMakeAtom(char *str, int *size)
{
register int len = strlen(str);
Atom the_atom;
if (size != NULL)
*size += len + 1;
the_atom = MakeAtom(str, len, TRUE);
if (the_atom == None)
bdfError("Atom allocation failed\n");
return the_atom;
}
Atom
bdfGetPropertyValue(char *s)
{
register char *p,
*pp;
char *orig_s = s;
Atom atom;
while (*s && (*s == ' ' || *s == '\t'))
s++;
if (*s == 0) {
return bdfForceMakeAtom(s, NULL);
}
if (*s != '"') {
pp = s;
for (pp = s; *pp; pp++)
if (*pp == ' ' || *pp == '\t' || *pp == '\015' || *pp == '\n') {
*pp = 0;
break;
}
return bdfForceMakeAtom(s, NULL);
}
s++;
pp = p = malloc((unsigned) strlen(s) + 1);
if (pp == NULL) {
bdfError("Couldn't allocate property value string (%d)\n", strlen(s) + 1);
return None;
}
while (*s) {
if (*s == '"') {
if (*(s + 1) != '"') {
*p++ = 0;
atom = bdfForceMakeAtom(pp, NULL);
free(pp);
return atom;
} else {
s++;
}
}
*p++ = *s++;
}
free (pp);
bdfError("unterminated quoted string property: %s\n", (pointer) orig_s);
return None;
}
int
bdfIsInteger(char *str)
{
char c;
c = *str++;
if (!(isdigit(c) || c == '-' || c == '+'))
return (FALSE);
while ((c = *str++))
if (!isdigit(c))
return (FALSE);
return (TRUE);
}
unsigned char
bdfHexByte(unsigned char *s)
{
unsigned char b = 0;
register char c;
int i;
for (i = 2; i; i--) {
c = *s++;
if ((c >= '0') && (c <= '9'))
b = (b << 4) + (c - '0');
else if ((c >= 'A') && (c <= 'F'))
b = (b << 4) + 10 + (c - 'A');
else if ((c >= 'a') && (c <= 'f'))
b = (b << 4) + 10 + (c - 'a');
else
bdfError("bad hex char '%c'", c);
}
return b;
}
static char *SpecialAtoms[] = {
"FONT_ASCENT",
#define BDF_FONT_ASCENT 0
"FONT_DESCENT",
#define BDF_FONT_DESCENT 1
"DEFAULT_CHAR",
#define BDF_DEFAULT_CHAR 2
"POINT_SIZE",
#define BDF_POINT_SIZE 3
"RESOLUTION",
#define BDF_RESOLUTION 4
"X_HEIGHT",
#define BDF_X_HEIGHT 5
"WEIGHT",
#define BDF_WEIGHT 6
"QUAD_WIDTH",
#define BDF_QUAD_WIDTH 7
"FONT",
#define BDF_FONT 8
"RESOLUTION_X",
#define BDF_RESOLUTION_X 9
"RESOLUTION_Y",
#define BDF_RESOLUTION_Y 10
0,
};
Bool
bdfSpecialProperty(FontPtr pFont, FontPropPtr prop,
char isString, bdfFileState *bdfState)
{
char **special;
char *name;
name = NameForAtom(prop->name);
for (special = SpecialAtoms; *special; special++)
if (!strcmp(name, *special))
break;
switch (special - SpecialAtoms) {
case BDF_FONT_ASCENT:
if (!isString) {
pFont->info.fontAscent = prop->value;
bdfState->haveFontAscent = TRUE;
}
return TRUE;
case BDF_FONT_DESCENT:
if (!isString) {
pFont->info.fontDescent = prop->value;
bdfState->haveFontDescent = TRUE;
}
return TRUE;
case BDF_DEFAULT_CHAR:
if (!isString) {
pFont->info.defaultCh = prop->value;
bdfState->haveDefaultCh = TRUE;
}
return TRUE;
case BDF_POINT_SIZE:
bdfState->pointSizeProp = prop;
return FALSE;
case BDF_RESOLUTION:
bdfState->resolutionProp = prop;
return FALSE;
case BDF_X_HEIGHT:
bdfState->xHeightProp = prop;
return FALSE;
case BDF_WEIGHT:
bdfState->weightProp = prop;
return FALSE;
case BDF_QUAD_WIDTH:
bdfState->quadWidthProp = prop;
return FALSE;
case BDF_FONT:
bdfState->fontProp = prop;
return FALSE;
case BDF_RESOLUTION_X:
bdfState->resolutionXProp = prop;
return FALSE;
case BDF_RESOLUTION_Y:
bdfState->resolutionYProp = prop;
return FALSE;
default:
return FALSE;
}
}