HP OpenVMS Systems Documentation |
| 前へ | 次へ | 目次 | 索引 |
UNIX 形式のファイル指定を OpenVMS ファイル指定に変換します。
#include <unixlib.h>int decc$to_vms (const char *unix_style_filespec, int (*action_routine)(char *OpenVMS_style_filespec, int type_of_file), int allow_wild, int no_directory);
unix_style_filespec
UNIX のファイル指定形式で名前を格納したヌル区切り文字列のアドレス。action_routine
次の引数を受け付ける decc$to_vmsルーチンのアドレス。
- OpenVMS 形式への変換の結果となるヌル区切り文字列を指すポインタ。
- 次のいずれかの整数値。
値 変換 0 (DECC$K_FOREIGN) OpenVMS または VAXELN オペレーティング・システムを実行していないリモート・システムのファイル。 2 (DECC$K_DIRECTORY) UNIX 形式のファイル名から OpenVMS のディレクトリに変換することを示す。 1 (DECC$K_FILE) 変換の対象がファイルであることを示す。
これらの値は,シンボル DECC$K_FOREIGN, DECC$K_DIRECTORY,DECC$K_FILE によってシンボルとして定義することができます。詳細については,例を参照してください。
action_routine が 0 以外の値 (TRUE) を返した場合は,ファイル変換は続行されます。0 (FALSE) を返した場合は,それ以降のファイル変換は行われません。
allow_wild
0 または 1 を値によって渡します。 0 を指定した場合は,unix_style_filespec で検出されたワイルドカードは展開されません。それ以外の場合は,ワイルドカードは展開され,それぞれの展開結果が action_routine に渡されます。展開されたファイル名のうち,既存の OpenVMS ファイルに対応するファイルだけが渡されます。no_directory
次のいずれかの値の整数。
値 変換 0 ディレクトリは許可される。 1 文字列をディレクトリ名として展開することを禁止する。 2 強制的にディレクトリ名に変換する。
decc$to_vms関数は,指定された UNIX 形式のファイル指定を対応する OpenVMS ファイル指定 (すべて大文字) に変換します。 UNIX 形式のワイルドカードを指定することができ,その場合は対応する OpenVMS ファイルのリストに変換されます。decc$to_vmsの動作に影響する次の機能論理名については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.6 節を参照してください。
DECC$DISABLE_TO_VMS_LOGNAME_TRANSLATION
DECC$NO_ROOTED_SEARCH_LISTS
x 指定された UNIX 形式のファイル指定から変換されたファイル名の数。
/* Translate "UNIX" wildcard file names to OpenVMS names */ /* Define as a foreign command and provide the name as */ /* an argument. */ #include <unixlib.h> #include <stdio.h> int print_name(char *, int); int main(int argc, char *argv[]) { int number_found; /* number of files found */ printf("Translating: %s\n", argv[1]); number_found = decc$to_vms(argv[1], print_name, 1, 0); printf("%d files found\n", number_found); } /* action routine that prints name and type on each line */ int print_name(char *name, int type) { if (type == DECC$K_DIRECTORY) printf("directory: %s\n", name); else if (type == DECC$K_FOREIGN) printf("remote non-VMS: %s\n", name); else printf("file: %s\n", name); /* Translation continues as long as success status is returned */ return (1); }
この例では, HP C で decc$to_vmsルーチンを使用する方法を示しています。引数として UNIX 形式のファイル指定を受け付け, OpenVMS ファイル指定形式で対応する既存の各ファイルの名前を表示します。
OpenVMS ファイル指定を UNIX 形式のファイル指定に変換します。
#include <unixlib.h>char *decc$translate_vms (const char *vms_filespec);
vms_filespec
OpenVMS ファイル指定形式で名前を格納したヌル区切り文字列のアドレス。
decc$translate_vms関数は,ファイルが存在するかどうかにかかわらず,指定された OpenVMS ファイル指定を対応する UNIX 形式のファイル指定に変換します。変換された名前文字列はスレッド固有のメモリに格納され,同じスレッドから decc$translate_vmsを呼び出すたびに,このメモリの内容は上書きされます。decc$from_vms関数は既存のファイルだけを変換しますが,この関数はファイルが存在するかどうかにかかわらず変換します。
x UNIX のファイル指定形式で名前を格納したヌル区切り文字列のアドレス。 0 ファイル名がヌルであるか,または構文が不正であることを示します。 - 1 ファイル指定に反復記号 (たとえば [...]a.dat) が含まれているものの,その他の部分は正しいことを示します。OpenVMS の反復記号構文を正しい UNIX 形式のファイル指定に変換することはできません。
/* Demonstrate translation of a "UNIX" name to OpenVMS */ /* form, define a foreign command, and pass the name as */ /* the argument. */ #include <unixlib.h> #include <stdio.h> int main(int argc, char *argv[]) { char *ptr; /* translation result */ ptr = decc$translate_vms( argv[1] ); if ((int) ptr == 0 || (int) ptr == -1) printf( "could not translate %s\n", argv[1]); else printf( "%s is translated to %s\n", argv[1], ptr ); }
現在のプログラムのロケールで,引数が有効なワイド文字であるかどうかを確認します。
#include <unistd.h>int decc$validate_wchar (wchar_t wc);
wc
確認するワイド文字。
decc$validate_wchar関数は,指定された wchar_t型の引数が現在のプログラムのロケールで有効なワイド文字であるかどうかを確認するための便利な方法として使用できます。decc$validate_wcharを呼び出す 1 つの理由として, isw* ワイド文字分類関数およびマクロが,文字プロパティを記述する classmask配列の逆参照を行う前に,引数の有効性を確認できないという理由があげられます。現在のプログラムのロケールのワイド文字の最大値を超える値を isw* 関数に渡すと,割り当てられている classmask配列を超えるメモリにアクセスする可能性があります。
ワイド文字の有効性を確認するための標準的な方法は, wctomb関数を呼び出す方法ですが,この方法では,十分なサイズのマルチバイト文字配列を宣言し,その配列を wctombに渡す必要があるので,使用するのに不便です。
1 指定されたワイド文字が現在のプログラムのロケールで有効なワイド文字であることを示します。 0 指定されたワイド文字が現在のプログラムのロケールで有効なワイド文字でないことを示します。 errno は設定されません。
ファイルの終端 (EOF) メッセージをメールボックスに書き込みます。
#include <unistd.h>int decc$write_eof_to_mbx (int fd);
fd
メールボックスに関連付けられているファイル記述子。
decc$write_eof_to_mbx関数は, EOF (ファイルの終端) メッセージをメールボックスに書き込みます。パイプでないメールボックスの場合, nbytes 引数の値を 0 に設定して write関数を呼び出すと,EOF メッセージがメールボックスに送信されます。しかし,パイプの場合は,メールボックスに EOF メッセージを書き込むには,パイプをクローズするしかありません。
decc$set_child_standard_streams関数の呼び出しによって子の標準入力がパイプにリダイレクトされる場合は,親プロセスはこのパイプに対して decc$write_eof_to_mbxを呼び出すことで,子に EOF メッセージを送信することができます。子がデータを端末から読み込み,Ctrl/Z が押された場合と同じ結果になります。
decc$write_eof_to_mbxを呼び出した後,たとえば他の子との通信のために,パイプを再利用することができます。これが decc$write_eof_to_mbxの目的です。つまり,EOF メッセージを送信するためだけにパイプをクローズするのではなく,パイプを再利用することを許可します。
0 正常終了を示します。 - 1 異常終了を示します。 errno と vaxc$errno は, SYS$QIOW から返された異常終了状態に従って設定されます。
/* decc$write_eof_to_mbx_example.c */ #include <errno.h> #include <stdio.h> #include <string.h> #include <fcntl.h> #include <unistd.h> #include <unixio.h> #include <descrip.h> #include <ssdef.h> #include <starlet.h> int decc$write_eof_to_mbx( int ); main() { int status, nbytes, failed = 0; int fd, fd2[2]; short int channel; $DESCRIPTOR(mbxname_dsc, "TEST_MBX"); char c; /* first try a mailbox created by SYS$CREMBX */ status = sys$crembx(0, &channel, 0, 0, 0, 0, &mbxname_dsc, 0, 0); if ( status != SS$_NORMAL ) { printf("sys$crembx failed: %s\n",strerror(EVMSERR, status)); failed = 1; } if ( (fd = open(mbxname_dsc.dsc$a_pointer, O_RDWR, 0)) == -1) { perror("? open mailbox"); failed = 1; } if ( decc$write_eof_to_mbx(fd) == -1 ) { perror("? decc$write_eof_to_mbx to mailbox"); failed = 1; } if ( (nbytes = read(fd, &c, 1)) != 0 || errno != 0 ) { perror("? read mailbox"); printf("? nbytes = %d\n", nbytes); failed = 1; } if ( close(fd) == -1 ) { perror("? close mailbox"); failed = 1; } /* Now do the same thing with a pipe */ errno = 0; /* Clear errno for consistency */ if ( pipe(fd2) == -1 ) { perror("? opening pipe"); failed = 1; } if ( decc$write_eof_to_mbx(fd2[1]) == -1 ) { perror("? decc$write_eof_to_mbx to pipe"); failed = 1; } if ( (nbytes = read(fd2[0], &c, 1)) != 0 || errno != 0 ) { perror("? read pipe"); printf("? nbytes = %d\n", nbytes); failed = 1; } /* Close both file descriptors involved with the pipe */ if ( close(fd2[0]) == -1 ) { perror("close(fd2[0])"); failed = 1; } if ( close(fd2[1]) == -1 ) { perror("close(fd2[1])"); failed = 1; } if ( failed ) puts("?Example program failed"); else puts("Example ran to completion"); }
このサンプル・プログラムを実行すると,次の結果が生成されます。
Example ran to completion
指定されたウィンドウで現在のカーソルの位置にある文字を削除します。 delch関数は stdscrウィンドウに対して動作します。
#include <curses.h>int delch();
int wdelch (WINDOW *win);
win
ウィンドウを指すポインタ。
カーソルと同じ行で,カーソルの右側にある文字はすべて左に移動し,行末までブランク文字が追加されます。
OK 正常終了を示します。 ERR エラーを示します。
ファイルを削除します。
#include <unixio.h>int delete (const char *file_spec);
file_spec
OpenVMS または UNIX 形式のファイル指定である文字列を指すポインタ。ファイル指定のバージョン番号にはワイルドカードを指定できますが,他の部分には指定できません。たとえば, filename.txt;* という形式のファイルは削除することができます。
ファイル名にディレクトリを指定し,それがエラーを含む検索リストである場合は, HP C for OpenVMS システムはそのディレクトリをファイル・エラーとして解釈します。シンボリック・リンクを指定して deleteを実行した場合は,そのリンクから参照されているファイルではなく,そのリンク自体が削除されます。
HP C RTL では, remove関数と delete関数は機能的に同じです。
removeも参照してください。
注意
C++ プログラマは deleteルーチンを使用できません。これは,C++ の予約語である deleteと競合するからです。 C++ プログラマは代わりに ANSI/ISO C 標準関数である removeを使用してください。
0 正常終了を示します。 0 以外の値 操作が異常終了したことを示します。
現在のカーソルの位置にある行を削除します。 deletelnは stdscrウィンドウに対して動作します。
#include <curses.h>int deleteln();
int wdeleteln (WINDOW *win);
win
ウィンドウを指すポインタ。
削除した行の下にある行はすべて上に移動し,一番下の行はブランク行になります。カーソルの現在の座標 (y,x) は変更されません。
OK 正常終了を示します。 ERR エラーを示します。
指定されたウィンドウをメモリから削除します。
#include <curses.h>int delwin (WINDOW *win);
win
ウィンドウを指すポインタ。
削除するウィンドウにサブウィンドウが含まれている場合は,サブウィンドウは無効になります。親を削除する前にサブウィンドウを削除してください。 delwin関数は,削除したウィンドウが覆っていたすべてのウィンドウの表示を更新します。
OK 正常終了を示します。 ERR エラーを示します。
time1 引数と time2 引数によって指定される 2 つの時刻の差を秒数として計算します。
#include <time.h>double difftime (time_t time2, time_t time1);
time2
time_t型の時刻値。time1
time_t型の時刻値。
time_t型は,次に示すように <time.h>ヘッダ・ファイルに定義されています。
typedef unsigned long int time_t
n double として表した time2 - time1 の値 (秒数)。
ファイル・パス名の親ディレクトリ名を報告します。
#include <libgen.h>関数バリアント dirname関数には, _dirname32および _dirname64という名前のバリアントがあり,それぞれ 32 ビット・ポインタ・サイズおよび 64 ビット・ポインタ・サイズで使用されます。ポインタ・サイズ固有の関数の使い方の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 1.10 節を参照してください。char *dirname (char *path);
path
ファイル・パス名。
dirname関数は, UNIX パス名を格納した文字列を指すポインタを受け付け,そのファイルの親ディレクトリのパス名を格納した文字列を指すポインタを返します。パスの後続のスラッシュ (/) 文字はパスの一部として解釈されません。path 引数が次のいずれかである場合,この関数は文字列 "." (ドット) を指すポインタを返します。
- スラッシュ (/) が含まれていない。
- NULL ポインタである。
- 空文字列を指す。
dirname関数は, path 引数によって示される文字列を変更することがあります。
dirname関数と basename関数によって完全なパス名が作成されます。 dirname(path) という式は, basename(path) が見つかったディレクトリのパス名を取得します。
basenameも参照してください。
x path 引数の親ディレクトリである文字列を指すポインタ。 "." path 引数が次のいずれかである場合。
- スラッシュ (/) が含まれていない。
- NULL ポインタである。
- 空文字列を指す。
dirname関数を使用すると,次の例はパス名を読み込み,現在のワーキング・ディレクトリを親ディレクトリに変更し,ファイルをオープンします。
char path [MAXPATHLEN], *pathcopy; int fd; fgets(path, MAXPATHLEN, stdin); pathcopy = strdup(path); chdir(dirname(pathcopy)); fd = open(basename(path), O_RDONLY);
| 前へ | 次へ | 目次 | 索引 |