void pager_fn(player * p, char *str) { ed_info *e; e = p->edit_info; if((int)strlen(str)<2) { switch (tolower(*str)) { case 0: /* player hit return - next page */ forward_page(p, e); break; case 'p': back_page(p, e); break; case 'n': forward_page(p, e); break; case 'l': last_page(p, e); break; case 'f': e->current = e->buffer; e->size = 0; break; case '?': help_page(p); p->input_to_fn = pager_help_pause; return; case 'q': quit_pager(p, e); return; case 'r': /* redraw the screen */ break; default: /* this is what happens if it doesnt recognise the command */ p->input_to_fn = 0; input_for_one(p); p->input_to_fn = pager_fn; draw_page(p, e->current, 0); return; } if (!draw_page(p, e->current, 1)) quit_pager(p, e); } else { p->input_to_fn = 0; input_for_one(p); p->input_to_fn = pager_fn; draw_page(p, e->current, 0); } }
void *block_alloc(struct block *block, int size) { assert(size && size <= page_size); void *page = last_page(block); int *page_offset = get_offset_ptr(page); if (page_size - *page_offset < size) if (!(page = add_page(block))) return NULL; page_offset = get_offset_ptr(page); void *ptr = (void *)((uintptr_t)page + *page_offset); *page_offset += size; return ptr; }