複数のパラメータを持つプログラムやプロシージャーで省略可能にするにはどのようにすれば
よいのであろうか?
あるいは、あるプログラムやプロシージャーのパラメータを増やしたいのだが単純にパラメータの
数を増やしただけでは、それを呼び出して利用している既存のプログラムがパラメータの実行時の
不足エラーとなってしまう。
このような問題を解決する手法を紹介する。
それは %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 ここまで )----------------------*