Program Logic

From Webhuis wiki
Jump to navigation Jump to search

Program Logic[edit]

Project: pgcobol — Prime Numbers Application
Version: 1.0 (reverse-engineered)
Date: 2026-03-17



1. primesmain — Step-by-Step Logic[edit]

Source: primesmain.cbl
Role: Entry point. Parses command-line argument, initialises UI, dispatches to processing, shuts down.

PROCEDURE DIVISION (main inline logic)[edit]

Step 1  ACCEPT commandline-args FROM COMMAND-LINE
        → reads first token of the OS command line into commandline-args (PIC X(32))

Step 2  MOVE commandline-args TO methods
        MOVE 'primesmain'    TO program-name
        → loads session control block ready for dispatch
        → sets log identity for subsequent messages

Step 3  PERFORM r90-start-session
        → opens primes.prt and verifies UI layer is ready (see §1.1)

Step 4  EVALUATE TRUE
          WHEN report-primes   (commandline-args = "report")
            LOG "Primes report generation starts."
            SET methods = "report"
            PERFORM r92-generate-primes   → CALL primesgen

          WHEN generate-primes (commandline-args = "generate")
            LOG "Primes generation starts."
            SET methods = "generate"
            *** PERFORM r92-generate-primes is COMMENTED OUT ***

          WHEN OTHER
            LOG "Bad parameter, program initialisation failed."
            PERFORM r99-stop-session
            STOP RUN

Step 5  LOG "Primes run complete, program stops."

Step 6  PERFORM r99-stop-session

Step 7  STOP RUN

1.1 Paragraph: r90-start-session[edit]

MOVE 'start-session' TO program-paragraph
MOVE 'start'         TO ui-methods
CALL "primesui" USING primes-ui

IF ui-method-ok (result = 0) THEN
  LOG "UI initialisation succeeded."
  LOG commandline-args value
ELSE
  DISPLAY "Emergency console message program stops." UPON scherm
  STOP RUN                ← hard abort; no graceful close

1.2 Paragraph: r92-generate-primes[edit]

CALL "primesgen" USING primes-session
← passes entire session control block by reference
← primesgen reads methods to determine its path

1.3 Paragraph: r99-stop-session[edit]

MOVE 'stop' TO ui-methods
CALL "primesui" USING primes-ui
← primesui flushes print buffer and closes primes.prt

2. primesgen — Step-by-Step Logic[edit]

Source: primesgen.cbl
Role: Implements both the sieve algorithm (generate) and the cursor read-loop (report). Receives control via primes-session linkage; uses primes-dal and primes-ui locally.

PROCEDURE DIVISION (main inline logic)[edit]

Step 1  EVALUATE TRUE on methods (from primes-session)

          WHEN report-primes
            PERFORM r90-start-primes-report
            IF session-method-ok THEN
              PERFORM r86-report-primes UNTIL session-method-eof

          WHEN generate-primes
            PERFORM r91-start-primes-generation
            IF session-method-ok THEN
              PERFORM r80-test-number UNTIL test-number = 999999999

          WHEN OTHER
            SET program-name = "primesgen", program-paragraph = "main"
            LOG "Bad method, primes process failed."

Step 2  PERFORM r99-close-primes

Step 3  EXIT PROGRAM

2.1 Paragraph: r90-start-primes-report[edit]

CALL primes "connect"
IF dal-method-ok THEN LOG "DB init succeeded." ELSE LOG "DB init failed." + session-result=1

CALL primes "cursor"
  → START TRANSACTION
  → OPEN primescursor (SELECT * FROM primes)
IF dal-method-ok THEN LOG "Cursor init succeeded." ELSE LOG "Cursor init failed." + session-result=1

IF dal-method-ok THEN PERFORM r94-fetch (fetch first row)

IF dal-method-ok THEN
  LOG "Fetch first row ok." + dal-result=0
ELSE
  LOG "Fetch first row nok." + dal-result=1

2.2 Paragraph: r91-start-primes-generation[edit]

CALL primes "connect"
IF dal-method-ok THEN
  test-divider   = 2
  old-ident      = 1
  test-number    = 3
  test-number-sqr = COMPUTE test-number ** 0.5   (= SQRT(3) ≈ 1.732)
  LOG "DB init succeeded."
ELSE
  LOG "DB init failed."
  session-result = 1

2.3 Paragraph: r80-test-number (sieve main loop body)[edit]

