/* buf.c - by Alen Stojanov and David van Moolenbroek, taken from procfs */ #define _POSIX_SOURCE 1 /* tell headers to include POSIX stuff */ #define _MINIX 1 /* tell headers to include MINIX stuff */ #define _SYSTEM 1 /* tell headers that this is the kernel */ #define DEVMAN_SERVER 1 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BUF_SIZE 4096 PRIVATE char buf[BUF_SIZE + 1]; PRIVATE size_t off, left, used; PRIVATE off_t skip; #define MIN(x,y) (x 0) { assert(off == 0); assert(used == 0); if (skip >= len) { skip -= len; return; } off = skip; if (left > BUF_SIZE - off) left = BUF_SIZE - off; len -= off; skip = 0; } assert(skip == 0); assert(len >= 0); assert((long) left >= 0); if (len > (ssize_t) left) len = left; used += len; left -= len; } /*===========================================================================* * buf_append * *===========================================================================*/ PUBLIC void buf_append(char *data, size_t len) { /* Add arbitrary data to the end of the buffer. */ if (left == 0) return; if (skip > 0) { if (skip >= (ssize_t) len) { skip -= len; return; } data += skip; len -= skip; skip = 0; } if (len > left) len = left; memcpy(&buf[off + used], data, len); used += len; left -= len; } /*===========================================================================* * buf_get * *===========================================================================*/ PUBLIC size_t buf_get(char **ptr) { /* Return the buffer's starting address and the length of the used * part, not counting the trailing null character for the latter. */ *ptr = &buf[off]; return used; }