#!/usr/local/bin/perl # # list edit: 双方向リスト編集処理 # prnt: 親ノード (parent node) # chid: 子ノード (child node) # next: 次ノード (next node) # prev: 前ノード (previous node) # data format: データファイルの形式 # date: 日時 (MM/DD hh:mm) # prnt: 親データ行番号 # user: ユーザ名 # data: データ内容 # { my ($file, $buf); my ($line, $num); # initialize $pre = ''; $pre1a = '├'; $pre1b = '└'; $pre2a = '│'; $pre2b = ' '; # data file read $file = "data.txt"; if (!open(FILE_IN, "<$file")) { printf("File %s open error.\n",$file); exit(1); } $prnt[0] = 0; $chid[0] = 0; for ($line = 1; $buf = ; $line++) { chomp($buf); ($date[$line], $prnt[$line], $user[$line], $data[$line]) = split(',', $buf); } $num = $line; close(FILE_IN); # 最新日付順表示 for ($line = $num - 1; $line > 0; $line--) { printf("%-30s %-11s %-10s\n", $data[$line], $date[$line], $user[$line]); } # create tree index for ($line = 0; $line < $num; $line++) { &lst_cre($line, $prnt[$line]); } # # tree disp # for ($line = 0; $line < $num; $line++) { # printf("%5d,%5d,%5d,%5d,%5d,%5s,%10s,%20s\n", $line, # $prnt[$line], $chid[$line], $next[$line], $prev[$line], # $date[$line], $user[$line], $data[$line]); # } # 階層表示 &lst_dsp($chid[0], $pre); } sub lst_cre { # create list pointer my ($idx, $pos) = @_; my ($insnext, $insprev); if ($chid[$pos] == 0) { # 子がない場合 $chid[$pos] = $idx; $next[$idx] = $idx; $prev[$idx] = $idx; } else { # 子がある場合 $insnext = $chid[$pos]; $insprev = $prev[$insnext]; $next[$idx] = $insnext; $prev[$idx] = $insprev; $next[$insprev] = $idx; $prev[$insnext] = $idx; } $chid[$idx] = 0; } sub lst_dsp { # list display my ($idx, $pre) = @_; my ($i); #printf("lst_dsp(%d)\n", $idx); $i = $idx; do { if ($next[$i] == $chid[$prnt[$i]]) { # 最後のノード $pre1 = $pre.$pre1b; $pre2 = $pre.$pre2b; } else { # 最後以外のノード $pre1 = $pre.$pre1a; $pre2 = $pre.$pre2a; } printf("%-40s %-11s %-10s\n", $pre1.$data[$i], $date[$i], $user[$i]); if ($chid[$i] != 0) { if ($next[$i] == $chid[$prnt[$i]]) { # 最後のノード } else { # 最後以外のノード } &lst_dsp($chid[$i], $pre2); } $i = $next[$i]; } until ($i == $idx); } 1;