#include #include #include #define BUFFSIZE 1024 #define TRUE (-1) #define FALSE 0 // convert hexa-decimal character to integer int hex2i(char c) { if (c >= '0' && c <= '9') { return c - '0'; } if (c >= 'A' && c <= 'F') { return c - 'A' + 10; } if (c >= 'a' && c <= 'f') { return c - 'a' + 10; } return -1; } int main(int argc, char *argv[]) { FILE *fp = stdin; char buff[BUFFSIZE]; char data[BUFFSIZE]; int width = -1; int height; int dummy[2]; int code; int data_flag = FALSE; int i; int j; // input file handling if (argc == 2 && (fp = fopen(argv[1], "r")) == NULL) { fprintf(stderr, "fopen(%s) failed.\n", argv[1]); exit(1); } else if (argc > 2) { fprintf(stderr, "too many parameters\n"); exit(1); } // process each line of BDF file while (fgets(buff, BUFFSIZE, fp) != NULL) { if (data_flag) { // handle each pixel patterns if (strncmp(buff, "ENDCHAR", (size_t)7) == 0) { for (i = 0; i < width + 2; i++) { putchar('+'); } printf("\n\n"); data_flag = FALSE; } else { if (sscanf(buff, "%s", data) == 1) { putchar('+'); for (i = 0; i < width; i += 4) { code = hex2i(data[i / 4]); if (code < 0) { break; } for (j = 0; j < 4; j++) { if (i + j >= width) { break; } putchar( (code & (1 << (3 - j))) ? '*' : ' ' ); } } putchar('+'); putchar('\n'); } else { fprintf(stderr, "code read failed\n"); exit(1); } } continue; } // read parrameters if (strncmp(buff, "FONTBOUNDINGBOX", (size_t)14) == 0) { // get pixel pattern size if (sscanf(buff, "FONTBOUNDINGBOX %d %d %d %d", &width, &height, &dummy[0], &dummy[1]) == 4) { printf("bitmap %d x %d\n", width, height); } else { fprintf(stderr, "FONTBOUNDINGBOX params lost\n"); exit(1); } } else if (strncmp(buff, "ENCODING", (size_t)8) == 0) { // read character code if (sscanf(buff, "ENCODING %d", &code) == 1) { printf("code 0x%x\n", code); for (i = 0; i < width + 2; i++) { putchar('+'); } putchar('\n'); } else { fprintf(stderr, "code not found\n"); exit(1); } } else if (strncmp(buff, "BITMAP", (size_t)6) == 0) { // below lines are pixel patterns data_flag = TRUE; } } return 0; }