stat構造体

stat構造体(struct stat)は、ファイル情報を格納するために使う。
(stat関数と同じstatでややこしいが・・・。)

Man page of STAT

今回は、指定されたファイルの所有者のユーザーIDを取得する。

sst.st_uidに、そのファイルの所有者のユーザーIDが整数で入っている。

$ vi struct_stat.c
$ vi test.txt
$ cat test.txt
ABCDE
$ ls -al
合計 16
drwxrwxr-x. 2 bg1 bg1 4096  8月  8 16:04 .
drwxrwxr-x. 3 bg1 bg1 4096  8月  8 15:57 ..
-rw-rw-r--. 1 bg1 bg1  676  8月  8 16:03 struct_stat.c
-rw-rw-r--. 1 bg1 bg1    6  8月  8 16:04 test.txt
$ id -u bg1
1000
$ gcc struct_stat.c -o struct_stat
$ ./struct_stat
sst.st_uid = 1000
$

test.txtを生成し、そのユーザー名はbg1とわかっている。
idコマンドでbg1のユーザーIDは1000。
プログラムを実行すると、test.txtのsst.st_uidは1000ということで、確かに一致する。

Sample/unixsyscall/struct_stat/struct_stat/src/struct_stat at master · bg1bgst333/Sample · GitHub

tm構造体

tm構造体(struct tm)は時刻情報を格納するために使う。

Man page of CTIME
C言語関数辞典 - tm構造体

今回は、tmのメンバであるtm_wdayが、日曜~土曜を0から6の値で表していることを利用し、"Sun"から"Sat"までの文字列配列の添字にtm_wdayを渡すことで、曜日を文字列で出力するようにした。

wday_strにtmのtm_wdayを渡している。

$ vi struct_tm.c
$ gcc struct_tm.c -o struct_tm
$ ./struct_tm
2019/8/7(Wed) 15:42:54
$

こうなる。

Sample/unixsyscall/struct_tm/struct_tm/src/struct_tm at master · bg1bgst333/Sample · GitHub

VizCommand32/VizCommand32(0, 0, 5, 0/Shin-Kiba #69) -viewコマンドにおけるファイル名のスペース対応.

スペースの含まれているファイルやパスに対応していなかったので対応した。

cpp_string_utility.hと、

cpp_string_utility.cppを追加。
replaceを使いたいだけだけど。

Command.cppの、

Setでダブルクォートで囲まれたトークンは、一時的に" "(スペース)を"<space>"にエスケープした。
これだけだと、違うところで正しく解釈されない。

Console.cppの、

CConsole::OnViewも修正。

スペースのあるファイルと無いファイルがあるとする。
スペースのあるファイルと無いファイルがあるとする。

スペースのあるファイルと無いファイルがあるとする。

スペースがないと開ける。
スペースがないと開ける。

スペースがないと開ける。

スペースがあると開けない。
スペースがあると開けない。

スペースがあると開けない。
これまでは、ダブルクォートに対応してないので、ダブルクォート付けても別のパスとして認識はおろか、そもそも""はパス文字列になりえない。

今回の対応で開けるようになった。
今回の対応で開けるようになった。

今回の対応で開けるようになった。

-viewコマンドにおけるファイル名のスペース対応. · bg1bgst333/VizCommand32@1ef927e · GitHub

EventArgs

イベントハンドラの第2引数として渡されるのがEventArgs。
イベントに関する情報がはいっている。

EventArgs Class (System) | Microsoft Docs

基本的には、自分で継承して独自の情報を格納できるようにしておいて、ハンドラに渡すという形になる。

空のプロジェクト作成
空のプロジェクト作成

空のプロジェクトを作成し、

EventConsoleEventArgs.cs
EventConsoleEventArgs.cs

EventConsoleEventArgs.csを追加。

EventArgsを継承し、このイベントの結果をResultプロパティ、入力文字列をLineプロパティで持つようにした。

EventConsole.cs
EventConsole.cs

EventConsole.csを追加。

コンストラクタで対象文字列を指定できるようにする。
EventLoopで入力文字列を読み取り、args.Lineにも入力文字列をセットしておく。
対象文字列と入力文字列が一致する場合は、 args.ResultをtrueにしてReadLineText実行、終わったらループを抜ける。
一致しない場合は、args.ResultをfalseにしてReadLineTextを実行、この場合はループを抜けない。

MainClass.cs
MainClass.cs

MainClass.csを追加。

コンストラクタに"END"を渡している。
EventConsole_ReadLineTextがイベントハンドラ
senderはthisなのでEventConsoleオブジェクト自身の型の名前、eはEventConsoleEventArgsオブジェクトargsなので各プロパティを出力。

ABCDE
sender = EventConsole
e.Line = ABCDE
e.Result = False
VWXYZ
sender = EventConsole
e.Line = VWXYZ
e.Result = False
END
sender = EventConsole
e.Line = END
e.Result = True
続行するには何かキーを押してください . . .

一致しない間はe.ResultがFalseで、繰り返す。
一致するとe.ResultがTrueになり、終了する。

Sample/dotnet/EventArgs/EventArgs/src/EventArgs_ at master · bg1bgst333/Sample · GitHub

localtime

localtimeでローカル時刻情報を取得できる。

localtime関数 - 現在の日付・時刻を取得する - Perl入門ゼミ

引数無しの場合、秒、分、時、日、月、年、曜日、をリスト形式で戻り値として返す。
年は1900年からなので、1900を足し、月は1月を0として始まるので、1を足す。
さらに曜日は日曜を0として始まるので、文字列リストを作っておき、添字に$wdayを指定したら、曜日文字列が取得できるようにしておく。

$ vi localtime.pl
$ perl localtime.pl
2019/8/5 7:55:56 (Mon)
$

このように取得できる。

Sample/perl/localtime/localtime/src/localtime at master · bg1bgst333/Sample · GitHub

リストの添字

リストも添字を指定することで要素を取り出せる。

リストの括弧のあとに、添字の大括弧を書いて、取り出す要素番号を指定することで取り出せる。
0番目から数えて1番目なので、$strには'DEF'が入る。

$ vi list.pl
$ perl list.pl
$str = DEF
$

確かにこうなる。

Sample/perl/list/index/src/list at master · bg1bgst333/Sample · GitHub