+ t1_font *tf = snew(t1_font);
+
+ tf->data = load_pfa_file(in->currfp, &in->pos);
+ tf->pos = in->pos;
+ tf->length1 = tf->length2 = 0;
+ fclose(in->currfp);
+ pf_identify(tf);
+}
+
+void read_pfb_file(input *in) {
+ t1_font *tf = snew(t1_font);
+
+ tf->data = load_pfb_file(in->currfp, &in->pos);
+ tf->pos = in->pos;
+ tf->length1 = tf->length2 = 0;
+ fclose(in->currfp);
+ pf_identify(tf);
+}
+static char *pf_read_token(pfstate *);
+
+/*
+ * Read a character from the initial plaintext part of a Type 1 font
+ */
+static int pf_getc(pfstate *pf) {
+ if (pf->offset == pf->curblock->length) {
+ if (pf->curblock->next == NULL) return EOF;
+ pf->curblock = pf->curblock->next;
+ pf->offset = 0;
+ }
+ if (pf->curblock->type != PFB_ASCII) return EOF;
+ return pf->curblock->data[pf->offset++];
+}
+
+static void pf_ungetc(int c, pfstate *pf) {
+ assert(pf->offset > 0);
+ pf->offset--;
+ assert(c == pf->curblock->data[pf->offset]);
+}
+
+static void pf_rewind(pfstate *pf) {
+ pf->curblock = pf->data;
+ pf->offset = 0;
+}
+
+static void pf_seek(pfstate *pf, size_t off) {
+ t1_data *td = pf->data;
+
+ while (td->length < off) {
+ off -= td->length;
+ td = td->next;
+ }
+ pf->curblock = td;
+ pf->offset = off;
+}
+
+static size_t pf_tell(pfstate *pf) {
+ t1_data *td = pf->data;
+ size_t o = 0;
+
+ while (td != pf->curblock) {
+ o += td->length;
+ td = td->next;
+ }
+ return o + pf->offset;
+}
+
+static void pf_identify(t1_font *tf) {