99 Bottles in Tandem TAL (Transaction Application Language): ?NOLIST ?SOURCE $SYSTEM.SYSTEM.EXTDECS0 (FILE_OPEN_,FILE_CLOSE_,WRITE,INITIALIZER, ? PROCESS_STOP_,NUMOUT,PROCESS_GETINFO_); INT MYTERM^NAME[0:11], MYTERM^NUM, MYTERM^LEN, ERROR, NUM^BOTTLES; STRING .LINE1[0:37], .LINE2[0:32], .MSG^PTR; ?LIST PROC BOTTLES MAIN; BEGIN CALL INITIALIZER(,,,,,); ERROR := PROCESS_GETINFO_(,,,,,MYTERM^NAME:24,MYTERM^LEN,,,,,,,,,); ERROR := FILE_OPEN_(MYTERM^NAME:MYTERM^LEN,MYTERM^NUM); IF ERROR <> 0 THEN CALL PROCESS_STOP_(,,1); NUM^BOTTLES := 99; LINE1 ':=' " BOTTLES OF BEER ON THE WALL"; CALL NUMOUT(LINE1[0],NUM^BOTTLES,10,2); LINE2 ':=' "TAKE ONE DOWN AND PASS IT AROUND"; WHILE (NUM^BOTTLES > 0) DO BEGIN CALL WRITE(MYTERM^NUM, LINE1, 30); CALL WRITE(MYTERM^NUM, LINE1, 18); CALL WRITE(MYTERM^NUM, LINE2, 32); NUM^BOTTLES := NUM^BOTTLES - 1; IF (NUM^BOTTLES = 1) THEN LINE1 ':=' " BOTTLE OF BEER ON THE WALL "; IF (NUM^BOTTLES > 0) THEN CALL INITIALIZER(,,,,,); ERROR := PROCESS_GETINFO_(,,,,,MYTERM^NAME:24,MYTERM^LEN,,,,,,,,,); ERROR := FILE_OPEN_(MYTERM^NAME:MYTERM^LEN,MYTERM^NUM); IF ERROR <> 0 THEN CALL PROCESS_STOP_(,,1); NUM^BOTTLES := 99; LINE1 ':=' " BOTTLES OF BEER ON THE WALL"; CALL NUMOUT(LINE1[0],NUM^BOTTLES,10,2); LINE2 ':=' "TAKE ONE DOWN AND PASS IT AROUND"; WHILE (NUM^BOTTLES > 0) DO BEGIN CALL WRITE(MYTERM^NUM, LINE1, 30); CALL WRITE(MYTERM^NUM, LINE1, 18); CALL WRITE(MYTERM^NUM, LINE2, 32); NUM^BOTTLES := NUM^BOTTLES - 1; IF (NUM^BOTTLES = 1) THEN LINE1 ':=' " BOTTLE OF BEER ON THE WALL "; IF (NUM^BOTTLES > 0) THEN BEGIN CALL NUMOUT(LINE1[0],NUM^BOTTLES,10,2); CALL WRITE(MYTERM^NUM, LINE1, 30); END; END; LINE1 ':=' "NO MORE BOTTLES OF BEER ON THE WALL !!"; CALL WRITE(MYTERM^NUM, LINE1, 37); END;