This is mfrc.c in view mode; [Download] [Up]
#include <stdio.h> #include <sys/types.h> #include <strings.h> #include <ctype.h> #include <stdlib.h> #include "mfrc.h" int cmpid(rl1,rl2) ref_list *rl1, *rl2; { return rl1->id - rl2->id; } int main(argc,argv) int argc; char **argv; { char *progname; FILE *fp, *of; info_header infobuf; type_info typbuf; ref_list *rfptr, *rfent; unsigned char *pdata, *cp, *cp2; char onm[BUFSIZ], anm[BUFSIZ]; unsigned long rsrc,rsd,rsm; long rslen; unsigned short rstl; short rstypes; int c,len; progname = argv[0]; if (argc < 2) { fprintf(stderr, "Usage: %s file ...\n", progname); exit(1); } while (--argc) { ++argv; fp = fopen(*argv,"r"); if (fp == NULL) { perror(*argv); continue; } fprintf(stderr,"%s: ",*argv); if (fread(&infobuf,sizeof(info_header),1,fp) < 1 ) { fclose(fp); fprintf(stderr,"No header\n"); continue; } if (infobuf.version || infobuf.nlen) { rsrc = sizeof(info_header) + (infobuf.dlen[0]<<24) + (infobuf.dlen[1]<<16) + (infobuf.dlen[2]<<8) + infobuf.dlen[3]; if ((infobuf.type[0]!='L') || (infobuf.type[1]!='W') || (infobuf.type[2]!='F') || (infobuf.type[3]!='N')) { fclose(fp); fprintf(stderr,"File not type LWFN.\n"); continue; } if (rsrc > sizeof(info_header)) fseek(fp,rsrc,SEEK_SET); } else rsrc = 0; fread(&rsd,4,1,fp); fread(&rsm,4,1,fp); fseek(fp,rsrc+rsm+24,SEEK_SET); fread(&rstl,2,1,fp); fseek(fp,rsrc+rsm+rstl,SEEK_SET); fread(&rstypes,2,1,fp); while (rstypes >= 0) { fread(&typbuf,sizeof(typbuf),1,fp); if (typbuf.rtype == POST_TYPE) break; --rstypes; } if (rstypes < 0) { fclose(fp); fprintf(stderr,"No POST resources.\n"); continue; } /* Read list of POST resources and sort by resource ID */ fseek(fp,rsrc+rsm+rstl+typbuf.offset,SEEK_SET); rfptr = (ref_list *)malloc(sizeof(ref_list) * (typbuf.nrsc+1)); fread(rfptr,sizeof(ref_list),typbuf.nrsc+1,fp); qsort(rfptr,typbuf.nrsc+1,sizeof(ref_list),cmpid); /* Process POST resources */ of=NULL; onm[0] = '\0'; rfent = rfptr; len=0; while (typbuf.nrsc-- >= 0) { fseek(fp,rsrc+rsd+(rfent->offset & 0xffffff),SEEK_SET); fread(&rslen,4,1,fp); pdata = (unsigned char *)malloc(rslen); fread(pdata,rslen,1,fp); switch (pdata[0]) { case POST_TEXT: if (!of) { cp=pdata+2; while (cp < pdata+rslen) { if (*cp == '/') { if (!strncmp((char *)cp,"/FontName",9)) { cp += 9; if (isspace(*cp)) { while (*cp++ != '/'); cp2=(unsigned char *)onm; while (!isspace((char)*cp)) *cp2++ = *cp++; *cp2 = '\0'; break; } } } cp++; } if (!onm[0]) sprintf(onm,"%s.psf",*argv); of=fopen(onm,"w"); if (!of) { perror(onm); free(pdata); fprintf(stderr,"%s: ",*argv); continue; } } cp=pdata+2; while (cp < pdata+rslen) { if (*cp == '\r') *cp='\n'; cp++; } if (len) { fprintf(of,"\n"); len=0; } fwrite(pdata+2,rslen-2,1,of); break; case POST_DATA: if (!of) { fprintf(stderr, "Data before text.\n"); free(pdata); fprintf(stderr,"%s: ",*argv); continue; } cp=pdata+2; while (cp < pdata+rslen) { fprintf(of,"%02x",*cp++); if (++len > 31) { fprintf(of,"\n"); len = 0; } } break; case POST_END: break; default: fprintf(stderr, "Unknown POST resource type %d.\n", pdata[0]); } /* end switch */ free(pdata); ++rfent; } /* while more POST resources */ if (len) fprintf(of,"\n"); fclose(of); fclose(fp); free(rfptr); /* check for afm file */ if (!onm[0]) { fprintf(stderr,"no font data.\n"); continue; } fprintf(stderr,"converted to %s.\n",onm); strcpy(anm,*argv); strcat(anm,".afm"); fp=fopen(anm,"r"); if (!fp) continue; if (fread(&infobuf,sizeof(info_header),1,fp) < 1) { fclose(fp); continue; } if (infobuf.version || infobuf.nlen) { rslen = (infobuf.dlen[0]<<24) + (infobuf.dlen[1]<<16) + (infobuf.dlen[2]<<8) + infobuf.dlen[3]; if (rslen < 1) { fclose(fp); continue; } } else rslen=0; strcat(onm,".afm"); of=fopen(onm,"w"); if (!of) { fclose(fp); continue; } do { c=getc(fp); if (c=='\r') putc('\n',of); else putc(c,of); } while (--rslen); fclose(of); fclose(fp); } /* while more files */ return 0; } /* end main */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.