The following example shows how the Header-to-copy utility translates parameter passing conventions in C source code to their equivalent COBOL copyfile form.
C source:
typedef unsigned char BYTE; typedef char _far* LPSTR; typedef int HFILE; typedef Boolean (*XtFilePredicate)( /* String filename */ ); BYTE _far _pascal GetTempDrive(char); long _far _pascal _llseek(HFILE, long, int); long _far _pascal _hwrite(HFILE, const void _huge*, long); LPSTR _far _pascal AnsiLower(LPSTR); void _far _pascal Throw(const int _far*, int); extern_pascal String XtFindFile( CONST String /* path */, Substitution /* substitutions */, Cardinal /* num_substitutions */, XtFilePredicate /* predicate */ );
COBOL output:
01 BYTE is typedef usage uns-char.
01 LPSTR is typedef usage data-pointer.
01 HFILE is typedef usage int.
01 XtFilePredicate is typedef usage proc-pointer.
end program "c-typedefs".
program-id."c-typedefs" is external.
special-names.
call-convention pascal-convention-val is pascal-conv.
$set constant GetTempDrive "GetTempDrive"
entry GetTempDrive pascal-conv using
by value char
returning uns-char
.
$set constant 1-llseek "_llseek"
entry 1-llseek pascal-conv using
by value int
by value long
by value int
returning long
.
$set constant 1-hwrite "_hwrite"
entry 1-hwrite pascal-conv using
by value int
by value data-pointer
by value long
returning long
.
$set constant AnsiLower "AnsiLower"
entry AnsiLower pascal-conv using
by reference any
returning data-pointer
.
$set constant Throw "Throw"
entry Throw pascal-conv using
by reference int
by value int
.
end program "c-typedefs".
program-id."c-typedefs" is external.
special-names.
call-convention default-convention-val is default-conv.
end program "c-typedefs".
program-id."c-typedefs" is external.
special-names.
call-convention default-convention-val is default-conv.
$set constant XtFindFile "XtFindFile"
entry XtFindFile default-conv using
by reference any
by value data-pointer
by value uns-int
by value proc-pointer
returning data-pointer.
.
end program "c-typedefs".
Notice in the routine _hwrite that a pointer to a void generates a data pointer passed by value. However, in the routine AnsiLower the type LPSTR which is a pointer to a character generates a BY REFERENCE clause with any parameter being allowed. A char would be too restrictive as normally any COBOL alphabetic item would be suitable. For this reason H2cpy generates any.
In the routine Throw, we have an int passed both BY VALUE and BY REFERENCE. In the routine XtFindFile, we pass a procedure pointer BY VALUE.