Mercurial > hg > Members > kono > os9 > sbc09
annotate mc09/mclibos9.c @ 175:c83545730d6c
openm
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Sun, 14 Apr 2019 17:17:34 +0900 |
parents | 1a30cd6e5973 |
children |
rev | line source |
---|---|
111
c4e909f21b25
micro c,j self compiled on os9 level2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
110
diff
changeset
|
1 /* os9 driver */ |
101 | 2 |
3 | |
110
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
4 int errno = 0; |
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
5 |
101 | 6 typedef struct { |
132 | 7 int fd; /* 0 */ |
8 int fmode; /* 2 */ | |
133
2562c18c904e
malloc for mc2 wrong...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
132
diff
changeset
|
9 int length; /* 4 */ |
132 | 10 char *fname; /* 6 */ |
11 char *ptr; /* 8 */ | |
133
2562c18c904e
malloc for mc2 wrong...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
132
diff
changeset
|
12 char *buf; /* 10 */ |
101 | 13 } FILE ; |
14 | |
15 #define FCBSIZE (sizeof(FILE)) | |
132 | 16 #define BUFSIZ 256 |
101 | 17 |
99 | 18 #define NFILES 8 |
19 | |
20 #define NULL 0 | |
21 #define EOF (-1) | |
22 | |
23 #define stdin _fcbtbl[0] | |
24 #define stdout _fcbtbl[1] | |
25 #define stderr _fcbtbl[2] | |
26 | |
27 FILE *_fcbtbl[NFILES]; | |
28 | |
101 | 29 FILE _s0[3]; |
30 | |
105 | 31 _main(prog,args) |
32 char *prog; | |
101 | 33 char *args; |
99 | 34 {int i; |
104 | 35 char **argv,*p,*q; |
101 | 36 int argc,n,quote,c; |
99 | 37 initheap(); |
134
42592ea2966f
fix fclose/mfree problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
38 stdin = (FILE*) malloc(sizeof(FILE)); initfp(stdin,0); |
42592ea2966f
fix fclose/mfree problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
39 stdout = (FILE*) malloc(sizeof(FILE)); initfp(stdout,1); |
42592ea2966f
fix fclose/mfree problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
40 stderr = (FILE*) malloc(sizeof(FILE)); initfp(stderr,2); |
99 | 41 for ( i = 3; i < NFILES; i++ ) _fcbtbl[i] = NULL; |
101 | 42 /* create argv here */ |
43 argc = 0; | |
44 argv = 0; | |
45 for( i = 0; i < 2 ; i++ ) { | |
111
c4e909f21b25
micro c,j self compiled on os9 level2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
110
diff
changeset
|
46 q = p = args; |
104 | 47 if (i==1) { |
48 argv = (char**)malloc(sizeof(char*)*(argc+1)); | |
49 argv[0] = prog; | |
50 } | |
51 n = 1; | |
52 quote = 0; | |
53 if (i==1) argv[n] = args; | |
105 | 54 while((c = *p) && c!='\r') { |
101 | 55 if (c=='\'') { |
56 if (!quote) { | |
105 | 57 p++; |
101 | 58 quote = 1; |
59 } else { | |
105 | 60 p++; |
104 | 61 if (i==1) *q=0; |
101 | 62 quote = 0; |
63 } | |
64 } else if (c=='\\') { | |
65 p++; | |
66 } else if (c==' ') { | |
104 | 67 if (!quote) { |
68 if (i==1) { | |
105 | 69 *q = 0; argv[++n] = q+1; |
104 | 70 } |
71 } | |
101 | 72 } |
104 | 73 if (i==1) *q = *p; |
74 q++; p++; | |
101 | 75 } |
108 | 76 if (i==1&&p!=args) { *q = 0; argv[++n] = q+1; } |
104 | 77 argc = n; |
101 | 78 } |
104 | 79 argv[n]=0; |
132 | 80 exit(main(argc,argv)); |
81 } | |
82 | |
83 | |
84 exit(e) | |
85 int e; | |
86 { | |
87 int i; | |
88 for ( i = 3; i < NFILES; i++ ) { | |
89 if (_fcbtbl[i]) | |
90 fclose(_fcbtbl[i]); | |
91 } | |
92 #asm | |
133
2562c18c904e
malloc for mc2 wrong...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
132
diff
changeset
|
93 ldb 4,u |
132 | 94 os9 F$Exit |
95 #endasm | |
96 } | |
97 | |
98 initfp(fp,d) | |
99 FILE *fp; | |
100 int fd; | |
101 { | |
102 fp->fd = d; | |
134
42592ea2966f
fix fclose/mfree problem
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
133
diff
changeset
|
103 fp->buf = (char*)malloc(BUFSIZ+1); |
132 | 104 fp->ptr = fp->buf; |
105 fp->fname = fp->length = fp->fmode = 0; | |
99 | 106 } |
107 | |
108 FILE *fopen(name,mode) | |
109 char *name,*mode; | |
110 {FILE *fcbp; | |
111 char *p; | |
112 int rd,wt,cm; | |
113 rd = wt = cm = 0; | |
114 for ( p = mode; *p; p++ ) { | |
115 switch ( *p ) { | |
116 case 'r': | |
110
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
117 rd = 1; cm |= 1; break; |
99 | 118 case 'w': |
111
c4e909f21b25
micro c,j self compiled on os9 level2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
110
diff
changeset
|
119 wt = 1; cm |= 3; break; |
c4e909f21b25
micro c,j self compiled on os9 level2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
110
diff
changeset
|
120 case 'c': /* charcter mode */ |
c4e909f21b25
micro c,j self compiled on os9 level2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
110
diff
changeset
|
121 cm = 1; break; |
99 | 122 default: |
123 return NULL; | |
124 } | |
125 } | |
126 if ( !(rd ^ wt) ) return NULL; | |
127 if ( rd ) return _open(name,cm); | |
128 else return _create(name,cm); | |
129 } | |
130 | |
131 FILE *_open(name,cm) | |
132 char *name; | |
133 int cm; | |
134 {FILE *fcbp; | |
135 int i; | |
136 for ( i = 0; i < NFILES; i++) | |
137 if ( _fcbtbl[i] == NULL ) break; | |
138 if ( i >= NFILES) return NULL; | |
139 if ( (fcbp = malloc(FCBSIZE)) == NULL ) return NULL; | |
140 if ( _setname(name,fcbp) == 0 ) return NULL; | |
101 | 141 #asm |
142 pshs x,y,u | |
109 | 143 ldx -2,u |
110
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
144 lda 7,u mode |
133
2562c18c904e
malloc for mc2 wrong...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
132
diff
changeset
|
145 ldx 6,x name |
101 | 146 os9 I$Open |
110
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
147 bcs _LC0001 |
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
148 ldx -2,u |
106 | 149 tfr a,b |
150 clra | |
101 | 151 std ,x |
152 bra _LC0002 | |
153 _LC0001 | |
110
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
154 ldx -2,u |
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
155 tfr a,b |
101 | 156 clra |
106 | 157 std 2,x err code |
101 | 158 ldd #-1 |
159 std ,x | |
160 _LC0002 | |
161 puls x,y,u | |
162 #endasm | |
132 | 163 if (fcbp->fd < 0 ) { errno = fcbp->fmode ; *mfree(fcbp); return NULL; } |
164 initfp(fcbp,i); | |
165 fcbp->fmode = cm; | |
99 | 166 return (_fcbtbl[i] = fcbp); |
167 } | |
168 | |
169 FILE *_create(name,cm) | |
170 char *name; | |
171 int cm; | |
172 {FILE *fcbp; | |
173 int i; | |
174 for ( i = 0; i < NFILES; i++) | |
175 if ( _fcbtbl[i] == NULL ) break; | |
176 if ( i >= NFILES) return NULL; | |
177 if ( (fcbp = malloc(FCBSIZE)) == NULL ) return NULL; | |
178 if ( _setname(name,fcbp) == 0 ) return NULL; | |
101 | 179 #asm |
180 pshs x,y,u | |
109 | 181 ldx -2,u |
110
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
182 lda 7,u mode |
111
c4e909f21b25
micro c,j self compiled on os9 level2
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
110
diff
changeset
|
183 ldb #3 |
133
2562c18c904e
malloc for mc2 wrong...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
132
diff
changeset
|
184 ldx 6,x name |
103
844305752064
no compile errors on mc09
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
185 os9 I$Create |
110
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
186 bcs _LC0003 |
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
187 ldx -2,u |
106 | 188 tfr a,b |
189 clra | |
101 | 190 std ,x |
103
844305752064
no compile errors on mc09
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
191 bra _LC0004 |
844305752064
no compile errors on mc09
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
192 _LC0003 |
110
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
193 ldx -2,u |
098b3feab38c
mc09 test program worked
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
109
diff
changeset
|
194 tfr a,b |
101 | 195 clra |
196 stD 2,x err code | |
197 ldd #-1 | |
198 std ,x | |
103
844305752064
no compile errors on mc09
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
102
diff
changeset
|
199 _LC0004 |
101 | 200 puls x,y,u |
201 #endasm | |
132 | 202 if (fcbp->fd < 0 ) { errno = fcbp->fmode ; mfree(fcbp); return NULL; } |
203 initfp(fcbp,i); | |
204 fcbp->fmode = cm; | |
99 | 205 return (_fcbtbl[i] = fcbp); |
206 } | |
207 | |
208 fclose(fcbp) | |
209 FILE *fcbp; | |
210 {int i; | |
211 for ( i = 0; i < NFILES; i++ ) | |
212 if ( fcbp == _fcbtbl[i] ) break; | |
213 if ( i >= NFILES ) return EOF; | |
132 | 214 if ((fcbp->fmode&3) && fcbp->ptr!=fcbp->buf) { |
215 fflush(fcbp); | |
216 } | |
101 | 217 #asm |
218 pshs x,y,u | |
109 | 219 ldx 4,u |
106 | 220 lda 1,x |
101 | 221 os9 I$Close |
222 puls x,y,u | |
223 #endasm | |
132 | 224 _fcbtbl[i] = NULL; |
225 if (fcbp->buf) mfree(fcbp->buf); | |
226 mfree(fcbp); | |
99 | 227 return 0; |
228 } | |
229 | |
230 _setname(name,fcbp) | |
109 | 231 char *name; FILE *fcbp; |
232 { | |
233 fcbp->fname = name; | |
99 | 234 return 1; |
235 } | |
236 | |
237 | |
238 getc(fcbp) | |
132 | 239 FILE *fcbp; |
99 | 240 { |
132 | 241 int len; |
242 char *buff; | |
243 if (fcbp->buf) { | |
244 if (fcbp->ptr < fcbp->buf+fcbp->length) { | |
245 return (*fcbp->ptr++)&0xff; | |
246 } | |
247 len = BUFSIZ; fcbp->ptr = buff = fcbp->buf; | |
248 } else { | |
249 len = 1 ; fcbp->ptr = buff = &len; | |
250 } | |
101 | 251 #asm |
108 | 252 pshs y |
132 | 253 ldx 4,u FILE |
101 | 254 lda 1,x file descriptor |
132 | 255 ldx -4,u buf |
256 ldy -2,u len | |
101 | 257 os9 I$Read |
132 | 258 sty -2,u len |
108 | 259 puls y |
101 | 260 #endasm |
132 | 261 if (len<=0) { fcbp->length=0; return -1; } |
262 fcbp->length=len; | |
263 return (*fcbp->ptr++)&0xff; | |
264 } | |
265 | |
266 fflush(fcbp) | |
267 FILE *fcbp; | |
268 { | |
269 int len; | |
270 char *buff; | |
271 if (fcbp->buf==0) | |
272 return; | |
273 len = fcbp->ptr - fcbp->buf; | |
274 if (len==0) return; | |
275 buff = fcbp->buf; | |
276 #asm | |
277 pshs y | |
278 ldx 4,u FILE | |
279 lda 1,x file descriptor | |
280 ldx -4,u | |
281 ldy -2,u | |
282 os9 I$Write | |
283 sty -2,u | |
284 puls y | |
285 #endasm | |
286 fcbp->ptr = fcbp->buf; | |
99 | 287 } |
288 | |
289 putc(c,fcbp) | |
132 | 290 char c; FILE *fcbp; |
101 | 291 { |
132 | 292 int len; |
293 if (!fcbp->buf) { | |
294 fcbp->buf=&c; fcbp->ptr=fcbp->buf+1; | |
295 fflush(fcbp); | |
296 fcbp->buf = 0; | |
297 return; | |
298 } else if (fcbp->ptr >= fcbp->buf+BUFSIZ) { | |
299 fflush(fcbp); | |
300 } | |
301 *fcbp->ptr++ = c; | |
99 | 302 } |
303 | |
304 getchar() | |
305 { return getc(stdin); | |
306 } | |
307 | |
308 putchar(c) | |
309 char c; | |
310 { return putc(c,stdout); | |
311 } | |
312 | |
313 printf(s) | |
314 char *s; | |
315 { _fprintf(stdout,s,(int *)&s+1); | |
316 } | |
317 | |
318 fprintf(f,s) | |
319 char *f,*s; | |
320 { _fprintf(f,s,(int *)&s+1); | |
321 } | |
322 | |
323 _fprintf(f,s,p) | |
324 char *f,*s; | |
325 int *p; | |
326 {int l,m,n; | |
327 char c,buf[8]; | |
328 while(c = *s++) | |
329 if (c != '%') putc(c,f); | |
330 else | |
331 { if (l=(*s == '-')) ++s; | |
332 if (isdigit(*s)) s += _getint(&m,s); | |
333 else m = 0; | |
334 if (*s == '.') ++s; | |
335 if (isdigit(*s)) s += _getint(&n,s); | |
336 else n = 32767; | |
337 switch(*s++) | |
338 {case 'd': | |
339 itoa(*p++,buf); | |
340 break; | |
341 case 'o': | |
342 itooa(*p++,buf); | |
343 break; | |
344 case 'x': | |
345 itoxa(*p++,buf); | |
346 break; | |
347 case 'u': | |
348 itoua(*p++,buf); | |
349 break; | |
350 case 'c': | |
351 ctos(*p++,buf); | |
352 break; | |
353 case 's': | |
354 _putstr(f,*p++,l,m,n); | |
355 continue; | |
356 case '\0': | |
357 return; | |
358 default: | |
359 ctos(c,buf); | |
360 break; | |
361 } | |
362 _putstr(f,buf,l,m,n); | |
363 } | |
364 } | |
365 | |
366 _getint(p,s) | |
367 int *p; | |
368 char *s; | |
369 {int i; | |
370 for(*p=i=0; isdigit(*s); ++i) *p = *p * 10 + *s++ - '0'; | |
371 return i; | |
372 } | |
373 | |
374 _putstr(f,s,l,m,n) | |
375 char *f,*s; | |
376 int l,m,n; | |
377 {int k; | |
378 k = (strlen(s) < n ? strlen(s) : n); | |
379 m = (k < m ? m-k : 0); | |
380 if (l) | |
381 { _putsn(f,s,n); | |
382 _putspc(f,m); | |
383 } | |
384 else | |
385 { _putspc(f,m); | |
386 _putsn(f,s,n); | |
387 } | |
388 } | |
389 | |
390 _putsn(f,s,n) | |
391 char *f,*s; | |
392 int n; | |
393 { while(*s) | |
394 if (--n >= 0) putc(*s++,f); | |
395 else break; | |
396 } | |
397 | |
398 _putspc(f,n) | |
399 char *f; | |
400 int n; | |
401 { while(--n >= 0) putc(' ',f); | |
402 } | |
403 | |
404 puts(s) | |
405 char *s; | |
406 { while(*s) putchar(*s++); | |
407 } | |
408 | |
409 itoa(n,s) | |
410 int n; | |
411 char *s; | |
412 { if (n < 0) | |
413 { *s++ = '-'; | |
414 return (itoua(-n,s)+1); | |
415 } | |
416 return itoua(n,s); | |
417 } | |
418 | |
419 itoua(n,s) | |
420 int n; | |
421 char *s; | |
422 { return _itoda(n,s,10); | |
423 } | |
424 | |
425 itooa(n,s) | |
426 int n; | |
427 char *s; | |
428 { return _itoda(n,s,8); | |
429 } | |
430 | |
431 itoxa(n,s) | |
432 int n; | |
433 char *s; | |
434 { return _itoda(n,s,16); | |
435 } | |
436 | |
437 _itoac(n) | |
438 int n; | |
439 { return (n + ((n < 10) ? '0' : ('A'-10))); | |
440 } | |
441 | |
442 _itoda(n,s,r) | |
443 unsigned n; | |
444 int r; | |
445 char *s; | |
446 {int i; | |
447 char t[8],*u; | |
448 u = t; | |
449 *u++ = '\0'; | |
450 do *u++ = _itoac(n % r); while(n /= r); | |
451 for (i=0; *s++ = *--u; ++i); | |
452 return i; | |
453 } | |
454 | |
455 char *ctos(c,s) | |
456 char c,*s; | |
457 { s[0] = c; | |
458 s[1] = '\0'; | |
459 return s; | |
460 } | |
461 | |
462 strlen(s) | |
463 char *s; | |
464 {int i; | |
465 for(i = 0; *s++; ++i); | |
466 return i; | |
467 } | |
468 | |
469 isdigit(c) | |
470 char c; | |
471 { return '0' <= c && c <= '9'; | |
472 } | |
473 | |
474 isspace(c) | |
475 char c; | |
476 { return (c == ' ' || c == '\t' || c == '\n'); | |
477 } | |
478 | |
479 isalpha(c) | |
480 char c; | |
481 { return (isupper(c) || islower(c) || c == '_'); | |
482 } | |
483 | |
484 isupper(c) | |
485 char c; | |
486 { return ('A' <= c && c <= 'Z'); | |
487 } | |
488 | |
489 islower(c) | |
490 char c; | |
491 { return ('a' <= c && c <= 'z'); | |
492 } | |
493 | |
494 toupper(c) | |
495 char c; | |
496 { return (islower(c) ? c + ('A'-'a') : c); | |
497 } | |
498 | |
499 tolower(c) | |
500 char c; | |
501 { return (isupper(c) ? c + ('a'-'A') : c); | |
502 } | |
503 | |
504 atoi(s) | |
505 char *s; | |
506 {int i; | |
507 while (isspace(*s)) ++s; | |
508 for (i = 0; isdigit(*s);) i = i * 10 + *s++ - '0'; | |
509 return i; | |
510 } | |
511 | |
512 typedef struct header | |
513 { struct header *bptr; | |
514 unsigned bsize; | |
515 } HEADER; | |
516 | |
517 HEADER base,*allocp,*heapp; | |
518 | |
519 char *malloc(s) | |
520 unsigned s; | |
521 {HEADER *p,*q; | |
522 int nunits; | |
523 nunits = 1 + (s + sizeof(HEADER) - 1) / sizeof(HEADER); | |
524 if ((q = allocp) == NULL) | |
525 { base.bptr = allocp = q = &base; | |
526 base.bsize = 0; | |
527 } | |
528 for (p = q->bptr; ; q = p,p = p->bptr) | |
529 { if (p->bsize >= nunits) | |
530 { if (p->bsize == nunits) | |
531 q->bptr = p->bptr; | |
532 else | |
533 { p->bsize -= nunits; | |
534 p += p->bsize; | |
535 p->bsize = nunits; | |
536 } | |
537 allocp = q; | |
538 clearblock(p); | |
539 return ((char *)(p + 1)); | |
540 } | |
541 if (p == allocp) | |
542 if ((p = morecore(nunits)) == NULL) | |
543 return(NULL); | |
544 } | |
545 } | |
546 | |
547 clearblock(p) | |
548 HEADER *p; | |
549 {char *s,*t; | |
550 s = (char *)(p + 1); | |
551 t = (char *)(p + p->bsize); | |
552 while (s < t) *s++ = 0; | |
553 } | |
554 | |
555 #define NALLOC 128 | |
556 | |
557 HEADER *morecore(nu) | |
558 unsigned nu; | |
559 {char *cp; | |
560 HEADER *up; | |
561 int rnu; | |
562 rnu = NALLOC * ((nu + NALLOC - 1) / NALLOC); | |
563 cp = sbrk(rnu * sizeof(HEADER)); | |
564 if ((int)cp == -1) return NULL; | |
565 up = (HEADER *) cp; | |
566 up->bsize = rnu; | |
567 mfree((char *)(up+1)); | |
568 return allocp; | |
569 } | |
570 | |
571 #asm | |
572 sbrk PSHS U | |
573 LEAU ,S | |
109 | 574 LDD heapp,Y |
105 | 575 PSHS D |
99 | 576 TFR S,D |
577 SUBD ,S++ | |
578 CMPD 4,U | |
579 BCC _mc1 | |
580 LDD #-1 | |
581 LEAS ,U | |
582 PULS U,PC | |
583 | |
584 _mc1 LDD 4,U | |
585 LDX heapp,Y | |
586 LEAX D,X | |
587 LDD heapp,Y | |
588 STX heapp,Y | |
589 LEAS ,U | |
590 PULS U,PC | |
591 | |
592 #endasm | |
593 | |
594 mfree(ap) | |
595 char *ap; | |
596 {HEADER *p,*q; | |
597 p = (HEADER *)ap - 1; | |
598 for (q = allocp; !(p > q && p < q->bptr); q = q->bptr) | |
599 if (q >= q->bptr && (p > q || p < q->bptr)) break; | |
600 if (p + p->bsize == q->bptr) | |
601 { p->bsize += q->bptr->bsize; | |
602 p->bptr = q->bptr->bptr; | |
603 } | |
604 else p->bptr = q->bptr; | |
605 if (q + q->bsize == p) | |
606 { q->bsize += p->bsize; | |
607 q->bptr = p->bptr; | |
608 } | |
609 else q->bptr = p; | |
610 allocp = q; | |
611 } | |
612 | |
613 unsigned freesize() | |
614 {int i; | |
615 if (!heapp) initheap(); | |
616 return ((char *)&i - (char *)heapp); | |
617 } |