I wouldn't call this definition readable: void cvs_ent_line_str(const char *name, char *rev, char *tstamp, char *opts, char *sticky, int isdir, int isremoved, char *buf, size_t len)
So what about changing it to return allocated memory by itself, which would mean changing the internals from xsnprintf() to xasprintf(). Removes the need for two arguments. And the code does no error handling currently, anyway. char * cvs_ent_line_str(const char *name, char *rev, char *tstamp, char *opts, char *sticky, int isdir, int isremoved) I can tell that rev can be VERY large... Wait, am I remembering these (Open)CVS internals all of a sudden again? :P