日本-日本語 |
|
|
|
OpenVMS マニュアル |
|
OpenVMS
|
目次 | 索引 |
B.8 FORTUSER.COM コマンド・プロシージャ |
FORTRAN プログラムの作成,コンパイル,実行を行う会話型ユーザの,ターミナル環境を制御するシステム定義のログイン・コマンド・プロシージャのサンプルを示します。 FORTUSER.COM が,ログイン・コマンド・プロシージャとしてリストされる専用アカウントにログインした場合は,FORTUSER.COM が受け入れるコマンドしか実行できません。このプロシージャは,レキシカル関数を使用してオプション・テーブルを参照し,ユーザが入力したコマンドと有効なコマンドのリストとを比較する方法も示しています。
$ ! Procedure to create, compile, link, execute, and debug $ ! FORTRAN programs. Users can enter only the commands listed $ ! in the symbol OPTION_TABLE. $ SET NOCONTROL=Y (1) $ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") $ SAVE_VERIFY_PROCEDURE = F$VERIFY(0) $ OPTION_TABLE = "EDIT/COMPILE/LINK/RUN/EXECUTE/DEBUG/PRINT/HELP/FILE/DONE/" (2) $ TYPE SYS$INPUT (3) VMS FORTRAN Command Interpreter Enter name of file with which you would like to work. $ ! $ ! Set up for initial prompt $ ! $ PROMPT = "INIT" (4) $ GOTO HELP ! Print the initial help message $ ! $ ! after the first prompting message, use the prompt: Command $ ! $ INIT: $ PROMPT = "GET_COMMAND" $ GOTO FILE ! Get initial file name $ ! $ ! Main command parsing routine. The routine compares the current $ ! command against the options in the option table. When it finds $ ! a match, it branches to the appropriate label. $ ! $ GET_COMMAND: $ ON CONTROL_Y THEN GOTO GET_COMMAND ! Ctrl/Y resets prompt (5) $ SET CONTROL=Y $ ON WARNING THEN GOTO GET_COMMAND ! If any, reset prompt $ INQUIRE COMMAND "Command" $ IF COMMAND .EQS. "" THEN GOTO GET_COMMAND $ IF F$LOCATE(COMMAND + "/", OPTION_TABLE) .EQ. F$LENGTH(OPTION_TABLE) - (6) THEN GOTO INVALID_COMMAND $ GOTO 'COMMAND' $ ! $ INVALID_COMMAND: (7) $ WRITE SYS$OUTPUT " Invalid command" $ ! $ HELP: (8) $ TYPE SYS$INPUT The commands you can enter are: FILE Name of FORTRAN program in your current default directory. Subsequent commands process this file. EDIT Edit the program. COMPILE Compile the program with FORTRAN. LINK Link the program to produce an executable image. RUN Run the program's executable image. EXECUTE Same function as COMPILE, LINK, and RUN. DEBUG Run the program under control of the debugger. PRINT Queue the most recent listing file for printing. DONE Return to interactive command level. HELP Print this help message. Enter Ctrl/Y to restart this session $ GOTO 'PROMPT' (9) $ EDIT: (10) $ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND: $ EDIT 'FILE_NAME'.FOR $ GOTO GET_COMMAND $ COMPILE: $ FORTRAN 'FILE_NAME'/LIST/OBJECT/DEBUG $ GOTO GET_COMMAND $ LINK: $ LINK 'FILE_NAME'/DEBUG $ PURGE 'FILE_NAME'.*/KEEP=2 $ GOTO GET_COMMAND $ RUN: $ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND: $ RUN/NODEBUG 'FILE_NAME' $ GOTO GET_COMMAND $ DEBUG: $ DEFINE/USER_MODE SYS$INPUT SYS$COMMAND: $ RUN 'FILE_NAME' $ GOTO GET_COMMAND $ EXECUTE: $ FORTRAN 'FILE_NAME'/LIST/OBJECT $ LINK/DEBUG 'FILE_NAME' $ PURGE 'FILE_NAME'.*/KEEP=2 $ RUN/NODEBUG 'FILE_NAME' $ GOTO GET_COMMAND $ PRINT: $ PRINT 'FILE_NAME' $ GOTO GET_COMMAND $ BADFILE: (11) $ WRITE SYS$OUTPUT "File must be in current default directory." $ FILE: $ INQUIRE FILE_NAME "File name" $ IF FILE_NAME .EQS. "" THEN GOTO FILE $ IF F$PARSE(FILE_NAME,,,"DIRECTORY") .NES. F$DIRECTORY() - (12) THEN GOTO BADFILE $ FILE_NAME = F$PARSE(FILE_NAME,,,"NAME") $ GOTO GET_COMMAND $ DONE: $ EXIT |
FORTUSER.COM コマンド・プロシージャの実行結果例
この例は,このコマンド・プロシージャを専用コマンド・プロシージャとして使用する方法を示しています。
Username: CLASS30 Password: OpenVMS Version 7.1 OpenVMS FORTRAN Command Interpreter Enter name of file with which you would like to work. The commands you can enter are: FILE Name of FORTRAN program in your current default directory. Subsequent commands process this file. EDIT Edit the program. COMPILE Compile the program with VAX FORTRAN. LINK Link the program to produce an executable image. RUN Run the program's executable image. EXECUTE Same function as COMPILE, LINK and RUN. DEBUG Run the program under control of the debugger. PRINT Queue the most recent listing file for printing. DONE Return to interactive command level. HELP Print this help message. Enter Ctrl/Y to restart this session File name: AVERAGE Command: COMPILE Command: LINK Command: RUN Command: FILE File name: READFILE Command: EDIT |
このサンプル実行は,CLASS30 というユーザが FORTUSER コマンド・プロシージャによって制御されるアカウントにログインするときのセッションを示しています。FORTUSER コマンド・プロシージャは,ユーザが実行できるコマンドと,セッションを再開するための命令を表示します。次に,ユーザが AVERAGE ファイルを指定して,それをコンパイル,リンク,実行します。この後,ユーザは FILE コマンドを入力して,別のファイルで作業を開始します。
B.9 LISTER.COM コマンド・プロシージャ
入力データを求めるプロンプトを出し,データを桁揃えしてからソートし,出力ファイルに書き込みます。このプロシージャは,READ と WRITE コマンドとともに,割り当て文の部分文字列オーバレイ形式を示しています。
$ ! Procedure to accumulate programmer names and document file names. $ ! After all programmer names and file names are entered, they are $ ! sorted in alphabetic order by programmer name and printed on $ ! the system printer. $ ! $ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") (1) $ SAVE_VERIFY_PROCEDURE = F$VERIFY(0) $ ! $ OPEN/WRITE OUTFILE DATA.TMP ! Create output file (2) $ ! $ ! Loop to obtain programmers' last names and file names, $ ! and write this data to DATA.TMP. $ ! $ LOOP: (3) $ INQUIRE NAME "Programmer (press Return to quit)" $ IF NAME .EQS. "" THEN GOTO FINISHED $ INQUIRE FILE "Document file name" $ RECORD[0,20]:='NAME' (4) $ RECORD[21,20]:='FILE' $ WRITE OUTFILE RECORD $ GOTO LOOP $ FINISHED: $ CLOSE OUTFILE $ ! $ DEFINE/USER_MODE SYS$OUTPUT: NL: ! Suppress sort output $ SORT/KEY=(POSITION:1,SIZE=20) DATA.TMP DOC.SRT (5) $ ! $ OPEN/WRITE OUTFILE DOCUMENT.DAT (6) $ WRITE OUTFILE "Programmer Files as of ",F$TIME() $ WRITE OUTFILE "" $ RECORD[0,20]:="Programmer Name" $ RECORD[21,20]:="File Name" $ WRITE OUTFILE RECORD $ WRITE OUTFILE "" $ ! $ CLOSE OUTFILE (7) $ APPEND DOC.SRT DOCUMENT.DAT $ PRINT DOCUMENT.DAT $ ! $ INQUIRE CLEAN_UP "Delete temporary files [Y,N]" (8) $ IF CLEAN_UP THEN DELETE DATA.TMP;*,DOC.SRT;* $ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE) $ EXIT |
$ @LISTER Programmer: WATERS Document file name: CRYSTAL.CAV Programmer: JENKINS Document file name: MARIGOLD.DAT Programmer: MASON Document file name: SYSTEM.SRC Programmer: ANDERSON Document file name: JUNK.J Programmer: [Return] Delete temporary files [Y,N]:y |
このプロシージャを実行して得られる出力ファイルは次のようになります。
Programmer Files as of 31-DEC-1999 16:18:58.79 Programmer Name File Name ANDERSON JUNK.J JENKINS MARIGOLD.DAT MASON SYSTEM.SRC WATERS CRYSTAL.CAV |
算術計算を行い,その結果を16 進値と 10 進値に変換します。
$ ! Procedure to calculate expressions. If you enter an $ ! assignment statement, then CALC.COM evaluates the expression $ ! and assigns the result to the symbol you specify. In the next $ ! iteration, you can use either your symbol or the symbol Q to $ ! represent the current result. $ ! $ ! If you enter an expression, then CALC.COM evaluates the $ ! expression and assigns the result to the symbol Q. In $ ! the next iteration, you can use the symbol Q to represent $ ! the current result. $ ! $ SAVE_VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") $ SAVE_VERIFY_PROCEDURE = F$VERIFY(0) $ START: $ ON WARNING THEN GOTO START (1) $ INQUIRE STRING "Calc" (2) $ IF STRING .EQS. "" THEN GOTO CLEAN_UP $ IF F$LOCATE("=",STRING) .EQ. F$LENGTH(STRING) THEN GOTO EXPRESSION $ ! $ ! Execute if string is in the form symbol = expression $ STATEMENT: (3) $ 'STRING' ! Execute assignment statements $ SYMBOL = F$EXTRACT(0,F$LOCATE("=",STRING)-1,STRING) ! get symbol name $ Q = 'SYMBOL' ! Set up q for future iterations $ LINE = F$FAO("Decimal = !SL Hex = !-!XL Octal = !-!OL",Q) $ WRITE SYS$OUTPUT LINE $ GOTO START $ ! $ ! $ ! Execute if string is an expression $ EXPRESSION: (4) $ Q = F$INTEGER('STRING') ! Can use Q in next iteration $ LINE = F$FAO("Decimal = !SL Hex = !-!XL Octal = !-!OL",Q) $ WRITE SYS$OUTPUT LINE $ GOTO START $ ! $ CLEAN_UP: $ SAVE_VERIFY_PROCEDURE = F$VERIFY(SAVE_VERIFY_PROCEDURE,SAVE_VERIFY_IMAGE) $ EXIT |
名前 = 式 |
式 |
ユーザが Return を押すと,プロシージャは,CALC セッションが終わったとみなして,終了する。
ユーザが "名前 = 式" 形式で入力した場合は,プロシージャは STATEMENT ラベルで実行を継続し,そうでない場合は,EXPRESSION ラベルに分岐する。
$ @CALC Calc: 2 * 30 Decimal = 60 Hex = 0000003C Octal = 00000000074 Calc: Q + 3 Decimal = 63 Hex = 0000003F Octal = 00000000077 Calc: TOTAL = Q + 4 Decimal = 67 Hex = 00000043 Octal = 00000000103 Calc: 5 + 7 Decimal = 12 Hex = 0000000C Octal = 00000000014 Calc:[Return] $ |
プロシージャからのプロンプトの 1 つ 1 つに,ユーザは算術式を入力します。プロシージャはその結果を 10 進数,16 進数, 8 進数で表示します。データのない行で Return を押しただけの空の行で CALC セッションは終わりです。
B.11 BATCH.COM コマンド・プロシージャ
コマンド文字列,コマンド・プロシージャ,コマンドのリストのうちのいずれかを受け取って,バッチ・ジョブとして実行します。
$ VERIFY_IMAGE = F$ENVIRONMENT("VERIFY_IMAGE") $ VERIFY_PROCEDURE = F$VERIFY(0) $! $! Turn off verification and save current settings. $! (This comment must appear after you turn verification $! off; otherwise it will appear in the batch job log file.) $! $! $! If this is being executed as a batch job, $! (from the SUBMIT section below) go to the EXECUTE_BATCH_JOB section $! Otherwise, get the information you need to prepare to execute the $! batch job. $! $ IF F$MODE() .EQS. "BATCH" THEN GOTO EXECUTE_BATCH_JOB (1) $! $! $! Prepare to submit a command (or a command procedure) as a batch job. $! First, determine a mnemonic process name for the batch job. Use the $! following rules: $! $! 1) If the user is executing a single command, then use the verb name. $! Strip off any qualifiers that were included with the command. $! 2) If the user is executing a command procedure, then use the file name. $! 3) Otherwise, use BATCH. $! $ JOB_NAME = P1 (2) $ IF JOB_NAME .EQS. "" THEN JOB_NAME = "BATCH" $ IF F$EXTRACT(0,1,JOB_NAME) .EQS. "@" THEN JOB_NAME = F$EXTRACT(1,999,JOB_NAME) $ JOB_NAME = F$EXTRACT(0,F$LOCATE("/",JOB_NAME),JOB_NAME) $ JOB_NAME = F$PARSE(JOB_NAME,,,"NAME","SYNTAX_ONLY") $ IF JOB_NAME .EQS. "" THEN JOB_NAME = "BATCH" $! $! $! Get the current default device and directory. $! $ ORIGDIR = F$ENVIRONMENT("DEFAULT") $! $! $! Concatenate the parameters to form the command string to be executed. $! If the user did not enter a command string, the symbol COMMAND will have $! a null value. $! $ COMMAND = P1 + " " + P2 + " " + P3 + " " + P4 + " " + - (3) P5 + " " + P6 + " " + P7 + " " + P8 $! $! $! If the user is executing a single command and if both the command and the $! original directory specification are small enough to be passed as $! parameters to the SUBMIT command, then submit the batch job now $! $ IF (P1 .NES. "") .AND. (F$LENGTH(COMMAND) .LE. 255) .AND. - (4) (F$LENGTH(ORIGDIR) .LE. 255) THEN GOTO SUBMIT $! $! $! If the single command to be executed in the batch job is very large, or $! if you have to prompt for commands to execute in the batch job, then $! create a temporary command procedure to hold those commands and get the $! fully expanded name of the command procedure. $! $ CREATE_TEMP_FILE: $ ON CONTROL_Y THEN GOTO CONTROL_Y_HANDLER (5) $ OPEN/WRITE/ERROR=FILE_OPEN_ERROR TEMPFILE SYS$SCRATCH:'JOB_NAME'.TMP (6) $ FILESPEC = F$SEARCH("SYS$SCRATCH:" + JOB_NAME + ".TMP") $! $! By default, have the batch job continue if it encounters any errors. $! $ WRITE TEMPFILE "$ SET NOON" $! $! Either write the single large command to the file, or prompt for $! multiple commands and write them to the file. $! $ IF COMMAND .NES. " " THEN GOTO WRITE_LARGE_COMMAND $ $ LOOP: $ READ /END_OF_FILE=CLOSE_FILE /PROMPT="Command: " SYS$COMMAND COMMAND $ IF COMMAND .EQS. "" THEN GOTO CLOSE_FILE $ WRITE TEMPFILE "$ ",COMMAND $ GOTO LOOP $ $ WRITE_LARGE_COMMAND: $ WRITE TEMPFILE "$ ",COMMAND $ $! $! Finish the temporary file by defining a symbol so that you will know $! the name of the command procedure to delete and then close the file. $! Define the symbol COMMAND to mean "execute the command procedure $! you have just created". Then submit the batch job and execute $! this command procedure in the batch job. $! $ CLOSE_FILE: (7) $ WRITE TEMPFILE "$ BATCH$DELETE_FILESPEC == """,FILESPEC,"""" $ CLOSE TEMPFILE $ ON CONTROL_Y THEN EXIT $ COMMAND = "@" + FILESPEC $! $! $! Submit BATCH.COM as a batch job, and pass it two parameters. $! P1 is the command (or name of the command procedure) to execute. $! P2 is the directory from which to execute the command. $! $ SUBMIT: (8) $ SUBMIT/NOTIFY/NOPRINT 'F$ENVIRONMENT("PROCEDURE")' /NAME='JOB_NAME' - /PARAMETERS=("''COMMAND'","''ORIGDIR'") $ GOTO EXIT $! $! $! The user pressed Ctrl/Y while the temporary command procedure was open. $! Close the command procedure, delete it if it exists, and exit. $! $ CONTROL_Y_HANDLER: (9) $ CLOSE TEMPFILE $ IF F$TYPE(FILESPEC) .NES. "" THEN DELETE/NOLOG 'FILESPEC' $ WRITE SYS$OUTPUT "Ctrl/Y caused the command procedure to abort." $ GOTO EXIT $! $! $! The temporary command procedure could not be created. $! Notify the user and exit. $! $ FILE_OPEN_ERROR: (10) $ WRITE SYS$OUTPUT "Could not create sys$scratch:",job_name,".tmp" $ WRITE SYS$OUTPUT "Please correct the situation and try again." $! $! $! Restore the verification states and exit. $! $ EXIT: (11) $ VERIFY_PROCEDURE = F$VERIFY(VERIFY_PROCEDURE,VERIFY_IMAGE) $ EXIT $! $! $! BATCH.COM was invoked as a batch job. P1 contains the command $! to execute and P2 the default directory specification. $! Return a status code that indicates the termination status of P1. $! $ EXECUTE_BATCH_JOB: (12) $ SET NOON $ VERIFY_PROCEDURE = F$VERIFY(VERIFY_PROCEDURE,VERIFY_IMAGE) $ SET DEFAULT 'P2' $ 'P1' $ IF F$TYPE(BATCH$DELETE_FILESPEC) .EQS. "" THEN EXIT $STATUS $ STATUS = $STATUS $ DELETE /NOLOG 'BATCH$DELETE_FILESPEC' $ EXIT STATUS |
目次 | 索引 |
|