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 ...
LATEST COMMENTS
MC Press Online