[fa.info-vax] To Gail Rubin

info-vax@ucbvax.ARPA (02/22/85)

From: Jerry Leichter <Leichter@YALE.ARPA>

Sorry to post this to the entire list; our host tables are out of date
and apparently can't be updated due to various software problems.

I also apologize to Gail Rubin for posting here private letter here, but
I know of no way to get her permission!  :-)
							-- Jerry

To: grubin@bbn-spca.ARPA
Subject:  Re: DEC C (2.0)
Invalid-addresses: grubin@BBN-SPCA.ARPA (?Invalid domain (host))

    Your information about the C standard and portability is reasonable
    however, the particular application I am concerned with in my message is
    one that is explicitly designed for VMS only. On the VAX, I KNOW what the
    stack format is and since I don't use doubles as arguments, the number of
    longwords IS the number of arguments.
    
    My application is a package of routines, a run-time library of sorts, that
    gets sent to customers and they write programs which call the routines.
    Since I then have absolutely no control over whether my routines are called
    correctly, or what language they are called from and some of the routines
    do have optional arguments, I try to check the number of arguments as one
    of my validity checks so I can give a more explicit error code back to the
    user program instead of an access violation or strange behavior. I follow
    calling standard behavior in that I never modify actual arguments;
    basically all arguments are passed by reference or descriptor anyway.
    
    In light of this, the behavior of DEC C 2.0 is
    unsuitable for my application. I would be more inclined to stick with
    the C I have rather than rewrite my routines in Macro.
    -- Gail

What you say is, of course, reasonable.  It's a problem to write routines with
variable numbers of arguments in most high-level languages.  Some - BASIC is
an example - in fact go so far as to check the number of arguments passed
against the number declared and signal an error if they disagree.  I guess in
your case that would be fine, though!

All you need to do is write a single 5-or-so-line MACRO routine that returns
the number of arguments its caller was called with.  The routine can get by
with no registers in its register mask - just R0 is plenty for the indirect
refs it will have to do, so calling it will be quite cheap.  (Not that a
couple of microseconds is likely to be all that important when you are
already willing to trade overhead for robust routines.)

Actually, I was rather surprised that a quick check of the RTL turned up no
such routine.  Oh, well.
							-- Jerry
-------