#include #include #include #include typedef struct memcursor { char* start; char* pos; char* end; // IMPORTANT: Must point to the last byte, not the byte after it! } memcursor_t; memcursor_t* memcursor_append(memcursor_t*restrict cur, size_t size, char data[size]){ if(cur->end - cur->pos < size) size = cur->end - cur->pos; memcpy(cur->pos, data, size); cur->pos += size; *cur->pos = 0; return cur; } memcursor_t* memcursor_printf(memcursor_t*restrict cur, const char* format, ...){ va_list args; va_start(args, format); int ret = vsnprintf(cur->pos, cur->end-cur->pos+1, format, args); va_end(args); if(ret < 0) return cur; if(ret > cur->end-cur->pos) ret = cur->end-cur->pos; cur->pos += ret; return cur; } bool memcursor_eof(memcursor_t*restrict cur){ return cur->pos == cur->end; } #define S(X) strlen((X)), (X) int main(){ char out_buf[29]; out_buf[0] = 0; memcursor_t cur = { out_buf, out_buf, out_buf+sizeof(out_buf)-1 }; memcursor_printf(&cur, "Test %d", 123); printf("data: %s\n", out_buf); printf("eof: %s\n", memcursor_eof(&cur)?"true":"false"); memcursor_append(&cur, S(("\n" "The quick brown fox jumps over the lazy dog")) ); printf("data: %s\n", out_buf); printf("eof: %s\n", memcursor_eof(&cur)?"true":"false"); }