varstr * varstr_fromstr(char *str) { varstr * v = varstr_new(strlen(str)); return varstr_cat(v, str); }
varstr * varstr_sprintf(varstr *v, char *fmt, ...) { va_list ap; char * str; va_start(ap, fmt); vasprintf(&str, fmt, ap); va_end(ap); varstr_cat(v, str); free(str); return v; }
const char * linereader_next( struct linereader *p ) { varstr_empty( p->text ); for ( ;; ) { /* loop to consume a single line */ if ( NULL == fgets( p->buf, _BUFSIZE, p->in ) ) { if ( strlen( varstr_str( p->text ) ) == 0 ) /* eof and no text accumulated -- done! */ return NULL; else break; } varstr_cat( p->text, p->buf ); if ( NULL != strchr( p->buf, '\n' ) ) break; } return ( const char * ) varstr_str( p->text ); }