DIVIDE test-number BY test-divider
       GIVING test-quot REMAINDER test-rest

EVALUATE TRUE
  WHEN test-rest = 0
    → test-number is divisible; it is composite
    PERFORM r82-next-test-number

  WHEN test-divider > test-number-sqr
    → no factor ≤ √test-number found; test-number IS PRIME
    PERFORM r85-write-prime
    PERFORM r82-next-test-number

  WHEN OTHER
    → keep trying; get next trial divisor from DB
    PERFORM r89-get-next-divider

2.4 Paragraph: r82-next-test-number[edit]

ADD 2 TO test-number                          ← advance to next odd integer
COMPUTE test-number-sqr = test-number ** 0.5  ← recompute √
MOVE 1 TO old-ident                           ← reset divider index to first prime
PERFORM r89-get-next-divider                  ← load test-divider = prime[2]

2.5 Paragraph: r85-write-prime[edit]

MOVE 'write' TO ui-methods
CALL "primes"   USING primes-dal    ← INSERT INTO primes (prime) VALUES (prime-number)
CALL "primesui" USING primes-ui     ← add to print buffer

2.6 Paragraph: r86-report-primes (report loop body)[edit]

MOVE 'write'     TO ui-methods
MOVE primes-data TO u-primes        ← copy sequence + value into UI block
CALL "primesui" USING primes-ui     ← accumulate into 6-column print buffer
PERFORM r94-fetch                   ← advance cursor

2.7 Paragraph: r89-get-next-divider[edit]

MOVE 'get' TO gen-methods           ← note: uses local "primes" group, not primes-dal
CALL "primes" USING primes          ← DAL selects prime WHERE ident = old-ident+1
                                      sets test-divider

2.8 Paragraph: r94-fetch[edit]

MOVE 'next-prime' TO dal-methods
CALL "primes" USING primes-dal      ← FETCH primescursor INTO primes-row
IF dal-method-ok THEN
  next sentence
ELSE
  LOG "Fetch failed."
  session-result = 1

2.9 Paragraph: r99-close-primes[edit]

MOVE 'disconnect' TO dal-methods
CALL "primes" USING primes          ← note: passes local "primes" group, not primes-dal
IF dal-method-ok THEN LOG "DB close succeeded."
ELSE LOG "DB close failed." + session-result=1

3. primes (DAL) — Step-by-Step Logic[edit]

Source: primes.cbl
Role: Data access layer. All SQL is here. Receives control via primes-dal linkage.

PROCEDURE DIVISION[edit]

EVALUATE TRUE on dal-methods
  WHEN next-prime      → PERFORM r80-get-next-prime
  WHEN next-divider    → PERFORM r81-get-next-divider
  WHEN write-prime     → PERFORM r83-write-prime
  WHEN db-connect      → PERFORM s00-connect
  WHEN db-cursor       → PERFORM s01-cursor
  WHEN db-disconnect   → PERFORM s99-disconnect
  WHEN OTHER           → dal-result = 1
EXIT PROGRAM

3.1 Paragraph: s00-connect[edit]

MOVE 'CONNECT' TO CUR-STEP
EXEC SQL
  CONNECT TO :DATASRC AS primes USER :DBUSR USING :DBPWD
END-EXEC
IF SQLCODE = 0 THEN
  dal-result = 0
  LOG "Database initialisation ok."
ELSE
  LOG "Database initialisation failed, terminating program."
  dal-result = 1

3.2 Paragraph: s01-cursor[edit]

EXEC SQL AT primes START TRANSACTION END-EXEC
IF SQLCODE = 0 THEN LOG "Start transaction ok."
ELSE LOG "Start transaction nok." + dal-result = 1

IF dal-method-ok THEN
  EXEC SQL OPEN primescursor END-EXEC
  IF SQLCODE = 0 THEN LOG "Start primescursor ok."
  ELSE LOG "Start primescursor nok." + dal-result = 1

3.3 Paragraph: s02-fetch (called by r80-get-next-prime)[edit]

EXEC SQL FETCH primescursor INTO :primes-row END-EXEC
IF SQLCODE = 0 THEN
  primes-sequence = r-ident
  prime-number    = r-prime
  dal-result = 0
ELSE
  LOG "Fetch row nok."
  dal-result = 1
  LOG from program-name / program-paragraph context

3.4 Paragraph: r81-get-next-divider[edit]

new-ident = old-ident + 1

