Blame


1 76193d7c 2003-09-30 devnull #include <u.h>
2 76193d7c 2003-09-30 devnull #include <libc.h>
3 76193d7c 2003-09-30 devnull #include <draw.h>
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull static char*
6 76193d7c 2003-09-30 devnull skip(char *s)
7 76193d7c 2003-09-30 devnull {
8 76193d7c 2003-09-30 devnull while(*s==' ' || *s=='\n' || *s=='\t')
9 76193d7c 2003-09-30 devnull s++;
10 76193d7c 2003-09-30 devnull return s;
11 76193d7c 2003-09-30 devnull }
12 76193d7c 2003-09-30 devnull
13 76193d7c 2003-09-30 devnull Font*
14 76193d7c 2003-09-30 devnull buildfont(Display *d, char *buf, char *name)
15 76193d7c 2003-09-30 devnull {
16 76193d7c 2003-09-30 devnull Font *fnt;
17 76193d7c 2003-09-30 devnull Cachefont *c;
18 76193d7c 2003-09-30 devnull char *s, *t;
19 76193d7c 2003-09-30 devnull ulong min, max;
20 76193d7c 2003-09-30 devnull int offset;
21 76193d7c 2003-09-30 devnull char badform[] = "bad font format: number expected (char position %d)";
22 76193d7c 2003-09-30 devnull
23 76193d7c 2003-09-30 devnull s = buf;
24 76193d7c 2003-09-30 devnull fnt = malloc(sizeof(Font));
25 76193d7c 2003-09-30 devnull if(fnt == 0)
26 76193d7c 2003-09-30 devnull return 0;
27 76193d7c 2003-09-30 devnull memset(fnt, 0, sizeof(Font));
28 76193d7c 2003-09-30 devnull fnt->display = d;
29 76193d7c 2003-09-30 devnull fnt->name = strdup(name);
30 76193d7c 2003-09-30 devnull fnt->ncache = NFCACHE+NFLOOK;
31 76193d7c 2003-09-30 devnull fnt->nsubf = NFSUBF;
32 76193d7c 2003-09-30 devnull fnt->cache = malloc(fnt->ncache * sizeof(fnt->cache[0]));
33 76193d7c 2003-09-30 devnull fnt->subf = malloc(fnt->nsubf * sizeof(fnt->subf[0]));
34 76193d7c 2003-09-30 devnull if(fnt->name==0 || fnt->cache==0 || fnt->subf==0){
35 76193d7c 2003-09-30 devnull Err2:
36 76193d7c 2003-09-30 devnull free(fnt->name);
37 76193d7c 2003-09-30 devnull free(fnt->cache);
38 76193d7c 2003-09-30 devnull free(fnt->subf);
39 76193d7c 2003-09-30 devnull free(fnt->sub);
40 76193d7c 2003-09-30 devnull free(fnt);
41 76193d7c 2003-09-30 devnull return 0;
42 76193d7c 2003-09-30 devnull }
43 76193d7c 2003-09-30 devnull fnt->height = strtol(s, &s, 0);
44 76193d7c 2003-09-30 devnull s = skip(s);
45 76193d7c 2003-09-30 devnull fnt->ascent = strtol(s, &s, 0);
46 76193d7c 2003-09-30 devnull s = skip(s);
47 76193d7c 2003-09-30 devnull if(fnt->height<=0 || fnt->ascent<=0){
48 76193d7c 2003-09-30 devnull werrstr("bad height or ascent in font file");
49 76193d7c 2003-09-30 devnull goto Err2;
50 76193d7c 2003-09-30 devnull }
51 76193d7c 2003-09-30 devnull fnt->width = 0;
52 76193d7c 2003-09-30 devnull fnt->nsub = 0;
53 76193d7c 2003-09-30 devnull fnt->sub = 0;
54 76193d7c 2003-09-30 devnull
55 76193d7c 2003-09-30 devnull memset(fnt->subf, 0, fnt->nsubf * sizeof(fnt->subf[0]));
56 76193d7c 2003-09-30 devnull memset(fnt->cache, 0, fnt->ncache*sizeof(fnt->cache[0]));
57 76193d7c 2003-09-30 devnull fnt->age = 1;
58 76193d7c 2003-09-30 devnull do{
59 76193d7c 2003-09-30 devnull /* must be looking at a number now */
60 76193d7c 2003-09-30 devnull if(*s<'0' || '9'<*s){
61 76193d7c 2003-09-30 devnull werrstr(badform, s-buf);
62 76193d7c 2003-09-30 devnull goto Err3;
63 76193d7c 2003-09-30 devnull }
64 76193d7c 2003-09-30 devnull min = strtol(s, &s, 0);
65 76193d7c 2003-09-30 devnull s = skip(s);
66 76193d7c 2003-09-30 devnull /* must be looking at a number now */
67 76193d7c 2003-09-30 devnull if(*s<'0' || '9'<*s){
68 76193d7c 2003-09-30 devnull werrstr(badform, s-buf);
69 76193d7c 2003-09-30 devnull goto Err3;
70 76193d7c 2003-09-30 devnull }
71 76193d7c 2003-09-30 devnull max = strtol(s, &s, 0);
72 76193d7c 2003-09-30 devnull s = skip(s);
73 76193d7c 2003-09-30 devnull if(*s==0 || min>=65536 || max>=65536 || min>max){
74 76193d7c 2003-09-30 devnull werrstr("illegal subfont range");
75 76193d7c 2003-09-30 devnull Err3:
76 76193d7c 2003-09-30 devnull freefont(fnt);
77 76193d7c 2003-09-30 devnull return 0;
78 76193d7c 2003-09-30 devnull }
79 76193d7c 2003-09-30 devnull t = s;
80 76193d7c 2003-09-30 devnull offset = strtol(s, &t, 0);
81 76193d7c 2003-09-30 devnull if(t>s && (*t==' ' || *t=='\t' || *t=='\n'))
82 76193d7c 2003-09-30 devnull s = skip(t);
83 76193d7c 2003-09-30 devnull else
84 76193d7c 2003-09-30 devnull offset = 0;
85 76193d7c 2003-09-30 devnull fnt->sub = realloc(fnt->sub, (fnt->nsub+1)*sizeof(Cachefont*));
86 76193d7c 2003-09-30 devnull if(fnt->sub == 0){
87 76193d7c 2003-09-30 devnull /* realloc manual says fnt->sub may have been destroyed */
88 76193d7c 2003-09-30 devnull fnt->nsub = 0;
89 76193d7c 2003-09-30 devnull goto Err3;
90 76193d7c 2003-09-30 devnull }
91 76193d7c 2003-09-30 devnull c = malloc(sizeof(Cachefont));
92 76193d7c 2003-09-30 devnull if(c == 0)
93 76193d7c 2003-09-30 devnull goto Err3;
94 76193d7c 2003-09-30 devnull fnt->sub[fnt->nsub] = c;
95 76193d7c 2003-09-30 devnull c->min = min;
96 76193d7c 2003-09-30 devnull c->max = max;
97 76193d7c 2003-09-30 devnull c->offset = offset;
98 76193d7c 2003-09-30 devnull t = s;
99 76193d7c 2003-09-30 devnull while(*s && *s!=' ' && *s!='\n' && *s!='\t')
100 76193d7c 2003-09-30 devnull s++;
101 76193d7c 2003-09-30 devnull *s++ = 0;
102 76193d7c 2003-09-30 devnull c->subfontname = 0;
103 76193d7c 2003-09-30 devnull c->name = strdup(t);
104 76193d7c 2003-09-30 devnull if(c->name == 0){
105 76193d7c 2003-09-30 devnull free(c);
106 76193d7c 2003-09-30 devnull goto Err3;
107 76193d7c 2003-09-30 devnull }
108 76193d7c 2003-09-30 devnull s = skip(s);
109 76193d7c 2003-09-30 devnull fnt->nsub++;
110 76193d7c 2003-09-30 devnull }while(*s);
111 76193d7c 2003-09-30 devnull return fnt;
112 76193d7c 2003-09-30 devnull }
113 76193d7c 2003-09-30 devnull
114 76193d7c 2003-09-30 devnull void
115 76193d7c 2003-09-30 devnull freefont(Font *f)
116 76193d7c 2003-09-30 devnull {
117 76193d7c 2003-09-30 devnull int i;
118 76193d7c 2003-09-30 devnull Cachefont *c;
119 76193d7c 2003-09-30 devnull Subfont *s;
120 76193d7c 2003-09-30 devnull
121 76193d7c 2003-09-30 devnull if(f == 0)
122 76193d7c 2003-09-30 devnull return;
123 76193d7c 2003-09-30 devnull
124 76193d7c 2003-09-30 devnull for(i=0; i<f->nsub; i++){
125 76193d7c 2003-09-30 devnull c = f->sub[i];
126 76193d7c 2003-09-30 devnull free(c->subfontname);
127 76193d7c 2003-09-30 devnull free(c->name);
128 76193d7c 2003-09-30 devnull free(c);
129 76193d7c 2003-09-30 devnull }
130 76193d7c 2003-09-30 devnull for(i=0; i<f->nsubf; i++){
131 76193d7c 2003-09-30 devnull s = f->subf[i].f;
132 76193d7c 2003-09-30 devnull if(s && s!=display->defaultsubfont)
133 76193d7c 2003-09-30 devnull freesubfont(s);
134 76193d7c 2003-09-30 devnull }
135 76193d7c 2003-09-30 devnull freeimage(f->cacheimage);
136 76193d7c 2003-09-30 devnull free(f->name);
137 76193d7c 2003-09-30 devnull free(f->cache);
138 76193d7c 2003-09-30 devnull free(f->subf);
139 76193d7c 2003-09-30 devnull free(f->sub);
140 76193d7c 2003-09-30 devnull free(f);
141 76193d7c 2003-09-30 devnull }