From:	CSBVAX::MRGATE!LEICHTER@VENUS.YCC.YALE.EDU@SMTP 15-FEB-1988 18:01
To:	ARISIA::EVERHART
Subj:	re: ACCDEF vs ACRDEF


Received: from VENUS (YALE-ENG-VENUS.ARPA.#Internet) by KL.SRI.COM with TCP; Thu 11 Feb 88 08:43:35-PST
Date: Thu, 11 Feb 88 11:48 EST
From: "Jerry Leichter (LEICHTER-JERRY@CS.YALE.EDU)"
 <LEICHTER@VENUS.YCC.YALE.EDU>
Subject: re: ACCDEF vs ACRDEF
To: unmvax!nmtsun!hydrovax@ucbvax.Berkeley.EDU, INFO-VAX@KL.SRI.COM
X-VMS-To: IN%"unmvax!nmtsun!hydrovax@ucbvax.Berkeley.EDU",INFOVAX

	I am in the process of writing an accounting utility that reads
	ACCOUNTING records from an accounting file that was written by VMS
	Version 4.4....I'm writing this utility in 'C', I'd like to be able to
	use the pre-defined structures that DEC gives you as part of the
	distribution.  However, I find that there is no ACRDEF.H, which is the
	name that SHOULD be there, according to the appendix in the accounting
	utility manual.  There is a ACCDEF.H that looks a little bit like the
	correct data structures, but not quite.  Upon close inspection, I
	found that the data structures had the same fields (sort of), but they
	were in a different order, in addition to some other basic
	differences.

	...I found $ACRDEF in the SYS$LIBRARY:STARLET.MLB (I think, or
	maybe it was LIB.)  Does anybody have a way of converting this into
	'C' structure definitions?

See below.

	...What is ACCDEF used for, and why did I get this module with my 'C'
	compiler (version 2.2 on VMS 4.4) instead of ACRDEF.  Is there some
	accounting file reading facility that I have overlooked in my search
	through the Orange binders?  Or do I have to hack out my own ACRDEF.H
	file, so I can read the raw data.

$ACCDEF contains definitions for describing accounting messages; see the
documentation of $CREPRC for an example - you can receive such a message when
a subprocess terminates.  You would also use it when constructing accounting
messages.

As to building .H files:  I guess it is time to post the enclosed file again.

							-- Jerry
$!
$! Drive generation of C #define header file from MACRO definitions
$!
$! Usage:
$!		@C_DEFS	name
$!
$! where $NAME is a definitional macro in either STARLET.MLB or LIB.MLB.
$! Output: []'p1'.H
$!
$! Note:  This command file can be changed to produce files in languages other
$! than C.  To do this, change the definitions of "lang" and "type" to the
$! language name and default file type for include files; the "write DEFS_MAR"
$! statements to create header and trailer comments appropriate to the new
$! language; and the definition of the macro EMIT to produce the right kind
$! of definition lines.
$!
$! Originally written and posted to INFOVAX by:
$!
$! W.J.Moeller, GWDG, D-3400 Goettingen, F.R.Germany  <GWD21T@DGOGWD01.BITNET>
$!                                                 Phone +49 551 201516
$!
$! Later revised by Jerry Leichter (LEICHTER@YALE)
$! 
$! Revision History
$! 0.0	??-???-?? WJM	Creation
$! 1.0	 6-Apr-87 JSL	Centralize actual creation of output lines in the EMIT
$!			macro; this makes changes a lot easier.  Similarly,
$!			define the output file type ("type") and the language
$!			("lang") in symbols to simplify changes.  Allow for
$!			special handling of negative values in EMIT - for C,
$!			wrap them in parentheses.  Try to warn the user if
$!			it looks like there was an error.
$ set noon
$ on control_y then goto fin
$ lang = "C"
$ type = "H"
$ open/write DEFS_MAR []defs.tmp
$ write DEFS_MAR "    .print;/*"
$ write DEFS_MAR "    .print; *				''p1'.''type'"
$ write DEFS_MAR "    .print; *"
$ write DEFS_MAR "    .print; * Definitions created by ''lang'_DEFS",	-
					" at ''f$time()'"
$ write DEFS_MAR "    .print; */"
$ write DEFS_MAR "    $''p1'"
$ write DEFS_MAR "    .print;/*"
$ write DEFS_MAR "    .print; * End of ''lang'_DEFS definitions"
$ write DEFS_MAR "    .print; */"
$ write DEFS_MAR "    .end"
$ close DEFS_MAR
$!
$ define/user SYS$ERROR 'p1'.'type	! MACRO puts .PRINT output here
$ macro/nolist/noobject SYS$INPUT+SYS$LIBRARY:LIB/LIB+SYS$DISK:[]defs.tmp
        .MACRO  $GBLINI GBL
	.MACRO	EMIT	SYM,VALUE
	.IF	LT	%LOCATE(<->,VALUE)-%LENGTH(VALUE)
..print;#define SYM	(VALUE)
	.IFF
..print;#define SYM	VALUE
	.ENDC
	.ENDM
        .MACRO  $DEF    SYM,ALLOC,SIZ
        .if     NB,SYM
SYM:
	EMIT	SYM,\SYM
        .endc
        .IIF    NB,ALLOC,       ALLOC   SIZ
        .ENDM   $DEF
        .MACRO  $EQU    SYM,VAL
        SYM=VAL
	EMIT	SYM,\SYM
        .ENDM   $EQU
        .MACRO  $VIELD1 MOD,SEP,SYM,SIZ,MSK
        SIZ...=1
        .IIF    NB,SIZ, SIZ...=SIZ
        .IF     NB,SYM
        MOD'SEP'V_'SYM=BIT...
	EMIT	MOD'SEP'V_'SYM,\MOD'SEP'V_'SYM
        .if     nb,siz
MOD'SEP'S_'SYM=SIZ
	EMIT	MOD'SEP'S_'SYM,\MOD'SEP'S_'SYM
        .endc
        .if     nb,msk
MOD'SEP'M_'SYM=<<<1@SIZ...>-1>@BIT...>
	EMIT	MOD'SEP'M_'SYM,\MOD'SEP'M_'SYM
        .endc
        .ENDC
        BIT...=BIT...+SIZ...
        .ENDM   $VIELD1
        .ENDM   $GBLINI
$ 
$!
$ assign/user _NL: SYS$ERROR			!Avoid "No strings matched"
$ assign/user _NL: SYS$OUTPUT
$ search/nooutput 'p1'.'type' "%MACRO-"
$ if $severity .ne. 1 then goto fin
$ write SYS$ERROR "Error in producing ''p1'.''type' - file not usable."
$ write SYS$ERROR "(This probably means that there is no $",p1," macro.)"
$fin:
$ close/err=noerrdefs DEFS_MAR
$noerrdefs:
$ delete/nolog []defs.tmp;