EXEC SQL AT primes
  SELECT prime INTO :test-divider
  FROM primes WHERE ident = :new-ident
END-EXEC

IF SQLCODE = 0 THEN next sentence
ELSE DISPLAY SQLCODE + "select new-divider nok" on console

MOVE new-ident TO old-ident

3.5 Paragraph: r83-write-prime[edit]

EXEC SQL AT primes
  INSERT INTO primes (prime) VALUES (:prime)
END-EXEC

IF SQLCODE = 0 THEN next sentence
ELSE
  DISPLAY SQLCODE on console
  DISPLAY "primes.cbl insert next prime nok: " prime-number on console

*** EXEC SQL AT primes COMMIT END-EXEC   ← COMMENTED OUT

3.6 Paragraph: s99-disconnect[edit]

MOVE 'DISCONNECT' TO CUR-STEP
EXEC SQL CONNECT RESET primes END-EXEC
IF SQLCODE = 0 THEN
  dal-result = 0
  LOG "Close database ok."
ELSE
  LOG "Database initialisation failed, ending program."
  dal-result = 1
DISPLAY "s99 disconnect from database" on console
DISPLAY SQLCODE on console

4. primesui — Step-by-Step Logic[edit]

Source: primesui.cbl
Role: All output. Manages the primes.prt print file and writes to the system console.

PROCEDURE DIVISION[edit]

EVALUATE TRUE on ui-methods
  WHEN start-ui    → PERFORM r90-start-primesui
  WHEN write-ui    → PERFORM r92-write-primesui
  WHEN stop-ui     → PERFORM r99-stop-primesui
  WHEN message-ui  → PERFORM r98-message-ui
  WHEN OTHER       → ui-method-result = 1
EXIT PROGRAM

4.1 Paragraph: r90-start-primesui[edit]

MOVE 'start-primesui' TO program-paragraph
MOVE 'start-printer'  TO program-message

OPEN OUTPUT fprinter   (primes.prt)

IF primes-prt-status = '00' THEN
  ui-method-result = 0
  SET primes-idx TO 1       ← initialise table column index
  LOG "Open printer Ok"
ELSE
  ui-method-result = 1
  DISPLAY primes-prt-status on console

4.2 Paragraph: r92-write-primesui (called for every prime row)[edit]

t-ident(primes-idx) = u-sequence   ← load sequence into current cell
t-prime(primes-idx) = u-number     ← load prime value into current cell
SET primes-idx UP BY 1             ← advance to next cell

IF new-page (print-new-page = 1) THEN
  PERFORM r93-new-page             ← write heading + column header

IF primes-idx = 7 THEN             ← 6 entries filled (index is post-increment)
  MOVE primes-table TO print-buffer
  WRITE file-buffer FROM print-buffer   ← write the 132-char data line
  SET primes-idx TO 1

IF linage-counter = 53 THEN        ← within 3 lines of page end
  PERFORM r94-eop

4.3 Paragraph: r93-new-page[edit]

MOVE primes-heading TO print-buffer
WRITE file-buffer FROM print-buffer   ← "primes overview"
MOVE table-header  TO print-buffer
WRITE file-buffer FROM print-buffer   ← "Sequence  Prime " × 6
MOVE ZERO TO print-new-page           ← clear new-page flag

4.4 Paragraph: r94-eop (end-of-page)[edit]

MOVE page-number    TO f-page-number
MOVE ' '            TO print-buffer
WRITE file-buffer FROM print-buffer   ← blank separator line
MOVE primes-footing TO print-buffer
WRITE file-buffer FROM print-buffer   ← "                    page: NNN"
ADD 1 TO page-number
MOVE 1 TO print-new-page              ← trigger new heading on next write

4.5 Paragraph: r98-message-ui[edit]

DISPLAY process-message UPON scherm   ← writes program-name + paragraph + message to console

4.6 Paragraph: r99-stop-primesui[edit]

MOVE 0 TO u-sequence
MOVE 0 TO u-number
PERFORM r92-write-primesui UNTIL new-page   ← pad remaining cells to trigger line flush

MOVE 'stop-primesui' TO program-paragraph
MOVE 'close printer' TO program-message
PERFORM r98-message-ui

CLOSE fprinter

MOVE primes-prt-status TO ui-method-result
IF primes-prt-status = '00' THEN next sentence
ELSE DISPLAY primes-prt-status on console

Terug naar: Primes_programs_specifications | Cobol and PostgreSQL