Wildcat Cobol Compiler for .NET

home | about | docs | feedback | download

An open-source COBOL compiler for .NET and Mono

Examples

Hello World .NET

A "Hello world" program that uses .NET's System.String and System.Console classes.

000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. FRAMEWORK-TEST.
000030 AUTHOR. SANDY DUNLOP.
000040*Testing .NET COBOL Extensions
000050
000060 ENVIRONMENT DIVISION.
000070 CONFIGURATION SECTION.
000080 REPOSITORY.
000090 CLASS SYS-STRING AS "System.String"
000095 CLASS SYS-CONSOLE AS "System.Console"
000100 DATA DIVISION.
000110 WORKING-STORAGE SECTION.
000120 77 NET-STRING OBJECT REFERENCE SYS-STRING.
000150
000160 PROCEDURE DIVISION.
000170 MAIN-PARAGRAPH.
000180 MOVE "Hello World!" TO NET-STRING
000200 INVOKE SYS-CONSOLE "WriteLine"
000202 USING BY VALUE NET-STRING
000210 STOP RUN.

[download the source]


NUnit Test

This program was written to test the experimental implementation of .NET extensions to the COBOL syntax supported by the Wildcat COBOL compiler - specifically invoking methods defined in non-system DLLs. The program uses System.String and System.Console.WriteLine to write "Test Prog" to the console. It also includes a paragraph called TEST-PARAGRAPH which is a NUnit test.

To compile this, you should make sure you have NUnit's nunit.framework.dll in the same directory as this program, and use the following compiler command:

cobolc.exe /reference:nunit.framework.dll objects.cbl

000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID. FRAMEWORK-TEST.
000030 AUTHOR. SANDY DUNLOP.
000040*Testing .NET COBOL Extensions
000050
000060 ENVIRONMENT DIVISION.
000070 CONFIGURATION SECTION.
000075 ATTRIBUTES "TestFixture".
000080 REPOSITORY.
000090 CLASS SYS-STRING AS "System.String"
000095 CLASS SYS-CONSOLE AS "System.Console"
000096 CLASS NUNIT-ASSERT AS "NUnit.Framework.Assert"
000100 DATA DIVISION.
000110 WORKING-STORAGE SECTION.
000120 77 NET-STRING OBJECT REFERENCE SYS-STRING.
000150
000160 PROCEDURE DIVISION.
000170 MAIN-PARAGRAPH.
000180 MOVE "Test Prog" TO NET-STRING
000200 INVOKE SYS-CONSOLE "WriteLine"
000202 USING BY VALUE NET-STRING
000210 STOP RUN.
000300 TEST-PARAGRAPH WITH ATTRIBUTES "Test".
000305 MOVE "teststring" TO NET-STRING
000310 INVOKE NUNIT-ASSERT "AreEqual"
000320 USING BY VALUE "teststring"
000330 USING BY VALUE NET-STRING
000340 END PROGRAM FRAMEWORK-TEST.

[download the source]


99 Bottles of Beer

The famous "99 Bottels of Beer" program, using standard COBOL.

000100 Id Division.
000110 Program-Id. BotBeer.
000115* http://99-bottles-of-beer.net/language-cobol-908.html
000120 Data Division.
000130 Working-Storage Section.
000140 01 strings.
000150 05 buffer pic x(80).
000160 05 bb1 value spaces pic x(15).
000170 05 bb2 value 'bottles of beer' pic x(15).
000180 05 bb3 value 'on the wall' pic x(11).
000190 05 bb4 value 'Take one down, pass it around, ' pic x(31).
000200 05 bb6.
000210 10 pic x(010) value spaces.
000220 10 pic x(130) value 'one two three four five six seven
000240- ' eight nine ten eleven twelve thirteen '. 000250 10 pic x(060) value 'fourteen fifteen sixteen seventeen eighteen nineteen '.
000270 05 redefines bb6.
000280 10 bb7 occurs 20 pic x(10).
000290 05 value ' twenty thirty forty fifty sixty s
000300- 'eventy eighty ninety '.
000310 10 bb8 occurs 10 pic x(08).
000320 01 integers binary.
000330 05 i pic s9(3).
000340 05 j pic s9(3).
000350 05 k pic s9(3).
000360 05 l pic s9(3).
000370 Procedure Division.
000380 0.
000390 perform varying i from 99 by -1 until i = 1
000400 move spaces to buffer bb1
000410 move 1 to j
000420 divide i by 10 giving k remainder l
000430 string bb8(k + 1) delimited space into bb1 pointer j
000431*This is a test line:
000440 if j > 1
000450 then move bb7(l + 1) to bb1(j + 1:)
000460 else move bb7(i + 1) to bb1
000470 end-if
000473 STRING bb1 DELIMITED ' ' INTO bb1
000480 move 1 to j
000490 string bb1 ' ' bb2 ' ' bb3 delimited ' ' into buffer pointer j
000510 if i < 99
000520 move '!' to buffer(j:)
000530 display bb4 buffer
000540 display ' '
000550 end-if
000560 string ', ' bb1 ' ' bb2 '!' delimited ' ' into buffer(j:) pointer j
000580 display function upper-case(buffer(1:1)) buffer(2:)
000590 end-perform
000600 display bb4 'one bottle of beer on the wall!'
000610 display ' '
000620 display 'One bottle of beer on the wall, one bottle of beer!'
000630 display 'Take that down, pass it around, '
000640 'no more bottles of beer on the wall!'
000650 display ' '
000660 display 'No bottle of beer on the wall, '
000670 'no more bottles of beer!'
000680 display 'Go to the store and buy some more, '
000690 'ninety nine bottles of beer on the wall!'
000700 stop run
000710 .
000720 end program BotBeer.

[download the source]


Towers of Hanoi

The famous "Towers of Hanoi" program, using standard COBOL. This program was written by Amit Singh, and is available at kernelthread.com.

000100 IDENTIFICATION DIVISION.
000200 PROGRAM-ID. TheTowersOfHanoi.
000300 AUTHOR. Amit Singh <http://hanoi.kernelthread.com>.
000400
000500 ENVIRONMENT DIVISION.
000600
000700 CONFIGURATION SECTION.
000800 SOURCE-COMPUTER. ALMOST-PORTABLE.
000900 OBJECT-COMPUTER. ALMOST-PORTABLE.
001000
001100 DATA DIVISION.
001200
001300 WORKING-STORAGE SECTION.
001400
001500 01 STACK-SPACE.
001600 02 ESP PIC S9(3) COMP.
001700 02 STACK-FRAME OCCURS 1024.
001800 03 S-N PIC 9(2).
001900 03 S-FROM PIC X(2).
002000 03 S-USING PIC X(2).
002100 03 S-TO PIC X(2).
002200 03 S-PROC PIC 9(1).
002300
002400 01 CURRENT-FRAME.
002500 02 CN PIC 9(2) VALUE 3.
002600 02 CFROM PIC X(2) VALUE "1".
002700 02 CUSING PIC X(2) VALUE "2".
002800 02 CTO PIC X(2) VALUE "3".
002900 02 CPROC PIC 9(1) VALUE 0.
003000
003100 01 TMP-FRAME.
003200 02 TN PIC 9(2) VALUE 3.
003300 02 TFROM PIC X(2) VALUE "1".
003400 02 TUSING PIC X(2) VALUE "2".
003500 02 TTO PIC X(2) VALUE "3".
003600 02 TPROC PIC 9(1) VALUE 0.
003700
003800 PROCEDURE DIVISION.
003900 BEGIN-PROGRAM.
003910 PERFORM GET-DISKS
004000 MOVE 1 TO ESP
004100 MOVE CURRENT-FRAME TO STACK-FRAME (ESP)
004150 PERFORM DO-HANOI
004200 UNTIL ESP = ZERO
004300 .
004500 STOP RUN
004600 .
004700
004800 DO-HANOI.
004900 MOVE STACK-FRAME (ESP) TO CURRENT-FRAME
005000 SUBTRACT 1 FROM ESP
005100 IF CPROC = 0
005200 IF CN = 1
005300 PERFORM MOVE-DISK
005400 ELSE
005500 MOVE CN TO TN
005600 MOVE CFROM TO TFROM
005700 MOVE CUSING TO TUSING
005800 MOVE CTO TO TTO
005900 MOVE 1 TO TPROC
006000 ADD 1 TO ESP
006100 MOVE TMP-FRAME TO STACK-FRAME (ESP)
006200 MOVE CN TO TN
006300 SUBTRACT 1 FROM TN
006400 MOVE CFROM TO TFROM
006500 MOVE CTO TO TUSING
006600 MOVE CUSING TO TTO
006700 MOVE 0 TO TPROC
006800 ADD 1 TO ESP
006900 MOVE TMP-FRAME TO STACK-FRAME (ESP)
006950 END-IF
007000 ELSE
007100 PERFORM MOVE-DISK
007200 MOVE 0 TO TPROC
007300 MOVE CTO TO TTO
007400 MOVE CFROM TO TUSING
007500 MOVE CUSING TO TFROM
007600 MOVE CN TO TN
007700 SUBTRACT 1 FROM TN
007800 ADD 1 TO ESP
007900 MOVE TMP-FRAME TO STACK-FRAME (ESP)
008000 END-IF
008100
008200 MOVE-DISK.
008300 DISPLAY CFROM
008400 "--> "
008500 CTO
008600
008700 GET-DISKS.
008800 DISPLAY "How many disks to solve for? " NO ADVANCING
008900 ACCEPT CN
009000 IF CN < 1 OR CN > 10
009100 DISPLAY "Invalid number of disks (1 <= N <= 10)."
009200 EXIT PROGRAM
009300 END-IF
009400
009500 .

[download the source]


Cocoa# Hello World

This program was written as a test of referencing packages from the compiler's command line. The program uses the cocoa-sharp package (which must be in you pkg-config path) and a .nib interface definition file which I created with Apple's XCode tools. It displays a single window with the words "Hello world" written in it.

To compile this, use the following compiler commands:

mono cobolc.exe /pkg:cocoa-sharp HelloCocoa.cbl
macpack -m:2 -n:HelloWorldCOBOL -o:. -a:HelloCocoa.exe -r:HelloWorldCOBOL.nib

000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID.   HelloCocoa.
000030 AUTHOR.       SANDY DUNLOP.
000040*Testing with Cocoa.NET
000050 
000060 ENVIRONMENT DIVISION.
000070 CONFIGURATION SECTION.
000080 REPOSITORY.
000090        CLASS APPLICATION AS "Application"
000150 
000160 PROCEDURE DIVISION.
000170 MAIN-PARAGRAPH.
000180     INVOKE APPLICATION "Init"
000190     INVOKE APPLICATION "LoadNib"
000200         USING BY VALUE "HelloWorldCOBOL.nib"
000210     INVOKE APPLICATION "Run"
000220     STOP RUN.

[download the sources]