SoftwareMining's automated, rule-based Translation Toolkit converts COBOL applications into maintainable C#. This page compares a small COBOL program with the C# source code generated by the SoftwareMining converter.
The example demonstrates how COBOL business logic, data definitions and program flow are represented in readable, object-oriented C# code. Functional behaviour must ultimately be validated against the original COBOL application.
This introductory example focuses on readability and structural clarity. It does not demonstrate more advanced conversion requirements such as GO TO handling, dead-code analysis, REDEFINES, CICS integration or pointer translation.
For detailed coverage of these capabilities, see the Enterprise COBOL Translator Feature List .
PROGRAM-ID. LOAN.
DATA DIVISION.
FILE SECTION.
WORKING-STORAGE SECTION.
01 WS-VARS.
05 PRINCIPAL PIC 9(9) VALUE 0.
05 INTEREST-RATE PIC 99V99 VALUE 0.
05 LOAN-LENGTH PIC 99 VALUE 0.
05 NEXT-INTEREST PIC 99V99.
05 NEXT-YEAR PIC 99.
01 CLIENT-RECORD.
05 NAME PIC X(20).
05 ADDRESS PIC X(20) OCCURS 3 TIMES.
05 ID PIC 9(4) COMP.
...
/// Sample COBOL to C# translated code
namespace Softwaremining.Cobol2CSharp.Example
{
public sealed class Loan : BaseService {
// Note: 01 level WS-VARS name is simplified (Optional)
// and converted to a DAO
// The DAO handles REDEFINES, COMP, OCCURS-DEPENDING, ...
private Vars ;
// Client-RECORD has been translated to ClientRecord DAO,
// but since the program does not reference ClientRecord,
// it will automatically be commented out.
// private ClientRecord clientRecord;
...
/// constructor
public Loan(BaseService parent) : base(parent)
{
vars = new Vars(this);
// clientRecord = new ClientRecord(this);
...
* Main entry point to program
LOAN-MAIN-001.
* -
* CLEAR SCREEN AND READ DATA
* -
IF LOAN-LENGTH > 4 THEN
COMPUTE START-YEAR = LOAN-LENGTH - 4
ELSE
COMPUTE START-YEAR = 0.
IF INTEREST-RATE > 0.4 THEN
COMPUTE START-INTEREST = INTEREST-RATE - 0.4
ELSE
COMPUTE START-INTEREST = 0
END-IF
MOVE 1 TO YEAR-ROW.
* -
* GO THRU THE NUMBER OF YEARS
* -
MOVE "% Rate->" TO DSP-NO-YRS(1).
MOVE START-YEAR TO NEXT-YEAR
PERFORM VARYING YEAR-ROW FROM 2 BY 1 UNTIL YEAR-ROW = 11
PERFORM DO-NEXT-ROW
ADD 1 TO NEXT-YEAR
END-PERFORM.
* -
* AND EXIT
* -
STOP RUN.
/// <summary>
/// Main entrance to program
/// </summary>
protected void LoanMain ()
{
// -
// CLEAR SCREEN AND READ DATA
// -
if (vars.LoanLength > 4)
{
vars.StartYear = vars.LoanLength - 4;
}
else
{
vars.StartYear = 0;
}
if (vars.InterestRate > 0.4)
{
vars.StartInterest = vars.InterestRate - 0.4;
}
else
{
vars.StartInterest = 0;
}
vars.YearRow = 1;
vars.setYearRow(1);
// -
// GO THRU THE NUMBER OF YEARS
// -
displayResult.SetNoYrs(0, "% Rate->");
vars.NextYear = vars.StartYear;
vars.YearRow = 2;
while (vars.YearRow != 11)
{
DoNextRow();
vars.NextYear = vars.NextYear + 1;
vars.YearRow = vars.YearRow + 1;
}
// -
// AND EXIT
// -
Stop();
}
*
* Calculates values for individual rows
*
DO-NEXT-ROW.
MOVE START-INTEREST TO NEXT-INTEREST
PERFORM VARYING INTEREST-COL FROM 1 BY 1
UNTIL INTEREST-COL = 10
MOVE NEXT-INTEREST TO DSP-RESULT(1, INTEREST-COL)
PERFORM CALCULATE
MOVE NEXT-RESULT TO DSP-RESULT(YEAR-ROW, INTEREST-COL)
ADD 0.1 TO NEXT-INTEREST
END-PERFORM.
/// <summary>
/// Calculates values for individual rows
/// </summary>
protected void DoNextRow ()
{
vars.NextInterest = vars.StartInterest;
vars.InterestCol = 1;
while (vars.InterestCol != 10)
{
displayResult.SetResult(
0,
vars.InterestCol - 1,
vars.NextInterest
);
Calculate();
displayResult.SetResult(
vars.YearRow - 1,
vars.InterestCol - 1,
vars.NextResult
);
vars.NextInterest = vars.NextInterest + 0.1;
vars.InterestCol = vars.InterestCol + 1;
}
}
*
* The next paragraph calculates CELL values
*
CALCULATE.
COMPUTE INTDEC = NEXT-INTEREST / (12.0 * 100.0)
COMPUTE NUMMONTHS = NEXT-YEAR * 12.0
...
/// <summary>
/// The next paragraph calculates CELL values
/// </summary>
protected void Calculate ()
{
vars.Intdec = vars.NextInterest / (12.0 * 100.0);
vars.Nummonths = (int)((double)vars.NextYear * 12.0);
...
}