📄 buf.c
字号:
/* * Miscellanious buffer management routines * * Frank Pronk * The University of British Columbia * Laboratory for Computational Vision * Copyright (c) */#include "buf.h"char *malloc();/* * return a buffer that contains room * for 'size' bytes of data. */struct buf *getbuf (size){ register struct buf *bp; if ((bp = (struct buf *)malloc (size + sizeof(char *)*4)) == 0) abort (); bp->b_next = bp->b_prev = bp; bp->b_top = bp->b_bot = bp->b_data; return (bp);}/* * Initialize a buffer queue by * freeing all buffers on the queue * and resetting the queue to its * initial state. */InitQueue (qp)register struct bufhd *qp;{ register struct buf *bp; if (qp->b_next) while (!QEMPTY (qp)) { dequeue (bp = qp->b_next, qp); free ((char *)bp); } qp->b_prev = qp->b_next = (struct buf *)qp; qp->b_count = 0;}/* * Allocate a buffer and try to read 'size' bytes from 'fd'. * Return zero on error; otherwise return a pointer to the buffer. */struct buf *FillBuf(fd, size, who)char *who;{ register int n; register struct buf *bp; bp = getbuf (size); if ((n = read (fd, bp->b_bot, size)) <= 0) { free ((char *)bp); return (0); } bp->b_top += n; NimTrace (who, bp->b_bot, n); return (bp);}/* * Try to flush the queue of buffers headed by 'qp' * by writing to 'fd'. Returns non-zero on error. */FlushQueue (fd, qp, who)register struct bufhd *qp;char *who;{ register int cc; register struct buf *bp; while (!QEMPTY(qp)) { bp = qp->b_next; if ((cc = write (fd, bp->b_bot, SIZE (bp))) < 0) return (-1); NimTrace (who, bp->b_bot, cc); bp->b_bot += cc; qp->b_count -= cc; if (ISEMPTY(bp)) { dequeue (bp, qp); free ((char *)bp); } } return (0);}/* * Copy string 's' to buffer 'bp'. */StrToBuf(s, bp)register char *s;register struct buf *bp;{ while(*s) PUTCHAR (*s++, bp);}/* * Copy the contents of buffer 'from' to 'to'. */BufCopy(from, to)struct buf *from, *to;{ register int l = SIZE (from); bcopy (from->b_bot, to->b_top, l); to->b_top += l;}/* * place buffer 'bp' on the end of * the queue headed by 'qp'. */enqueue (bp, qp)register struct buf *bp;register struct bufhd *qp;{ qp->b_prev->b_next = bp; bp->b_prev = qp->b_prev; qp->b_prev = bp; bp->b_next = (struct buf *)qp; qp->b_count += SIZE (bp);}/* * remove buffer 'bp' from the * queue headed by 'qp'. */dequeue (bp, qp)register struct buf *bp;register struct bufhd *qp;{ bp->b_prev->b_next = bp->b_next; bp->b_next->b_prev = bp->b_prev; qp->b_count -= SIZE (bp);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -