TechTalk: Implementing Stacks in RPG

RPG
Typography
  • Smaller Small Medium Big Bigger
  • Default Helvetica Segoe Georgia Times

A stack is a sequence in which all insert and remove operations occur at one end. The classic analogy is the spring-loaded plate dispenser found in cafeterias. When clean plates are added to the stack, the other plates are "pushed" down. When a plate is removed, the next plate "pops" up.

A good use of stack operations on the AS/400 is to implement F9= Retrieve to recall recently-executed commands. This function may be included in any program that provides a command line for user execution of commands. One example is an order entry program used by a data entry operator who takes orders over the telephone. A command line is provided so that the operator can execute common commands (such as WRKSPLF) without exiting the program. Another example is a menu program for the system operator, which retrieves menu option text and the program to be called from a database file. The program also provides a command line. In both cases, when a command is executed, it is "pushed" onto the stack. When the F9=Retrieve key is pressed, the most recently-executed command is "popped" off of the stack and displayed on the command line.

The code fragment listed in 1a illustrates using an array to implement a stack. When a command is executed, it is stored in an array, then the array index is incremented. When function key 9 is pressed, the current array element is moved to the screen field, and the index is decremented. There are two drawbacks to this method. The first is the limitation imposed by the size of the array. And the second is that any increase in the array size causes an increase in the program size.

The code fragment listed in Figure 1a illustrates using an array to implement a stack. When a command is executed, it is stored in an array, then the array index is incremented. When function key 9 is pressed, the current array element is moved to the screen field, and the index is decremented. There are two drawbacks to this method. The first is the limitation imposed by the size of the array. And the second is that any increase in the array size causes an increase in the program size.

The CL program shown in 1b demonstrates the use of a data queue to implement a stack. First the data queue is created in library QTEMP specifying a maximum length of 155 and a Last-in/First-out retrieval sequence. After the program executes, the data queue is deleted.

The CL program shown in Figure 1b demonstrates the use of a data queue to implement a stack. First the data queue is created in library QTEMP specifying a maximum length of 155 and a Last-in/First-out retrieval sequence. After the program executes, the data queue is deleted.

The code fragment shown in 1c demonstrates an RPG program using a data queue to implement a stack. When a command is executed from the command line, it is pushed onto the data queue stack with a call to QSNDDTAQ. When function key 9 is pressed, the most recent command is popped off the stack with a call to QRCVDTAQ. Both QS- NDDTAQ and QRCVDTAQ are prerelease 3.0 APIs.

The code fragment shown in Figure 1c demonstrates an RPG program using a data queue to implement a stack. When a command is executed from the command line, it is pushed onto the data queue stack with a call to QSNDDTAQ. When function key 9 is pressed, the most recent command is popped off the stack with a call to QRCVDTAQ. Both QS- NDDTAQ and QRCVDTAQ are prerelease 3.0 APIs.

The data queue implementation takes more code, but is not limited like the array implementation. Since the data queue is created in QTEMP and deleted afterwards, no housekeeping is needed.

Recommended reading: "Creating OS/400 Style Rolling Menus," by Art Tostaine, Jr., Midrange Computing, May 1990" AS/400 Data Queues," by Richard Shaler, CDP, Midrange Computing, August 1990

- Jonathan Yergin


TechTalk: Implementing Stacks in RPG

Figure 1A Using an array to implement a stack

 Figure 1a: Using an Array to Implement a Stack ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ... E CMD 100100 Previous CMD s C Z-ADD1 X 20 Cmd Stack Indx /SPACE 1 C SCNCMD IFNE *BLANKS C MOVELSCNCMD CMD,X C X IFLT 99 C ADD 1 X C END C END /SPACE 1 C *INKI IFEQ 1 F9=Retrieve C MOVELCMD,X SCNCMD C X IFGT 1 C SUB 1 X C END C END ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ... 
TechTalk: Implementing Stacks in RPG

Figure 1B CL program using data queue to implement a stack

 Figure 1b: CL Program Using a Data Queue to Implement a Stack CRTDTAQ DTAQ(QTEMP/STAKDTAQ) MAXLEN(155) SEQ(*LIFO) + TEXT( Data Queue for Stack Operations ) CALL PGM(STACKR2) DLTDTAQ DTAQ(QTEMP/STAKDTAQ) 
TechTalk: Implementing Stacks in RPG

Figure 1C RPG program using data queue to implement a stack

 Figure 1c: RPG Program Using a Data Queue to Implement a Stack ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ... C* Initialize fields. C MOVEL STAKDTAQ DATAQ@ 10 Data Queue C MOVEL *LIBL DQLIB@ 10 DTAQ Library C MOVE 155 FLDLN@ 50 Field Length C MOVE *ZEROS WAITS@ 50 WAIT Seconds C MOVE *BLANKS FIELD@155 Data Field C MOVE *BLANKS DQOPCD 4 OP Code /SPACE 1 C* PUSH commands onto the DTAQ stack. C SCNCMD IFNE *BLANKS C MOVE PUSH DQOPCD C MOVELSCNCMD FIELD@ C EXSR XPRCDQ C END /SPACE 1 C* POP commands off the DTAQ stack. C *INKI IFEQ 1 F9=Retrieve C MOVE POP DQOPCD C EXSR XPRCDQ C* If field length is not zero, an entry was retrieved. C FLDLN@ IFNE *ZEROS C MOVELFIELD@ SCNCMD C ELSE C* Else, no more entries. Reinitialize field length. C MOVE 155 FLDLN@ C END C END /SPACE 3 C*---------------------------------------------------------------* C* Process data queue PUSH/POP request. C*---------------------------------------------------------------* C XPRCDQ BEGSR /SPACE 1 C DQOPCD IFEQ PUSH C CALL QSNDDTAQ C PARM DATAQ@ C PARM DQLIB@ C PARM FLDLN@ C PARM FIELD@ C ELSE /SPACE 1 C DQOPCD IFEQ POP C CALL QRCVDTAQ C PARM DATAQ@ C PARM DQLIB@ C PARM FLDLN@ C PARM FIELD@ C PARM WAITS@ C END C END /SPACE 1 C ENDSR ... 1 ... ... 2 ... ... 3 ... ... 4 ... ... 5 ... ... 6 ... ... 7 ... 
BLOG COMMENTS POWERED BY DISQUS

LATEST COMMENTS

Support MC Press Online

$

Book Reviews

Resource Center

  •  

  • LANSA Business users want new applications now. Market and regulatory pressures require faster application updates and delivery into production. Your IBM i developers may be approaching retirement, and you see no sure way to fill their positions with experienced developers. In addition, you may be caught between maintaining your existing applications and the uncertainty of moving to something new.

  • The MC Resource Centers bring you the widest selection of white papers, trial software, and on-demand webcasts for you to choose from. >> Review the list of White Papers, Trial Software or On-Demand Webcast at the MC Press Resource Center. >> Add the items to yru Cart and complet he checkout process and submit

  • SB Profound WC 5536Join us for this hour-long webcast that will explore:

  • Fortra IT managers hoping to find new IBM i talent are discovering that the pool of experienced RPG programmers and operators or administrators with intimate knowledge of the operating system and the applications that run on it is small. This begs the question: How will you manage the platform that supports such a big part of your business? This guide offers strategies and software suggestions to help you plan IT staffing and resources and smooth the transition after your AS/400 talent retires. Read on to learn: