Editing
Program Logic
(section)
Jump to navigation
Jump to search
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
= Program Logic = '''Project:''' pgcobol β Prime Numbers Application<br /> '''Version:''' 1.0 (reverse-engineered)<br /> '''Date:''' 2026-03-17 ----- <span id="primesmain-step-by-step-logic"></span> == 1. primesmain β Step-by-Step Logic == '''Source:''' <code>primesmain.cbl</code><br /> '''Role:''' Entry point. Parses command-line argument, initialises UI, dispatches to processing, shuts down. <span id="procedure-division-main-inline-logic"></span> === PROCEDURE DIVISION (main inline logic) === <pre>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</pre> <span id="paragraph-r90-start-session"></span> === 1.1 Paragraph: r90-start-session === <pre>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</pre> <span id="paragraph-r92-generate-primes"></span> === 1.2 Paragraph: r92-generate-primes === <pre>CALL "primesgen" USING primes-session β passes entire session control block by reference β primesgen reads methods to determine its path</pre> <span id="paragraph-r99-stop-session"></span> === 1.3 Paragraph: r99-stop-session === <pre>MOVE 'stop' TO ui-methods CALL "primesui" USING primes-ui β primesui flushes print buffer and closes primes.prt</pre> ----- <span id="primesgen-step-by-step-logic"></span> == 2. primesgen β Step-by-Step Logic == '''Source:''' <code>primesgen.cbl</code><br /> '''Role:''' Implements both the sieve algorithm (generate) and the cursor read-loop (report). Receives control via <code>primes-session</code> linkage; uses <code>primes-dal</code> and <code>primes-ui</code> locally. <span id="procedure-division-main-inline-logic-1"></span> === PROCEDURE DIVISION (main inline logic) === <pre>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</pre> <span id="paragraph-r90-start-primes-report"></span> === 2.1 Paragraph: r90-start-primes-report === <pre>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</pre> <span id="paragraph-r91-start-primes-generation"></span> === 2.2 Paragraph: r91-start-primes-generation === <pre>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</pre> <span id="paragraph-r80-test-number-sieve-main-loop-body"></span> === 2.3 Paragraph: r80-test-number ''(sieve main loop body)'' === <pre>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</pre> <span id="paragraph-r82-next-test-number"></span> === 2.4 Paragraph: r82-next-test-number === <pre>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]</pre> <span id="paragraph-r85-write-prime"></span> === 2.5 Paragraph: r85-write-prime === <pre>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</pre> <span id="paragraph-r86-report-primes-report-loop-body"></span> === 2.6 Paragraph: r86-report-primes ''(report loop body)'' === <pre>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</pre> <span id="paragraph-r89-get-next-divider"></span> === 2.7 Paragraph: r89-get-next-divider === <pre>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</pre> <span id="paragraph-r94-fetch"></span> === 2.8 Paragraph: r94-fetch === <pre>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</pre> <span id="paragraph-r99-close-primes"></span> === 2.9 Paragraph: r99-close-primes === <pre>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</pre> ----- <span id="primes-dal-step-by-step-logic"></span> == 3. primes (DAL) β Step-by-Step Logic == '''Source:''' <code>primes.cbl</code><br /> '''Role:''' Data access layer. All SQL is here. Receives control via <code>primes-dal</code> linkage. <span id="procedure-division"></span> === PROCEDURE DIVISION === <pre>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</pre> <span id="paragraph-s00-connect"></span> === 3.1 Paragraph: s00-connect === <pre>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</pre> <span id="paragraph-s01-cursor"></span> === 3.2 Paragraph: s01-cursor === <pre>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</pre> <span id="paragraph-s02-fetch-called-by-r80-get-next-prime"></span> === 3.3 Paragraph: s02-fetch ''(called by r80-get-next-prime)'' === <pre>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</pre> <span id="paragraph-r81-get-next-divider"></span> === 3.4 Paragraph: r81-get-next-divider === <pre>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</pre> <span id="paragraph-r83-write-prime"></span> === 3.5 Paragraph: r83-write-prime === <pre>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</pre> <span id="paragraph-s99-disconnect"></span> === 3.6 Paragraph: s99-disconnect === <pre>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</pre> ----- <span id="primesui-step-by-step-logic"></span> == 4. primesui β Step-by-Step Logic == '''Source:''' <code>primesui.cbl</code><br /> '''Role:''' All output. Manages the <code>primes.prt</code> print file and writes to the system console. <span id="procedure-division-1"></span> === PROCEDURE DIVISION === <pre>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</pre> <span id="paragraph-r90-start-primesui"></span> === 4.1 Paragraph: r90-start-primesui === <pre>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</pre> <span id="paragraph-r92-write-primesui-called-for-every-prime-row"></span> === 4.2 Paragraph: r92-write-primesui ''(called for every prime row)'' === <pre>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</pre> <span id="paragraph-r93-new-page"></span> === 4.3 Paragraph: r93-new-page === <pre>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</pre> <span id="paragraph-r94-eop-end-of-page"></span> === 4.4 Paragraph: r94-eop ''(end-of-page)'' === <pre>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</pre> <span id="paragraph-r98-message-ui"></span> === 4.5 Paragraph: r98-message-ui === <pre>DISPLAY process-message UPON scherm β writes program-name + paragraph + message to console</pre> <span id="paragraph-r99-stop-primesui"></span> === 4.6 Paragraph: r99-stop-primesui === <pre>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</pre> <hr/> Terug naar: [[Primes_programs_specifications]] | [[Cobol and PostgreSQL]]
Summary:
Please note that all contributions to Webhuis wiki are considered to be released under the GNU Free Documentation License 1.3 or later (see
Project:Copyrights
for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Navigation menu
Personal tools
Not logged in
Talk
Contributions
Create account
Log in
Namespaces
Page
Discussion
English
Views
Read
Edit
View history
More
Search
Navigation
Voorpagina
Cobol and PostgreSQL
PostgreSQL
CFEngine
Proxmox
Webhuis Kennisbank
Basale infra
Webhuis bouwstenen
Webhuis configuratie
Webhuis Infra
Webhuis Support
Webhuis Raspberry
Opzet Applicaties
Business Applicaties
Community portal
Current events
Recent changes
Random page
Help
sitesupport
Tools
What links here
Related changes
Special pages
Page information