void ongr_line( frame *f, onpoint *p1, onpoint *p2 ) { onpoint abs1,abs2; r2a(f,p1,&abs1); r2a(f,p2,&abs2); ag_line(abs1.x,abs1.y,abs2.x,abs2.y); }
void ongr_bar( frame *f, onpoint *p1, onpoint *p2 ) { onpoint abs1,abs2; r2a(f,p1,&abs1); r2a(f,p2,&abs2); ag_rectangle(abs1.x,abs1.y,abs2.x,abs2.y); }
/* * malloc - allocate a block with at least size bytes of payload */ void *malloc (size_t size) { size_t total_size; /* include prologue and epilogue */ unsigned *list_p; void *bp; dbg_printf("want to malloc(%d)\n", (int)size); print_heap(); /* initialize */ if (!heap_head) { mm_init(); } /* calculate total block size */ if (size <= 0) { return NULL; } else if (size <= 3 * WSIZE) { total_size = 4 * WSIZE; } else { total_size = DSIZE * ((size + WSIZE + DSIZE - 1) / DSIZE); } /* get corresponding free list */ list_p = get_list(total_size); if (list_p == NULL) { return NULL; } /* try to find a block big enough */ while (list_p != array_tail) { bp = (void *)(size_t)*list_p; while (bp != NULL) { if (block_size((void *)r2a((size_t)bp)) >= total_size) { place((void *)r2a((size_t)bp), total_size); dbg_printf("want to return 0x%x from malloc(%d) after find a block big enough \n", (int)bp, (int)size); print_heap(); return (void *)r2a((size_t)bp); } bp = succ_block((void *)r2a((size_t)bp)); } list_p++; } /* if there is no appropriate block, then extend heap */ bp = extend_heap(MAX(total_size, 64)); dbg_printf("just after extend heap\n"); print_heap(); if (bp == NULL) { return NULL; } place(bp, total_size); dbg_printf("want to return 0x%x from malloc(%d) and can't find big enough block\n", (int)bp, (int)size); print_heap(); return (void *)r2a((size_t)bp); }
void ongr_framed_box( frame *f, onpoint *p1, onpoint *p2 , int col) { onpoint abs1,abs2; int old_col = ag_pen_color(); r2a(f,p1,&abs1); r2a(f,p2,&abs2); ag_set_pen_color(col); ag_box(abs1.x,abs1.y,abs2.x,abs2.y); ag_set_pen_color(AG_BLACK); ag_rectangle(abs1.x,abs1.y,abs2.x,abs2.y); ag_set_pen_color(old_col); }
void ongr_cross( frame *f, onpoint *p ) { onpoint abs; r2a(f,p,&abs); ag_line(abs.x-2.0,abs.y,abs.x+2.0,abs.y); ag_line(abs.x,abs.y-2.0,abs.x,abs.y+2.0); }
void ongr_dot( frame *f, onpoint *p ) { onpoint abs; double bw = real_min(frame_width(f),frame_height(f))/150.0; bw = real_max(DOT_RADIUS * 0.75,real_min(1.5 * DOT_RADIUS,bw)); r2a(f,p,&abs); ag_disc(abs.x,abs.y,bw); }
/* * mm_checkheap */ void mm_checkheap(int verbose){ void *bp; unsigned *list_p; unsigned *pred, *succ; int i; if (!verbose) { return; } bp = data_head + DSIZE; /* checking the heap */ /* prologue */ if (!(block_size(bp) == 8 && block_alloc(bp) == 1)) { printf("Invariant Error: prologue block\n"); } /* blocks */ bp = next_block(bp); while (block_size(bp) != 0) { if ((long)bp % DSIZE != 0) { printf("Invariant Error: block's address isn't aligned\n"); } if (!block_alloc(bp)) { if (*(int *)HEAD(bp) != *(int *)FOOT(bp)) { printf("Invariant Error: block head and foot don't match\n"); } } if (!block_prev_alloc(bp)) { if (block_prev_alloc(bp) != block_alloc(prev_block(bp))) { printf("Invariant Error: prev alloc bit doesn't match prev block\n"); } if (block_alloc(bp) == 0) { printf("Inveriant Error: find consecutive free blocks\n"); } } if (block_alloc(bp) == 0 && block_alloc(next_block(bp)) == 0) { printf("Inveriant Error: find consecutive free blocks\n"); } if (block_size(bp) < 4 * WSIZE) { printf("Invariant Error: block is too small\n"); } bp = next_block(bp); } /* epilogue */ if (!(block_size(bp) == 0 && block_alloc(bp) == 1)) { printf("Invariant Error: epilogue block\n"); } /* checking the free list */ list_p = (unsigned *)heap_head; for (i = 0; i < ARRAYSIZE; i++) { if (!*list_p) { continue; } bp = (unsigned *)r2a((size_t)*list_p); while (bp != NULL) { pred = pred_block(bp); succ = succ_block(bp); if (pred != NULL) { if (*(pred + 1) != a2r((size_t)bp)) { printf("Invariant Error: inconsistent pointer\n"); } } if (succ != NULL) { if (*succ != a2r((size_t)bp)) { printf("Invariant Error: inconsistent pointer\n"); } } if (get_list(block_size((void *)bp)) != list_p) { printf("Invariant Error: block size doesn't match list\n"); } bp = succ; } list_p++; } print_heap(); }
void ongr_print( frame *f, onpoint *p, char *string ) { onpoint abs; r2a(f,p,&abs); ag_print(abs.x,abs.y,string); }
void ongr_disc( frame *f, onpoint *p, double r ) { onpoint abs; r2a(f,p,&abs); ag_disc(abs.x,abs.y,r); }
void ongr_circle( frame *f, onpoint *p, double r ) { onpoint abs; r2a(f,p,&abs); ag_circle(abs.x,abs.y,r); }
void ongr_pixel( frame *f, onpoint *p ) { onpoint abs; r2a(f,p,&abs); ag_pixel(abs.x,abs.y); }