Program Logic
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