> > Currently my buffer system returns a char * so that functions can use it as > they have always except for freeing it. [snip] > The only problem is that each and every other function in CircleMUD doesn't > use the struct buf_data but a char *. So after going about changing things > to a typedef'd buffer *, I ran into the problem that while sprintf is > easily changed, functions such as log() that take constants cannot be > modified as such. send_to_char() is another problem in that regard. [snip] If I understand your problem correctly, this should work. When you create a buffer malloc() enough room for a header as well as the asked for size of the buffer. Store the header first, then return a pointer to the first char after the header. Functions that don't know any better will use it as a normal buffer. Functions that are supposed to take advantage of the header can access it by subtracting the sizeof the header from the buffer's pointer. For example: (WARNING: Mailer code follows) struct buf_header { size_t size; long favorite_color; }; char *gimme_buffer(size_t n) { struct buf_header bufh; void *bufptr; bufptr = malloc(n + sizeof(struct buf_header)); bufh.size = n; bufh.favorite_color = MAUVE; *(struct buf_header *)bufptr = bufh; return ((char *)bufptr + sizeof(struct buf_header)); } int main() { char *buf; buf = gimme_buffer(256); sprintf(buf, "Testing....\n"); printf(buf); sprintf(buf, "This buffer is %ld bytes.\n", (*(struct buf_header *)(buf - sizeof(struct buf_header))).size); printf(buf); exit(0); } +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/08/00 PST