て、きます。 ①は , FILEI を FILE2 に移動します。 FILEI と FILE2 が同じディレクトリにある場 合の動作は RENAME と同じて、す。 FILEI は ディレクトリて、もよく , その場合は FILEI の ドの全ファイルを FILE2 の下に移動します。 ②は , FILEI... FILEn を DIRECTORY の 下に同じ名前て移動します。 n = 1 の場合は ①と②が同じ形になりますが , この場合に は , 「 FILEI ( もしくは DIRECTORY) が実在 して」かつ「しかもそれがディレクトリて、あ る」場合にのみ② , それ以外は①として扱い ます。 [-vfi] というのは , -v, -f, -i という 3 つのオプションがあることを示します。ふ たつ以上のオプションを指定する場合には -vf のように続けて書くことも可能てす。 と , 確認なして消して移動します 認を求めてきます。ー i を指定しない 消してしまってもよいかどうか , 確 が存在する場合に , そのファイルを : lnteractive の略て , 移動先ファイル 認を求めてきます このオプションを指定しないと , 確 ている場合てもかまわず移動します。 ァイルが書き込み不可の属性をもっ すると , 移動元あるいは移動先のフ -f : Force の略て, このオプションを指定 ます こに移動しているのかを逐一表示し -v : Verbose の略て , 今どのファイルをど -vf%0test 1 %0test2%0test3%O, . /etc [EOF] イノレに 使ってください。たとえば junk というファ 行文字てはなく ) 0 ク , つまりヌル文字を file の中ては , 引数と引数の区切りには ( 改 file の中身を引数とみなして取り込みます。 ださい。 MV の引数の中に @file と書くと , @file という形がててきたものだと思ってく 在するのてはなく , ① , ②の引数の一部に さて , ③は , 本当は① , ②と独立して存 という内容がいてあるときに , mv @junk として MV を起動すると , これは , mv ーⅶ test 1 test2 test3 .. /etc と起動したのと同じて、す。 この機能は , 本来はある特別なコマンド インタブリタと組み合わせて使うときのた めに作られました。知っている人もいるか もしれませんが , MS ー DOS て、は子プロセス に渡すコマンドライン引数の長さは 128 バイ ト以下に制限されています。そのため , 長 い長い引数を渡すときには , どこか別の場 所を通じて引数を受け渡す必要があります。 この機能はそのためのものて、すが , あまり 使うことはないてしよう。 まのせます。 wild. c の冒頭部に書いてある文章をそのま 能を利用することがて、きます。以下に のて , wild. c の提供するワイルドカード機 ードを展開するルーチンを組み込んて、いる MV は wild. c という UNIX 風のワイルドカ : 任意の 1 文字にマッチする : 任意の文字列にマッチする マッチするようにもてきる ・・・の中にある任意の 1 文字にマッチ 〃を使い , Ca-b] というよ アルファベットすべてに /usr yasushi うにして , する。 Fig. 1 ] 〃に似ているが , にない文字にマッチする。ただし , 漢字にはマッチしない ・・・の中 sa itO X20 ( ' ' ) よりも大きくなければならな の文字にマッチする。コードは 0 には 16 進数が入る。 ASC Ⅱコードが れる。 にマッチする。 ' * や ? のように使わ 展開されます。このようにパスの途中にも /usr/yasushi/filel と /usr/saito/filel に /usr/*/* 1 はないことに注意してください に展開されます。 /usr/yasushi/file * . * て /usr/yasushi/filel と /usr/yasushi/file2 /usr/yasushi/file * のようなディレクトリ構成を考えます。 ようから , 具体例て説明します。まず , Fig. 1 文章だけて、はなかなか理解しにくいてし 無条件に展開される 当尸は , ワイルドカードより先に f003 barl bar2 bar3" と展開される {foo,bar} { 1 , 2 , 3 } はヾ f001 f002 に展開される foo { 1 , 2 , 3 } は汀 001 f002 f003 〃 { } 展開 filel file2 file 1 file3 TOOL & TOOLS 103
(Fig. 2)。 か , その大まかなところを見ていくこ 使えます。また , * の後ろに文字を書いて します。繰り返しますが , MV て、もっとも基 , こて , RENAME のように も正しく展開されます。 本となるのは , mv /usr/saito/file 1 file 1 . bak /usr/ * /fiIe[2, 3 ] などと書いてしまうと , カレントディレク あるファイルを別の所に移す /usr/yasushi/file2, /usr/saito/file3 に展 という仕事て、す。ここて、いう「ファイル」に トリの下に filel が filel. bak という名前て、移 開されます。 はディレクトリも含みます ( ディレクトリも /usr/saito/file{4, 5 } ってきてしまうのて、注意してください mv /usr/yasushi/file 1 一種のファイルてあることを強調するため /usr/sait0/file4, /usr/sait0/file5 に展開 .. /saitO に以下て「ディレクトリファイル」という言 とするのは②の使い方て , このようにする されます。 { ・・・・・・ } の展開は , 実際に該当す と , /usr/saito/filel が消えて , /usr/yasu 葉を使うことがあります ) 。これを作れば MV るファイルが存在するかどうかは調べずに shi/filel が /usr/saito/filel に移ります。移 の動作のうちの①が実現て、きるのは自明て、 行われるのてこのようになります。 MS-DOS 動後は Fig. 3 のようになります。一見 ,/usr/ すが , この動作を繰り返し適用することて、 の奇怪なワイルドカードよりはよほどわか yasushi/filel が消えただけのように見えます ②も容易に実現てきます。 りやすいのて、はないて、しようか。 が , そうて、はありません。 さて , この仕事はどのように作ればよい 次に , MV の具体的な使い方を説明しま のて、しようか ? このあたりから MS-DOS の す。たとえば Fig. 1 のディレクトリて、 , 低レベルファイル操作の知識が必要になっ mv /usr/yasushi/file 1 MV の内部動作 .. /saito/file 1 . bak てきます。 MV の行う仕事に直接関係あるのは , ファ などとするのが①の使い方て、 , この結果 filel ンクションコールの 86 ( 0X56 ) 番「ディレクト は , /usr/saito/filel. bak に移動します。移動 いよいよ MV を作ります。実際のプログラ リエントリの移動」てす。このファンクショ ムに入る前に , MV をどのように作ればよい 後のディレクトリを図て、見てみましよう ンコールは MS-C て、は rename( ) という標準 Fig. 2 ライプラリ関数て、提供されているようてす。 このサービスは , あるディレクトリにある ファイルを別のディレクトリに移すという ものてすが , 一見するとこれだけて、 MV がて、 きてしまうような気がします。実際 , 世の 中にはこのサービスだけを使って作られた MV ( もどき ) もあるようて、すが , 実は , この サービスにはいろいろと制限があります。 それは , ①ディレクトリの移動はできない ②異なったデバイスに移すことはできな といったところてしようか。そのために 上記ふたつの場合には , 次のようなことを 行う必要があります。 ①ディレクトリを移動するときには , ー 1 移動先に空のディレクトリを作る ー 2 上て、作ったディレクトリに のディレクトリの下にあったファ イルを全部移す ー 3 もとのディレクトリを消す /usr yasushi saitO file2 filel filel . bak file3 Fig. 3 /usr yasushi saitO file2 filel file3 104 CMAGAZINE 19 7
まったものて、あり , それらクラス間にとく に関係はありません。その大部分は , クラ ス String や lnteger のようなデータ構造を抽 象的に扱うためのデータ型て、すが , なかに は , ファイル入出力のクラス F ⅱ e , Stream や 画面操作のための cu 「 ses ライプラリをクラ スにまとめたクラス CursesWindow なども あります。以ドにその主要なものをあげま す。 ・ File クラス File は , ファイルに対する基本人出 力のために用意されています。このクラス は , C の標準人出力ライプラリの日 LE 構造体 とほば同様の機能をもち , それに対する操作 と同じような操作が用意されています ( 注 5 ) Fig. 1 SmaII t 引 k ー 80 のシステムクラスの階層構造 C 十十プログラミング入門 85 このクラス FiIe からの派生によ さらに り , 特殊なファイルに対するクラスを作成 することもて、きます。その例として , クラ ス SF ⅱ e と曰 otF ⅱ e が用意されています。クラ ス SFile は , 固定長レコードのファイルを扱 うためのものて、あり , 演算子口によるラ ンダムアクセスなどが可能になっています。 クラス PlotFile には , arc, dot などのメンノヾ 関数があり , UNIX の plot 形式 ( 注 6 ) のファイ ルを生成します。 ・ Stream クラス St 「 eam は , 参考文献 [ 1 ] TThe C 十十 Programming Language 』の第 8 章に解説 されている入出力機能を実装したものて、あ り , 使いやすい , 型に厳格な入出力を実現 Magnitude Link Stream FileDirectory File Boolean Character Number Time Date LookupKey P28 PositionalStream Random True False ProcessorScheduier ShavedQueue Delay Behavior Poi nt Rectang BitBlt DisplayObject Collection Pen CharacterScanner DisplayMedium lnfi niteForm OpaqueForm Path Seque nceabl eCoIIection MappedColIection Set Float Fraction Assotiation ReadStream WriteStream Cla Metaclass Form Curve Arc 凵 ne 凵 nearFit Spli ne ArrayedCoIIection lnterval LinkedList Orde 「 edCollection Dictionary Curso 「 DisplayScreen Circle WordArray Array String Text ByteArray Semaphore SortedCollection ldentityDictio nary します。このクラス St 「 eam ( 注 7 ) は , 本連載 第 2 回て、紹介しましたから , ここて、は詳しい 解説は省きます。なお , libg 十十のクラス Stream は ,AT&T のものと実装方法が異な り , クラス FiIe から派生することて、作成さ れ , そのほとんどの操作クラス File のものを 利用しています。ただ , その機能はわずか な箇所を除いて , AT & T との互換性が保た れています。このクラスの名前は , そのた めに Cio]stream というように小文字て、始ま っています。これ以外の libg 十十のクラス名 は , 最初が大文字て、始まるように統一され ていることに注意してください ・ CursesWindow クラス CursesWindow は ,UNIX の curses ライプラリをクラスにまとめたものて、す。 その curses ライプラリは , UNIX の画面操作 のためのライプラリて、す。これを使えば , 画面書き直し時のカーソルの動き回る量が 最小になるように最適化されます。これに より , システムと端末との通信回線の負荷 は軽減され , プログラムは優れた対話性を もつようになります ( 注 8 ) 。 また , 画面管理のための端末情報は , te 「 m ー cap あるいは terminfo ( 注 9 ) から得るために 星の数ほどある端末ごとに , 変更を施す必 要はありません。 分数や複素数などのデータ構造を抽象化 したクラスには , 以下のようなものがあり ・ lnteger クラ %lnteger は , 整数を扱うデータ型て、 す。 C ( 十十 ) の基本データ型てある cha 「 , int , sho 「 t などは扱う数値に限界がありまし 注 5 その実装の非公開部には日 LE へのポインタ , ファイ ル名 , アクセスモードなどがあり , このクラスは F に E 構 造体へのインタフェイスにすぎない 注 6 UNIX のマニュアル plot ( IG ) , plot(3X), plot ( 5 ) 注 7 現ノヾージョンはふたつのクラス ist 「 eam , ostream からなっていますが , 将クラス iostream にまとめら れるだろう。 注 8 画面工デイタⅵも curses ライプラリを使って実装さ れている。 注 9 BSD 系 UNIX は termcap を , SystemV 系 UNIX は terminfo を使う。
「 M Ⅵの作成 多機能 RENAME 斎藤靖 M DOS 上で UN Ⅸライクな環境を実現するためのツールとして作 成した MV を紹介します。 MV は MS-DOS の内部コマンド RENAME と外部コマンド XCOPY を組み合わせたようなツールです。ー作成 にあたり , ー低水準ファイル入出力関数を使っているので , 残念 なからソースレベルでの互換性はありません。 はすべてソクを使うことにします。 MV て、 ジョンの ) mv にはディレクトリを異なった はソ〃てもヾ \ 〃てもどちらても使えます ) デバイスに移すことはてきないという制限 ヨ MV とは というファイルを / etc / file2 に移す , という がありますが , これなどは別にこうしない ような操作を一度に行うことを意味してい とユーザにとって何か都合の悪いことがあ MS-DOS のファイル処理プログラムの典 ます。 るというのて、はなく , ( 子細は省略しますが ) ②はディレクトリごとの移動てす。たと 型として , MV を取り上げます。 MV といっ UN Ⅸのファイル管理機構と mv の実装の手 てもわからない人もいるかもしれないのて , えば , /usr/local/src/ というディレクトリを 抜き具合とのかねあいてこうなっただけて そっくり /usr/local/lib/src/ に移すような仕 まず「 MV とは何か」を説明します。 はないかという気がします。 MV とは , ひとことていえば「多機能 RE 事が一度に行えます。 多分 , 今回作った MS ー DOS 版 MV は ③はようするに NAME 」てす。 MS ー DOS の標準コマンドて UNIX の mv の機能を包含しているのてはな mv * . C /usr/saito ある RENAME は , ファイルを同じディレク いかと思っていますが , 私もすべての UNIX トリの中て名前を変えるだけ ( ディレクトリ といった使い方もてきるということを表 を使えるわけてはないのて , あまりはっき 名は変えられない ) のコマンドて , ファイル りしたことはいえません。そんなわけて , しています。もちろん , MV のようなプログ を違うディレクトリに移すことはて、きませ ラムは , ワイルドカードがないと , とても UNIX の mv がどうなっているといったこと 使いものにならないのてすが , ポイントは ん。 についてはこれ以上ふれないことにします。 「 UN Ⅸ風」というところてすね。 MS-DOS ところが MV は , RENAME の機能に加え のや * . * 〃式のワイルドカードとは多少違 て , を MV の使い方 ①ファイルを ( 場合によっては異なったデ います。詳しいことは後て述べます。 MV はもともと UNIX のコマンドて、す。私 バイスの ) 異なったディレクトリに移動 が MV を作ったのも , 少しても UNIX に近い プログラムの内部動作を説明するには , する 環境て MS ー DOS を使いたいという願望から ②ディレクトリも通常ファイルと同じよ まずプログラムの使い方を知らなければい て、す。 UNIX の mv とこの MV の動作は大体 けません。ここて、は , MV の使い方を説明し うに移動できる 同じてすが , 細かい動作は多少異なってい ③ UN Ⅸ風のワイルドカードを使うことが ます。 ます。とはいっても , そもそも違う OS, 違 ① mv [-vfi] FILE 1 FILE2 できる うファイル管理機構の下て動くプログラム といった機能をもっています。以下て , 具 ② mv [-vfi] FILE 1 FlLE2 . なのて , 細部まて、動作を完全に合わせるこ 体的に説明します。 DIRECTORY まず , ①については , たとえば /usr/local/ とにはあまり意味があるとは思えません。 ③ mv ... @file test/filel ( この文章てはパスの区切り文字に たとえば , UNIX の ( 少なくともあるバー MV の動作は大きくふたつに分けることが . FlLEn 102 CMAGAZINE 19 7
特集最新入門 TbI .2 に , GNU Emacs の標準状態て、 の基本的なコマンドのキー配置を示しまし た。℃ -a" は , ーキーを押えながら 囿キーを打鍵することを意味します。同じ ように , 、 M-a" は , キーを押えなが ら囿キーを打鍵することを意味します。 キーは , メタキャラクタを送るためのキー て , *M-a" によって入力される文字は , a 〃の 8 ビット目が立っているコードて す。ちなみに , キーはないカ皿キー のあるキーポードの場合 , X ウインドウシス テムなどによってキーをキーの代 用にすることもあります。ただし , Nemacs の場合 , EUC コードや Shift-JIS コードの文 字はメタキャラクタと同じように , 8 ビット 目が立った文字を使うため , EUC や Shift-JIS が入力漢字コードに指定されているときは , キーを使うことがて、きません。 キーのないキーポードを使っている ときや , EUC コードや Shift-JIS を指定して いるときには , キーに続いて回キーを 打鍵することにより , を入力するこ とがて、きます。キーを使える場合て、 も , キーを使ってかまいません。実 は , Emacs の内部ては , メタキャラクタが 送られてきたときは , ESC ともとの文字の 2 文字に分解しているのて、す。なお , 設定に より , メタキャラクタを分解したときの文 Fig. 2 復数のウインドウを開いた GNU Emacs の画面 lnfo file: libg + + , produced by texinfo-format-buffer from file: libg + 十 . texinfo Copyright (C) 1988 Free S0ftware Foundation, lnc. This fi le documents the features and implementation 0f The GNU C + + 1 ibrary -%%-NEmacs: libg + + -T 叩 ---CFID=JJJ]-- (Text)- * lnc lude fi les that SUPPIY function prototypes for Other C functions (system cal ls and 1 ibraries) are al 1 lower case. * AII include files define a preprocessor variable X h, where X is the name Of the file, and conditionally compile only if this has not been already defined. The #pragma once' faci lity iS alSO used tO avoid re—inclusion. * Structures and objects that must be publ icly defined' but are not intended for publ ic use have names beginning with an underscore. (for example, the -Srep' struct, wh ich -%%-NEmacs: libg + + ー1 (Text)- --33%---CFID=JJJ]-- 特集最新 GNU 入門 55
出力オプションの設定メニュー画面 Fig. 4 ・ Turbo Assembler 20 ■ Turbo Assembler は , MASM 4.0 , 5.0 , 5.1 との高い互換性を保ったうえて , MASM の約 2 倍という高速なアセンプルを実現した アセンプラてす。 Turbo Assembler 2.0 て は , この高速性にマルチパスによる最適化 機能をサポートし , よりパワフルなアセン プラになっています。 マルチノヾスアセンプル Turbo AssembIer 1.0 はレヾスアセンプラ てしたが , Ver. 2.0 て、はマルチパスをサポー トするようになりました。 Turbo Assembler 1.0 や MASM て、は , 前 方参照のある JMP 命令は , SHORT ジャンプ ( 128 バイト以内のジャンプ。生成されるコ ードは 2 バイトてすむ ) て十分な場合ても , 明示的に指定しないかぎりヾイトのコード が生成され , 3 バイト目には本来必要のない NOP 命令が埋め込まれてしまいました。 Turbo AssembIer 2.0 ては , ソースコード を何回も参照することて , こうした不要な NOP を削除することがてきます。 高級言語インタフェイスのサポート 現在ては , アセンプラは , 単独て、使われ ることよりも , 高級言語て書かれたプログ ラムの一部をより効率よくするために使わ れるほうが多いて、しよう 0Turbo Assembler 2.0 は , より柔軟な形て , 高級言語とのイン タフェイスをサポートしています。 MASM 5.0 以前は , C のサプルーチンを 記述するために ListI のように書かなければ なりませんて、したが , Turb0 Assembler< サポートされている高級言語インタフェイ スを用いれば , List2 のようにすっきりと記 述することがてきます。また , このように す場合の引数を指定することもてきます。 命令が拡張されています。たとえば , 記述することて , メモリモデルが変更され メモリモデルの指定も , MS-WINDOWS や PUSH, POP 命令は , 複数のレジスタを同時 た場合て、も , わずかな修正て、すむようにな NOLANGUAGE などが加わり , 幅広い対応 に指定することがてきます。 ります。 が可能となりました。 PUSH AX BX また , Turbo Assembler 2.0 ては , サプ 各種命令の拡張 ルーチンごとに C 形式か , PascaI 形式かを指 それらの関数を呼び出 定することがてき , Turbo Assembler 2.0 ては , いくつかの 132 CMAGAZINE 19 7 ule: 訳 I 正 4 FiIe: pri 「旧 4.0 start Length CI ock コ Sepa ratet # I 正 4 # 17 5b : = > ma i n ( ) 655b : 6f 4 Separate: I 正 4 # 18 5b : ' る 223 rate: ttPR I 4 24 e ロ e ↓ i nt n ; for if (prime(i pr i i ht Widt Cawel 物 lp ( ) Pr inter ( ) Graphi(E ( ・ ) File ( ・ ) ASCI I 」 tion Prof i 1 Tota 1 t i : 1 . 1 D i % Of total : 的 : 1 of 1 2. 12 ー正 4 # 15 sæ 1 # ー正 4 # 18 11 RI 正 4 sæ 11 % Fig. 5 レポート出力の例 Turbo Profiler Version 1.0 Thu May 17 13 : 56 : 48 1990 Program: A:YTPROFYPRIMEO. EXE File prime0. c Time Counts / * Copyright (c) 1990 , Borland lnternational * / / * Program for generating prime numbers using Euc lid 's method * / int primes[1000]: #define MAXPRIMES 1000 main() int lastprime, curprime; primes[O] primes[l] lastprime curprlme printf("prime Xd = XdYn". 0. primes[0]) : printf("prime Xd = XdYn" 1 , primes[l]): while(curprime く MAXPR IMES) for(j - lastprime; j 十十 ) if((curprime % primes[j]) curprime 十 = 2 : b reak : lastprime) continue; lastprime 十十 : printf("prine Xd = Xd%n" lastprime, curprime) : primes[lastprine] curprlme; curprime 十 = 2 : 0.0000 1 0.0000 1 0.0000 1 0. 0000 1 0. 0000 1 0.0176 1 0. 0165 1 0. 0087 500 0.0091 499 0.3093 15122 0.0056 333 0.0055 333 0.0084 499 0.0055 333 0.0027 166 2.8678 166 0.0030 166 0.0026 166 0.0000 1 POP BX AX また , CPU が 8086 の場合ても , 即値 PUSH
Fig. 4 ティレクトリがループを作る usr さて , 以上を見ると , MS-DOS のファイ ビーしてからもとのファイルを消す ②異なったデバイスに移すときには , コ ・ファイルの移動 ル操作の中て、も , ・ファイルの作成 , 内容のコヒ。ー ( ② ) ・ディレクトリの作成 ( ①ー 1 ) , 削除 ( ① -3 ) ・ファイルの削除 ( ② ) ③ S がディレクトリてあった場合 は , なにもしない ② S と D が同じファイルてあった場合に がないのてエラーにする ①まず , S が存在しなければ移動しよう 処理の流れを言葉て説明します。 す。 て示されるファイルを D と書くことにしま ( ちなみに dest というのは destination の略) 以下 , source< 示されるファイルを S , dest を dest に移すのが move file( ) の使命て、す。 ァイルのパス名 ( dest ) てす。そして 'source のパス名 (source), もうひとつは移動先フ ふたっ取ります。ひとつは移動元ファイル くことにしましよう。 move file( ) は引数を 引き受ける関数 move file( ) の中身を見てい ては , こまて、述べてきた仕事を一手に けたかと思います。 の典型てある」といったわけがご理解いただ 「 MV は MS-DOS のファイル処理プログラム れることがわかります。この記事の最初て と , おもなものはすべてこの MV の中て、使わ ー 1 ー 2 まず mkdir(D) S の下の全ファイルについて再帰的 に D の下に移す。つまり , S の下のフ ←ここでループを作る ァイルの名前を xxx とすると , m ove file ( S "**xxx" , D "*xxx") とい う操作を各ファイルについて行う ー 3 rmdir(S) ④ファイルが異なるドライプにある場 ー 1 D を空のファイルとして作る ー 2 S の内容をすべて D に移す ー 3 S を消す ⑤①から④どれにもあてはまらないと きは rename( ) を呼ぶ 以上のようになります。 実は , この処理過程にはちょっとあぶな いところも含まれています。 まず , 明らかにわかるのは③て、すね。再 di 「のようなもの ( sd ⅳ . c ) char buf[BUFSIZ]; struct find_t f : main(int argc, char **argv) dir DIRECTORY 3 : / * 超手ぬき dir 2 : #include く dos. h 〉 1 : #include く stdio. h> 9 : 8 : 6 : 4 : 帰というのはループと同じて、 , いつかは止 まるという保証が必要て、す。さて , ③が絶 対に止まるという保証はあるのて、しようか ? 逆に③が永遠に止まらないという状況を考 えてみると , それは「ディレクトリが無限に 深く伸びている」という状況て、す。こんなこ とがありえるわけはないと思うかもしれま せんが , 実はありえないて、もなかったりし ます。ディレクトリの木がいつのまにかル ープを作ってしまう場合にそういうことが 起こります ( Fig. 4 ) 。 もっとも , 結論からいってしまうと , MS -DOS て、はこういうことは起こりません。て、 すから③はどのような場合て、も正しく動き ます。 こて、ちょっと余談。 UNIX て、は inode と いうものを使って , ファイルの名前とその 中身を結びつけています。 UN Ⅸて、はディレ クトリは通常のファイルと同じように open( ) して「 ead ( ) て、きます。 read ( ) したときに読 み出されるのは , そのディレクトリに含ま れるファイルの名前と , そのファイルの inode 番号の組て、す。 inode 番号が同じファイルは 中身が同じて、す。ということは , 違うディ レクトリにある違う名前のファイルて、あっ ても , inode 番号さえ同じならそれは同じフ ァイルて、あるということて、 , 工デイタなど を使って一方を書き換えると , もう一方も 書き換わります。このように , ひとつの inode sprintf(buf,"%sYY*. *",argv[l]); if (_dos-findfirst(buf,0x16,&f)) exit(l) : fputs (). name, stdout) ;putchar(' } whi le (!-dos-findnext(&f) ) : TOOL & TOOLS 105
して使われます。 ミニバッファウインドウとエコー領域を マルチウインドウ 容が再表示されます。 メッセージが消去され , きには , 最初の打鍵か , 数秒経過すると , れているときにメッセージが表示されたと 共有しているため , ミニノヾッフアの内 、ニバッフアが起動さ lnfo file: libg 十十 , Fig. 1 GNU Emacs の画面 GNU Emacs は , 画面を縦または横に分 割することによって , 複数のウインドウを 開くことがてきるようになっています。そ れぞれのウインドウには , モード行がつい マルチバッファ ています ( Fig. 2 ) 。 ただし , Emacs のポイントは , 文字と文字 イタていう , カーソル位置にあたります。 をもっています。ポイントは , ほかのエデ Emacs て、は , バッファごとに「ポイント」 の間にあり , 普通 , カーソルが置かれた文 字の前にあります。 行います。 ドが , このリージョンを対象として操作を のことをリーションといい , 多くのコマン ポイントとマークとの間に挟まれた部分 す。 , バッフアの中て、の位置を示す情報て もっています。これも , ポイントと同じよ また , それぞれのバッフアは「マーク」を produced by texinfo-format-buffer from file: libg 十 +. texinfo distributed under the terms Of a perm ission notice identical tO this one. in the original, and provided that the entire resulting derived work is section entitled "GNU CC General Public License" is included exactly as manua 1 under the conditions for verbatim copying, provided also that the Permiss ion is granted tO copy and distribute modified versions Of this A11 copyright conditions applying t0 GNU CC also apply to GNU C + 十 libraries. are preserved on al 1 copies. this manual provided the copyright notice and this permission not ice Permi ss ion is granted tO make and distribute verbatim copies Of Copyright (C) 1988 Free Software Foundation, lnc. Th is fi le documents the features and implementation of The GNU C + + 1 ibrary -%%-NEmacs: 1 ibg + + 54 CMAGAZINE 19 7 (Text)- --Top---[FID=JJJ)-
特新最新入門 ンタラクテイプを指定する文字列 , 関数の ドキュメント文字列などからなる (C の ) 構造 体へのポインタてす。 なお , Sub 「て、ない関数は , バイトコンパ イルされたものも含めて , リスト構造にな っています。 ウインドウ GNU Emacs のウインドウを表すデータ 型てす。 ウインドウ型のデータを表す入力構文は ありません。出力においては , # く window 1 on poi> のように表します。これは , バッファ poi を 内容とするウインドウて、す。 プロセス GNU Emacs によって起動された , UNIX のプロセスを表すデータ型てす。 プロセス型のデータを表す入力構文はあ りません。出力においては , # く process poi> のように表します。これは , 名前が poi てあ るプロセスて、す。 VOid シンポルの値セルなどて、使われ , 現在値 が定義されていないことを表す型てす。 れを変数の値や関数として参照すると , 工 ラーとなります。ューザが直接使わない , 内部的な型てす。 Emacs Lisp は , 前述したとおり , Common Lisp に似せたものになっています。したが って , 関数も Common Lisp に似たものが多 いようてす。ただし , これも , 前述したよ うに , GNU Emacs の記述言語としての機 能にわりきって効率を追求しているため , Common Lisp に比べて , 非常に簡単なもの 関数 になっています。 関する関数 言や定義に defun 関数名ラムダリスト [ ン村 分は省略可能という意味てす。 なお , ここてヾにとツ〃て囲われた部 [ 文献 10 ] や , オンラインヘルプを見てくだ 代表的なものをとりあげます。くわしくは , , こては , そのような特殊な関数のうち , されています。 特殊なため , それ用の関数がいろいろ完備 また , GNU Emacs のデータ型や目的が インタラクテイプ指定 ] 一式・・・ a に 1 , b に 2 , c に nil, d に nil が渡ります。 となっているとき , 実引数がヾ ( 12 ) 〃なら , (a &optional b c &rest d) ダリストが , 指定することがてきます。たとえば , ラム 以下の随意変数や , & 「 est 以下の余剰変数を こには , 通常の変数のほかに , &optional ラムダリストは , 仮引数のリストてす。 という式を入れます。 interacitive 指定式 ... ) (lambda ラムダリストドキュメント れます。関数名のシンポルの関数スロット を行います。引数は , 評価されないて、渡さ defun は , 普通の Lisp と同様 , 関数の定義 ( 1 2 3 4 5 6 ) 数 interactive によって行います。 Emacs のコマンドとするための宣言て , 関 インタラクテイプ指定は , この関数を GNU 重要な関数にはつけておくと便利てす。 字列て , オンラインヘルプが参照します。 ドキュメントは , その関数を説明する文 ります。 なら , a に 1 , b に 2 , c に 3 , d に ( 4 5 6 ) が渡 interactive 内容 その関数がコマンドとして呼ばれたとき の , 引数の渡し方を指定します ointeractive が関数として呼ばれたときは , 引数を評価 せず , nil を返します。 引数は , 通常 , 文字列の形て指定されま す。文字列中の文字が , それぞれ TbI. 3 に示 したような受け渡し形態を表します。 バッフアから値を読み取る形態の場合 , そ の後の文字列がプロンプトになります。 たとえば , (interactive"finput file name : *nr") と指定されている関数をコマンドとして呼 んだ場合 , ミニノヾッフアに input file name . とプロンプトを出してファイル名を入力さ せた後 ( 補完機構が働きます ) , 第 1 引数にそ のファイル名 , 第 2 引数に現在のリージョン の開始点 , 第 3 引数に現在のリージョンの終 了点を渡して関数を呼び出します。 引数は , 文字列てなくてもかまいません。 この場合 , 引数を評価したリストが , 実引 数のリストとなります。たとえば , (interactive(list'poi qwe)) と指定されている関数をコマンドとして呼 んだ場合 , 第 1 引数に poi , 第 2 引数に qwe を 渡して関数を呼び出します。おもに , 既存 のインタラクテイプ指定文字て表せないパ ターンのときに使います。 その関数に引数がないときは , たんに は , (defun lst (x) ()a 「 x)) します。たとえば , シンポルの関数スロットに , 関数を設定 fset シンボル関数 と指定してください (interactive) 特集最新 GNIJ 入門 59 と同じことてす。 (fset 'lst '(lambda (x) ()a 「 x)))
ファイルの編集ができる ・キーポードマクロの定義が可能である ■取り消し機能 ( 編集コマンドの実行前の状 態をさかのばっていく ) ■各種編集モード (TEX( 注 ) や roff など ) やア ウトラインモード ( アウトラインプロセッ サのパッケージ ) ■ GNU Emacs Lisp ( 以下 Emacs Lisp と 称す ) の関数 , 変数と各コマンドのオンラ インヘルプの表示機能 ■ハイバーテキストに似たオンラインドキ ュメントプラウザ info システムと呼ばれており , このオン ラインドキュメントのソースファイル は TEX て、記述されているのて、 , プリン タ出力としても兼用している。 •Emacs Lisp のデバック′ッケージ や対のカッコを自動的に表示する。 別なモードて、 , 各言語に応じた字下げ C 言語や Lisp 言語の入力を支援する特 ■言語編集モード の設定 , スタックトレースがてきる。 シングルステップやプレークポイント 44 CMAGAZINE 1990 7 Emacs にそれが入るだろう。 GNU Emacs 張したという報告があるのて , 将来 , GNU しかし , ューザからこの問題を解決して拡 オリジナルて、は浮動小数点数は扱えない ドコンパイラも備わっている。今のところ ンの機能を有しており , さらにバイトコー Lisp インタブリタはガーベージコレクショ 更や新規追加が容易てある。この Emacs Lisp て、記述されているのて , コマンドの変 基本的なコマンド以外のコマンドは Emacs ステムと DEC の VMS 上て、動く。 さまざまな計算機上て , そして各種 UNIX シ メインフレーム ( AmdahI 社製 ) にいたる大小 ロプロセッサ ( Inte180386 を初めとする ) から ているため , 非常に移植性が高い。マイク 述されており , C 言語て、プログラミングされ 基本的な編集コマンドは , 約 70 万行て、記 は , 英語圏以外に日本やイスラエルて、拡張 されている。 4 月末日現在の GNU Emacs の バージョンは 18.55 て、ある。リチャードのゴ 告によれば , 次期バージョンは 19 としてリ リースされる予定て、ある。現在作業中の Ver. 19 の特徴は次のとおりて、あり , リリ ■ x ウインドウシステム ースを行っている。 ジョンは 2.11.1 て、ある。 MS-DOS 用のソー 仕様をも取り込んて、いる。 5 月時点のバー UNIX AWK のイミテーションて、 , POSIX は参考文献 [ 9 ] を参照 ) の特徴を備えた 夕、、 AWK" の最新版。 AWK 自体について New AWK ( 文字処理言語のインタブリ GAWK POCH などもローカルに作成されている。 EPOCH に NEmacs の修正をマージした NE リリース情報は参考文献 [ 6 ] を参照 ) や ポートて、きる Emacs(EPOCH という名前て、 ーディスプレイのサポートも含む ) を複数サ [ 8 ] を参照 ) や X ウインドウスクリーン ( カラ 日本語化された Emacs(NEmacs, 参考文献 リビューションが含まれている。さらに まなパッケージには , ューザからのコント 現在配布されている Emacs Lisp のさまざ 表示機能の追加 ■オプジェクト指向のグラフィックの描 る た形でインクリメンタルに語句解折を 1 ■各種プログラミング言語の特徴に依存し 数の追加 Æmacs Lisp のデータタイプに浮動小数 機能 7Emacs Lisp のソースレベルでのデ / ヾック ■ヨーロッパの文字サポート に独立して行える。 マウスコマンドの定義をバッファごと 複数の X ウインドウ , スクロールバー スコードも含まれている。 GAWK 特有の特 徴を次に示す。 •AWKPATH AWK て、はコマンド引数て、実行する AWK 言語のファイルを、、一 f file-name のような形式て、指定て、きる。ここて、 file -name て、与えられる AWK 言語のファイ ルは , このコマンドを実行したディレ クトリになければならない。 GAWK て、 ば AWKPATH という環境変数にサーチ パスを与えれば , その中から探して口 ードする拡張機能がある。 ■ファイルの別名機能 入出力ファイル名として ,/dev/stdin,/ dev/stdout, /dev/stderr ( それぞれ標準 入力 , 標準出力 , 標準ェラー出力を表 す ) や /dev/fd/N ( ファイル記述子 N に対 応するファイル ) が使える。 ・正規化表現 POSIX て、設定された正規化表現が使え ■大文字 , 小文字のマッチング IGNORECASE という変数に 1 をセット すると大文字 , 小文字の区別を行わず にパターンマッチングを行うような機 能がある。 MS ー DOS バージョンの保守を行っている 人も現れている。さらに日本て、は , 日本語 化を行ったユーザもいる ( 参考文献 [ 10 ] を 参照 ) 。 シェル (BASHV— UNIX のコマンドインタブリタ、、 sh 〃の GNU 版て、 , 、、 BASH" (Bourne AgainSHell) と呼 ぶ。 5 月時点のバージョンは 1.05 て、あり , とくに関数が定義て、きることて、 , 見通 ・ Ko 「 n シェルの機能 次のような特徴がある。