chris@mimsy.UUCP (Chris Torek) (05/12/88)
In article <2855@phoenix.Princeton.EDU> lgy@pupthy2.PRINCETON.EDU (Larry Yaffe) asks in an aside: >Does anyone know why the folks at Berkeley chose to have their >sprintf return its first argument, instead of the number of characters >printed? Because it had been that way since 32V. Indeed, the 4.3BSD <stdio.h> noted char *sprintf(); /* too painful to do right */ where `right' presumably meant int sprintf(); (or, in New C, `int sprintf(char *str, const char *fmt, ...);'.) This has been fixed since then; we (read: Keith Bostic) went through all the utilities and got rid of assumptions about sprintf()'s return value. (Actually, I am not sure anyone has gone through /usr/src/new yet.) If you want to fix this in older BSD distributions, here is a functioning, though machine dependent, sprintf and vsprintf. (Compile everything but isprintf() below with `-Dsprintf=isprintf'.) #include <stdio.h> int isprintf(s, fmt, args) char *s, *fmt; { FILE f; int ret; f._flag = _IOSTRG; /* _IOWRT tickles bug in flsbuf */ f._ptr = s; f._cnt = 32767; /* `infinity' */ ret = _doprnt(fmt, &args, &f); *f._ptr = 0; return (ret); } and #include <stdio.h> #include <varargs.h> int vsprintf(s, fmt, ap) char *s, *fmt; va_list ap; { FILE f; int ret; f._flag = _IOSTRG; /* _IOWRT tickles bug in flsbuf */ f._ptr = s; f._cnt = 32767; /* `infinity' */ ret = _doprnt(fmt, ap, &f); *f._ptr = 0; return (ret); } -- In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 454 7163) Domain: chris@mimsy.umd.edu Path: uunet!mimsy!chris