Blob
1 #include <u.h>2 #include <libc.h>3 #include <draw.h>4 #include <memdraw.h>6 Memsubfont*7 openmemsubfont(char *name)8 {9 Memsubfont *sf;10 Memimage *i;11 Fontchar *fc;12 int fd, n;13 char hdr[3*12+4+1];14 uchar *p;16 fd = open(name, OREAD);17 if(fd < 0)18 return nil;19 p = nil;20 i = readmemimage(fd);21 if(i == nil)22 goto Err;23 if(read(fd, hdr, 3*12) != 3*12){24 werrstr("openmemsubfont: header read error: %r");25 goto Err;26 }27 n = atoi(hdr);28 p = malloc(6*(n+1));29 if(p == nil)30 goto Err;31 if(read(fd, p, 6*(n+1)) != 6*(n+1)){32 werrstr("openmemsubfont: fontchar read error: %r");33 goto Err;34 }35 fc = malloc(sizeof(Fontchar)*(n+1));36 if(fc == nil)37 goto Err;38 _unpackinfo(fc, p, n);39 sf = allocmemsubfont(name, n, atoi(hdr+12), atoi(hdr+24), fc, i);40 if(sf == nil){41 free(fc);42 goto Err;43 }44 free(p);45 return sf;46 Err:47 close(fd);48 if (i != nil)49 freememimage(i);50 if (p != nil)51 free(p);52 return nil;53 }