複数のパラメータを持つプログラムやプロシージャーで省略可能にするにはどのようにすれば
よいのであろうか?
あるいは、あるプログラムやプロシージャーのパラメータを増やしたいのだが単純にパラメータの
数を増やしただけでは、それを呼び出して利用している既存のプログラムがパラメータの実行時の
不足エラーとなってしまう。
このような問題を解決する手法を紹介する。
それは %PARMS と OPTIONS(*NOPASS) の組み合わせを利用することである。
%PARMS とは受け取りパラメータの個数を示している。
またパラメータ欄のオプションとして OPTIONS(*NOPASS) を記述することによって
そのパラメータは省略可能なものとして理解される。
ここではその例として RPGエンジンIII の SPAWN_CGI プロシージャーを紹介する。
SPAWN_CGI プロシージャーとは、任意のユーザーCGI の中から別のCGI を呼び出す
プロシージャーである。
CALL で子CGI を呼び出したのでは結果のHTMLは同じブラウザ上に表示されるが
SPAWN_CGI で子CGI を呼び出すと別の新しいブラウザが起動されて子CGI の結果
が表示される。
それはともかく SPAWN_CGI は
SPAWM_CGI(子CGI名: 子CGIライブラリー名: 待機オプション: パラメータ1:パラメータ2: ... パラメータ10)
という形式である。
このとき待機オプション以下は省略可能とする。
次は RPGエンジンIII のソースの一部である。
SPAWN_CGI は C/400で書かれた別の RPGSPAWN_CGI というプロシージャーを呼び出している。
1484.00 ************************************************************
1485.00 * SPAWN_CGI : 子 CGI の投入
1486.00 ************************************************************
1487.00 *---( SPAWN_CGI PROCEDURE ここから )----------------------*
1488.00 P SPAWN_CGI B EXPORT
1489.00 *( 出力プロシージャーの定義 )
1490.00 D SPAWN_CGI PI
1491.00 D CGI 10A Value
1492.00 D CGILIB 10A Value
1493.00 D WAIT 4A Value OPTIONS(*NOPASS)
1494.00 D PARM01 256A Value OPTIONS(*NOPASS)
1495.00 D PARM02 256A Value OPTIONS(*NOPASS)
1496.00 D PARM03 256A Value OPTIONS(*NOPASS)
1497.00 D PARM04 256A Value OPTIONS(*NOPASS)
1498.00 D PARM05 256A Value OPTIONS(*NOPASS)
1499.00 D PARM06 256A Value OPTIONS(*NOPASS)
1500.00 D PARM07 256A Value OPTIONS(*NOPASS)
1501.00 D PARM08 256A Value OPTIONS(*NOPASS)
1502.00 D PARM09 256A Value OPTIONS(*NOPASS)
1503.00 D PARM10 256A Value OPTIONS(*NOPASS)
1504.00
1485.00 * SPAWN_CGI : 子 CGI の投入
1486.00 ************************************************************
1487.00 *---( SPAWN_CGI PROCEDURE ここから )----------------------*
1488.00 P SPAWN_CGI B EXPORT
1489.00 *( 出力プロシージャーの定義 )
1490.00 D SPAWN_CGI PI
1491.00 D CGI 10A Value
1492.00 D CGILIB 10A Value
1493.00 D WAIT 4A Value OPTIONS(*NOPASS)
1494.00 D PARM01 256A Value OPTIONS(*NOPASS)
1495.00 D PARM02 256A Value OPTIONS(*NOPASS)
1496.00 D PARM03 256A Value OPTIONS(*NOPASS)
1497.00 D PARM04 256A Value OPTIONS(*NOPASS)
1498.00 D PARM05 256A Value OPTIONS(*NOPASS)
1499.00 D PARM06 256A Value OPTIONS(*NOPASS)
1500.00 D PARM07 256A Value OPTIONS(*NOPASS)
1501.00 D PARM08 256A Value OPTIONS(*NOPASS)
1502.00 D PARM09 256A Value OPTIONS(*NOPASS)
1503.00 D PARM10 256A Value OPTIONS(*NOPASS)
1504.00
1505.00 D*( RPGSPAWN_CGI プロトタイプ宣言 )
1506.00 D RPGSPAWN_CGI PR ExtProc('RPGSPAWN_CGI')
1507.00 D CGI * Value
1508.00 D CGILIB * Value
1509.00 D WAIT * Value
1510.00 D PRMSU * Value
1511.00 D PARM01 * Value OPTIONS(*NOPASS)
1512.00 D PARM02 * Value OPTIONS(*NOPASS)
1513.00 D PARM03 * Value OPTIONS(*NOPASS)
1514.00 D PARM04 * Value OPTIONS(*NOPASS)
1515.00 D PARM05 * Value OPTIONS(*NOPASS)
1516.00 D PARM06 * Value OPTIONS(*NOPASS)
1517.00 D PARM07 * Value OPTIONS(*NOPASS)
1518.00 D PARM08 * Value OPTIONS(*NOPASS)
1519.00 D PARM09 * Value OPTIONS(*NOPASS)
1520.00 D PARM10 * Value OPTIONS(*NOPASS)
1521.00
1522.00 D YES S 4A
1523.00 D PRMSU S 3S 0
1524.00 D PRMC S 3A
1525.00
1526.00 C CGI CAT X'00':0 CGI
1527.00 C CGILIB CAT X'00':0 CGILIB
1528.00 C EVAL PRMSU = %PARMS
1529.00 C SUB 3 PRMSU 50
1530.00 C 50 Z-ADD 0 PRMSU
1531.00 C MOVE PRMSU PRMC
1532.00 C PRMC CAT X'00':0 PRMC
1533.00 C IF %PARMS >=3
1534.00 C WAIT CAT X'00':0 WAIT
1535.00 C END
1536.00 C IF PRMSU >=1
1537.00 C PARM01 CAT X'00':0 PARM01
1538.00 C END
1539.00 C IF PRMSU >=2
1540.00 C PARM02 CAT X'00':0 PARM02
1541.00 C END
1542.00 C IF PRMSU >=3
1543.00 C PARM03 CAT X'00':0 PARM03
1544.00 C END
1545.00 C IF PRMSU >=4
1546.00 C PARM04 CAT X'00':0 PARM04
1547.00 C END
1548.00 C IF PRMSU >=5
1549.00 C PARM05 CAT X'00':0 PARM05
1550.00 C END
1551.00 C IF PRMSU >=6
1552.00 C PARM06 CAT X'00':0 PARM06
1553.00 C END
1554.00 C IF PRMSU >=7
1555.00 C PARM07 CAT X'00':0 PARM07
1556.00 C END
1557.00 C IF PRMSU >=8
1558.00 C PARM08 CAT X'00':0 PARM08
1559.00 C END
1560.00 C IF PRMSU >=9
1561.00 C PARM09 CAT X'00':0 PARM09
1562.00 C END
1563.00 C IF PRMSU >=10
1564.00 C PARM10 CAT X'00':0 PARM10
1565.00 C END
1566.00 C*
1567.00 C SELECT
1568.00 C WHEN %PARMS = 2
1569.00 C MOVEL '*YES' YES
1570.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1571.00 C %ADDR(YES):%ADDR(PRMC))
1572.00 C WHEN %PARMS = 3
1573.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1574.00 C %ADDR(WAIT):%ADDR(PRMC))
1575.00 C WHEN %PARMS = 4
1576.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1577.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01))
1578.00 C WHEN %PARMS = 5
1579.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1580.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):
1581.00 C %ADDR(PARM02))
1582.00 C WHEN %PARMS = 6
1583.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1584.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):
1585.00 C %ADDR(PARM02):%ADDR(PARM03))
1586.00 C WHEN %PARMS = 7
1587.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1588.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):
1589.00 C %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04)
1590.00 C WHEN %PARMS = 8
1591.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1592.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):
1593.00 C %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04)
1594.00 C %ADDR(PARM05))
1595.00 C WHEN %PARMS = 9
1596.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1597.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):
1598.00 C %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04)
1599.00 C %ADDR(PARM05):%ADDR(PARM06))
1600.00 C WHEN %PARMS = 10
1601.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1602.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):
1603.00 C %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04)
1604.00 C %ADDR(PARM05):%ADDR(PARM06):%ADDR(PARM07)
1605.00 C WHEN %PARMS = 11
1606.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1607.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):
1608.00 C %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04)
1609.00 C %ADDR(PARM05):%ADDR(PARM06):%ADDR(PARM07)
1610.00 C %ADDR(PARM08))
1611.00 C WHEN %PARMS = 12
1612.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1613.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):
1614.00 C %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04)
1615.00 C %ADDR(PARM05):%ADDR(PARM06):%ADDR(PARM07)
1616.00 C %ADDR(PARM08):%ADDR(PARM09))
1617.00 C WHEN %PARMS = 13
1618.00 C CALLP RPGSPAWN_CGI(%ADDR(CGI):%ADDR(CGILIB):
1619.00 C %ADDR(WAIT):%ADDR(PRMC):%ADDR(PARM01):
1620.00 C %ADDR(PARM02):%ADDR(PARM03):%ADDR(PARM04)
1621.00 C %ADDR(PARM05):%ADDR(PARM06):%ADDR(PARM07)
1622.00 C %ADDR(PARM08):%ADDR(PARM09):%ADDR(PARM10)
1623.00 C ENDSL
1624.00 C RETURN
1625.00 P SPAWN_CGI E
1626.00 *---( SPAWN_CGI PROCEDURE ここまで )----------------------*