The following example shows how the Header-to-copy utility translates calling conventions in C source code to their equivalent COBOL copyfile form.
C source:
typedef HINSTANCE HMODULE; DWORD _far _pascal GetVersion(void); UINT _far _pascal GetFreeSystemResources(UINT); #define GFSR_SYSTEMRESOURCES 0x0000 BOOL _far _pascal SetWinDebugInfo(const WINDEBUGINFO _far* <_><_>lpwdi); void _far _cdecl DebugOutput(UINT flags, LPCSTR lpsz, ...); #define WDI_OPTIONS 0x0001
COBOL output:
01 HMODULE is typedef usage uns-int.
end program "c-typedefs".
program-id."c-typedefs" is external.
special-names.
call-convention pascal-convention-val is pascal-conv.
$set constant GetVersion "GetVersion"
entry GetVersion pascal-conv
returning uns-long
.
$set constant GetFreeSystemResources "GetFreeSystemResources"
entry GetFreeSystemResources pascal-conv using
by value uns-int
returning uns-int
.
end program "c-typedefs".
program-id."c-typedefs" is external.
special-names.
call-convention pascal-convention-val is pascal-conv.
78 GFSR-SYSTEMRESOURCES value h"0000".
end program "c-typedefs".
program-id."c-typedefs" is external.
special-names.
call-convention pascal-convention-val is pascal-conv.
$set constant SetWinDebugInfo "SetWinDebugInfo"
entry SetWinDebugInfo pascal-conv using
by reference windebuginfo
returning int
.
end program "c-typedefs".
program-id."c-typedefs" is external.
special-names.
call-convention cdecl-convention-val is cdecl-conv.
$set constant DebugOutput "DebugOutput"
entry DebugOutput cdecl-conv using
by value uns-int
by reference any
by value any
.
end program "c-typedefs".
program-id."c-typedefs" is external.
special-names.
call-convention cdecl-convention-val is cdecl-conv.
78 WDI-OPTIONS value h"0001".
end program "c-typedefs".
H2cpy starts generating COBOL within the default external program c_typedefs which uses the default calling convention. The routine GetVersion uses the Pascal convention which is different, so H2cpy generates a header for a new external program containing a Procedure Division ENTRY statement. The routine GetFreeSystemResources uses the same calling convention so a second entry statement is generated with no need for a new program header. H2cpy then needs to generate a level-78 item in the Data Division, so it generates another program header. The routine DebugOutput uses the cdecl calling convention, so another program header is needed.