If you are using the C External Function part, use these files:
/* This is the code to support the C ATM sample for VisualAge */
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include "catm.h"
#define SAMPLECUSTOMERS 2
ATM_CUSTOMER sample_customers[SAMPLECUSTOMERS] =
{"John", "Smith", "12345", "7890.03", "15384.42",
"Don", "Brady", "54321", "34.23", "196.44" };
/*****************************************************************/
/* */
/* atm() actually receives the requests */
/* */
/*****************************************************************/
void _cdecl atm(unsigned long atm_Action, P_ATM_CUSTOMER pcustomer)
{
short i;
switch (atm_Action)
{
case ATM_QUERY:
for (i=0; i<SAMPLECUSTOMERS; i++ ) {
if (!strcmp(sample_customers[i].pin_number,
pcustomer->pin_number))
{
memcpy(pcustomer, &(sample_customers[i]),
sizeof(ATM_CUSTOMER));
} /* endif */
} /* endfor */
break;
case ATM_UPDATE:
for (i=0; i<SAMPLECUSTOMERS; i++ )
{
if (!strcmp(sample_customers[i].pin_number,
pcustomer->pin_number))
{
strcpy(sample_customers[i].checking_balance,
pcustomer->checking_balance);
strcpy(sample_customers[i].savings_balance,
pcustomer->savings_balance);
memcpy(pcustomer, &(sample_customers[i]),
sizeof(ATM_CUSTOMER));
} /* endif */
} /* endfor */
break;
default:
break;
} /* endswitch */
return;
}
/* this header file defines the C ATM example for VisualAge */
#define ATM_QUERY 1
#define ATM_UPDATE 2
typedef struct {
char first_name[20];
char last_name[20];
char pin_number[6];
char checking_balance[9];
char savings_balance[9];
} ATM_CUSTOMER, *P_ATM_CUSTOMER;
#define KEY_SIZE 6
void _cdecl atm(unsigned long atm_Action,
P_ATM_CUSTOMER pcustomer);
For OS/2, use:
LIBRARY catm
PROTMODE
DATA MULTIPLE
EXPORTS
atm
For Windows, use:
LIBRARY CATM
EXPORTS
_atm
For OS/2, use:
# OS/2 makefile for VisualAge for Smalltalk catm sample # Uses VisualAge for C++ compiler SRC = catm.c OBJ = catm.obj DLL = catm.dll DEF = catm.def # CFLAGS: C compiler flags # # /C Compile only # /Ms System calling convention # /Fo$@ Name the object file # /G4 Optimize code for 486 processor # /Sm Ignore migration keywords # /Gd+ Use dynamically linked runtime # /Ge- Build a DLL # CFLAGS = /C /Ms /Fo$@ /G4 /Sm /Gd+ /Ge-
!IFDEF DEBUG CFLAGS = $(CFLAGS) /Ti+ !ENDIF # LFLAGS: # # /Fe$@ Name the executabl@e file # /Gm+ Link with the multithread libraries # /Ti+ Keep executable debug information # LFLAGS = /Fe$@ /Gm+ /Ti+
all: $(DLL)
clean:
- del $(DLL)
- del $(OBJ)
$(DLL): $(OBJ) $(DEF) $(ESLIBS)
icc $(OBJ) $(DEF) $(LFLAGS)
$(OBJ): $(SRC)
icc $(CFLAGS) $(SRC)
For Windows, use:
# Win32 compile and link catm sample # Uses VisualAge for C++ compiler # CFLAGS: C compiler flags # # /C Compile only # /Ms System calling convention # /Fo$@ Name the object file # /G4 Optimize code for 486 processor # /Sm Ignore migration keywords # /Gd+ Use dynamically linked runtime # /Ge- Build a DLL # CFLAGS = /C /Ms /Fo$@ /G4 /Sm /Gd+ /Ge-
!IFDEF DEBUG CFLAGS = $(CFLAGS) /Ti+ !ENDIF
# LFLAGS: Linker flags # # /Fe$@ Name the executable file # /Ge- Build a DLL # /Gm+ Link with the multithread libraries # /Q+ Link quietly # /Ti+ Keep executable debug information # LFLAGS = /Fe$@ /Ge- /Gm+ /Q+ /Ti+
all: catm.dll
clean:
- del catm.obj
- del catm.res
- del catm.dll
catm.dll: catm.obj catm.exp
icc catm.obj catm.exp $(LFLAGS)
catm.obj: catm.c
icc $(CPPFLAGS) $(CFLAGS) catm.c
catm.exp: catm.def
ilib /geni:$*.lib catm.def
For HP-UX, use:
# Makefile for module 'catm' # HP-UNIX platform DLLNAME=libcatm.sl # declaration
LIBNAME=catm # declaration LIBPATH= # declaration CFLAGS=+Z -Aa -D_HPUX_SOURCE -O -s -DHP720 -I../include
BUILDFILES1 = catm.o MDLLIBFILES1 = ../lib/libesvm.a all: \ $(DLLNAME)
BUILDLIB: $(DLLNAME) $(DLLNAME):\ $(BUILDFILES1) ld -L. -b +b. +s -L.. -L../lib -o $(DLLNAME) \ $(BUILDFILES1)
For Sun Solaris, use:
# Makefile for module 'catm' # Sun operating system DLLNAME=libcatm.so # declaration LIBNAME=catm # declaration
LIBPATH=# declaration CFLAGS=-KPIC -temp=. -O -s -mt -DSOLARIS -I../include BUILDFILES1 = catm.o
all: \ $(DLLNAME) BUILDLIB: $(DLLNAME)
$(DLLNAME):\ $(BUILDFILES1) ld -L. -G -L../lib -o $(DLLNAME) \ $(BUILDFILES1)
If you are using the COBOL External Function part, use these files:
*---------------------------------------------------------------
* ATM
* ATM demonstration program.
*---------------------------------------------------------------
IDENTIFICATION DIVISION.
PROGRAM-ID. ATM.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
77 CUST-COUNT PIC 9(3) USAGE COMP VALUE ZERO.
78 MAX-CUSTOMERS VALUE 2.
78 FIRST-PIN VALUE "12345".
01 ATM-SAMPLE-CUSTS.
02 CUST-1.
03 FIRST-NAME PIC X(20) VALUE
"John S.".
03 LAST-NAME PIC X(20) VALUE
"Smith".
03 PIN-NUMBER PIC X(5) VALUE
"12345".
03 CHECKING-BALANCE PIC 9(7)V99 VALUE
7890.03.
03 SAVINGS-BALANCE PIC 9(7)V99 VALUE
15384.42.
02 CUST-2.
03 FIRST-NAME PIC X(20) VALUE
"Don".
03 LAST-NAME PIC X(20) VALUE
"Brady".
03 PIN-NUMBER PIC X(5) VALUE
"54321".
03 CHECKING-BALANCE PIC 9(7)V99 VALUE
34.23.
03 SAVINGS-BALANCE PIC 9(7)V99 VALUE
196.44.
02 FILLER PIC X(63) OCCURS 8.
01 ATM-WORK-SPACE PIC X(630).
01 ATM-CUSTOMER-ARRAY OCCURS 10 TIMES
REDEFINES ATM-WORK-SPACE.
02 FIRST-NAME PIC X(20).
02 LAST-NAME PIC X(20).
02 PIN-NUMBER PIC X(5).
02 CHECKING-BALANCE PIC 9(7)V99.
02 SAVINGS-BALANCE PIC 9(7)V99.
*
LINKAGE SECTION.
01 ACTION-CODE.
02 ATM-ACTION PIC X.
88 ATM-QUERY VALUE "Q".
88 ATM-BALANCE-CHANGE VALUE "U".
*
01 ATM-CUSTOMER.
02 FIRST-NAME PIC X(20).
02 LAST-NAME PIC X(20).
02 PIN-NUMBER PIC X(5).
02 CHECKING-BALANCE PIC 9(7)V99.
02 SAVINGS-BALANCE PIC 9(7)V99.
*
PROCEDURE DIVISION USING ACTION-CODE ATM-CUSTOMER.
*
******************************************
ATM-CHECK-ACTION.
******************************************
PERFORM ATM-INIT.
IF ATM-QUERY THEN
PERFORM ATM-Q-CUSTOMER
ELSE
IF ATM-BALANCE-CHANGE THEN
PERFORM ATM-UPDATE
END-IF
END-IF
GO TO ATM-RETURN-CONTROL.
*
ATM-Q-CUSTOMER.
MOVE ZERO TO CUST-COUNT.
PERFORM
NULL-SENTENCE
VARYING CUST-COUNT FROM 1 BY 1
UNTIL PIN-NUMBER OF ATM-CUSTOMER =
PIN-NUMBER OF ATM-CUSTOMER-ARRAY(CUST-COUNT)
OR (CUST-COUNT = MAX-CUSTOMERS + 1).
IF CUST-COUNT = (MAX-CUSTOMERS + 1) THEN
* Cust not found. Reset the fields
MOVE SPACES TO FIRST-NAME OF ATM-CUSTOMER
LAST-NAME OF ATM-CUSTOMER
MOVE ZEROES TO CHECKING-BALANCE OF ATM-CUSTOMER
SAVINGS-BALANCE OF ATM-CUSTOMER
ELSE
MOVE CORRESPONDING
ATM-CUSTOMER-ARRAY(CUST-COUNT) TO ATM-CUSTOMER
END-IF.
ATM-UPDATE.
MOVE ZERO TO CUST-COUNT.
PERFORM
NULL-SENTENCE
VARYING CUST-COUNT FROM 1 BY 1
UNTIL PIN-NUMBER OF ATM-CUSTOMER =
PIN-NUMBER OF ATM-CUSTOMER-ARRAY(CUST-COUNT)
OR (CUST-COUNT = MAX-CUSTOMERS + 1).
IF CUST-COUNT = (MAX-CUSTOMERS + 1) THEN
* Cust not found. Do nothing
CONTINUE
ELSE
MOVE CORRESPONDING
ATM-CUSTOMER TO ATM-CUSTOMER-ARRAY(CUST-COUNT)
END-IF.
ATM-INIT.
IF PIN-NUMBER OF ATM-CUSTOMER-ARRAY(1) = FIRST-PIN THEN
CONTINUE
ELSE
MOVE ATM-SAMPLE-CUSTS TO ATM-WORK-SPACE
END-IF.
*
NULL-SENTENCE.
*
ATM-RETURN-CONTROL.
GOBACK.
77 CUST-COUNT PIC 9(3) USAGE COMP VALUE ZERO.
78 MAX-CUSTOMERS VALUE 2.
78 FIRST-PIN VALUE "12345".
01 ATM-SAMPLE-CUSTS.
02 CUST-1.
03 FIRST-NAME PIC X(20) VALUE
"John S.".
03 LAST-NAME PIC X(20) VALUE
"Smith".
03 PIN-NUMBER PIC X(5) VALUE
"12345".
03 CHECKING-BALANCE PIC 9(7)V99 VALUE
7890.03.
03 SAVINGS-BALANCE PIC 9(7)V99 VALUE
15384.42.
02 CUST-2.
03 FIRST-NAME PIC X(20) VALUE
"Don".
03 LAST-NAME PIC X(20) VALUE
"Brady".
03 PIN-NUMBER PIC X(5) VALUE
"54321".
03 CHECKING-BALANCE PIC 9(7)V99 VALUE
34.23.
03 SAVINGS-BALANCE PIC 9(7)V99 VALUE
196.44.
02 FILLER PIC X(63) OCCURS 8.
01 ATM-WORK-SPACE PIC X(630).
01 ATM-CUSTOMER-ARRAY OCCURS 10 TIMES
REDEFINES ATM-WORK-SPACE.
02 FIRST-NAME PIC X(20).
02 LAST-NAME PIC X(20).
02 PIN-NUMBER PIC X(5).
02 CHECKING-BALANCE PIC 9(7)V99.
02 SAVINGS-BALANCE PIC 9(7)V99.
*
LINKAGE SECTION.
01 ACTION-CODE.
02 ATM-ACTION PIC X.
88 ATM-QUERY VALUE "Q".
88 ATM-BALANCE-CHANGE VALUE "U".
*
01 ATM-CUSTOMER.
02 FIRST-NAME PIC X(20).
02 LAST-NAME PIC X(20).
02 PIN-NUMBER PIC X(5).
02 CHECKING-BALANCE PIC 9(7)V99.
02 SAVINGS-BALANCE PIC 9(7)V99.
LIBRARY INITINSTANCE PROTMODE DATA NONSHARED EXPORTS ATM @1
/* This command file compiles and links a COBOL program. ** Pass the program name in as the first argument. ** ** This command file will work with ** Micro Focus COBOL compiler version 3.0.29 ** Microsoft linker 5.10.005 ** */ arg pgm .
"COBOL "pgm",,,, omf(obj) model(large) litlink nodynam ",
"list("pgm".lst) setting"
"link "pgm,
"/MAP/NOD/ST:32000/SE:1024/A:16/FAR,",
pgm".DLL,"pgm".map,",
"LCOBOL+DOSCALLS,",
pgm".def;"
/* Note: you can change DOSCALLS.LIB to OS2.LIB if it is available */
Instead of using the above .cmd file, try entering at a command prompt:
'COB2 ATM.CBL ATM.DEF'