physics@utcs.UUCP (David Harrison) (12/10/84)
[chomperoo] In non-USG versions, *printf calls _doprnt which does the work. In our Hewlett-Packard 9000, there is no such function (usually written in assembler so far as I know) and the man claims that the printf familiy calls getc. We have some code here which was written including _doprnt, and wonder if there is an equivalent call. The HP runs essentially Sys III, and this posting assumes that the disappearance of _doprnt is common to Unix Support Group versions although I welcome correction. Even more welcome is help in finding a substitute (including the varargs stuff) for _doprnt. David Harrison Dept. of Physics Univ. of Toronto {allegra,ihnp4,linus,decvax}!utzoo!utcs!physics
guy@rlgvax.UUCP (Guy Harris) (12/12/84)
> In non-USG versions, *printf calls _doprnt which does the work. > In our Hewlett-Packard 9000, there is no such function (usually > written in assembler so far as I know) and the man > claims that the printf familiy calls getc. We have some code > here which was written including _doprnt, and wonder if there > is an equivalent call. The HP runs essentially Sys III, and this > posting assumes that the disappearance of _doprnt is common > to Unix Support Group versions although I welcome correction. Even > more welcome is help in finding a substitute (including the varargs > stuff) for _doprnt. Well, in System III "*printf" may call "_doprnt" in the VAX version, but don't depend on it. System III had undocumented routines called "vprintf", "vsprintf", and "vfprintf" which did what you want - in effect, they had calling sequences similar to "_doprnt" (we used "vsprintf" for our "curses" implementation). Those routines disappeared in System V, and reappeared in System V Release 2 with documentation (along with "_doprnt", which reappeared but without documentation). Basically, all the "v*printf" routines take a "va_list" argument (as seen on "varargs.h" :-)) instead of their normal list of arguments to be printed; i.e., you call "vprintf" with vprintf(format_string, va_list_argument); I *believe* that the argument would be a pointer to the first argument in the list of things to be printed by the caller of "vprintf"; the same pointer is passed to "_doprnt" as one of its arguments. WARNING: as Henry Spencer and others have pointed out, there is *NO* guarantee that any of the "varargs" stuff, including "v*printf", is implementable on any particular machine and C implementation. (Henry knows whereof he speaks, because he worked on the Perq implementation of C and UNIX - stack machines like the Perq tend to assume that the *called* routine handles the argument list, which is very hard to do if only the *calling* routine knows how many arguments it's passing). There is no guarantee that they are available on any particular S3 implementation (they're not documented), and there is almost a guarantee that they are not available under S5 Release 1 (they weren't provided). There is no guarantee at all that "_doprnt" will be available, or will work the way you expect it to, under *any* release of UNIX (except 4.2BSD, where it is documented - a mistake, in my opinion; they should have written their own "v*printf" implementation and used that, instead); Zilog's ZEUS V7 implementation didn't have it, because they had to screw around a lot to get "printf" to work. They put some arguments into registers in their calling sequence, which means all the "varargs" stuff is a bitch. I have no idea if any ZEUS release has the "varargs" stuff. Guy Harris {seismo,ihnp4,allegra}!rlgvax!guy