#!/usr/bin/perl
# ******** Common Routines ********
# 挿入・書換・検索・削除
# -------- ファイル関数設定 --------
sub fl_fileformat{
($file1) = @_;
splice @f2_LINES;
splice @f2_rcrdlist;
$f1_linenmbr=&io_fileread("2",$file1,"err");
$f1_file = $file1;
$f1_line0 = $f2_LINES[0];
$f1_line1 = $f2_LINES[1];
#print "DEBUG 00fl30 sub fl_fileformat 10 - $file1
$f2_LINES[0]
\n";
@f1_title = split("_SP_",$f2_LINES[0]);
@f1_format = split("_SP_",$f2_LINES[1]);
$f1_colnmbr = @f1_title;
$errmsg = "";
my @path = split("\/",$file1);
my $f1_filename = pop @path;
#print "DEBUG 00fl30 sub fl_fileformat 20 - $f1_filename - $f1_title[0]
\n";
if(substr($f1_filename,2,1) eq "-"){
#print "DEBUG 00fl30 sub fl_fileformat 21 - $f1_filename - $f1_title[0]
\n";
$f1_type = "var";
$f1_keylen = length($f1_format[0]);
$f1_order = substr($f1_title[0],3,3); # ?????? 位置不可解 inc/dec/fst/lst
$f1_order2 = substr($f1_title[0],6,3); # ?????? 位置不可解 trs(transfer)/thd(thread)
#print "DEBUG 00fL30 sub fl_fileformat 22 - $f1_filename - $f1_type - $f1_keylen - $f1_order - $f1_order2
\n";
}
else{
$errmsg = $errmsg."
".$file1.":ファイル名の3字目のコードが「 - 」(可変長データ)ではありません。\n";
#print "DEBUG 00fx10 sub file_format 30 - $file1
\n";
}
$f1_title[0] = "キーコード";
#print "DEBUG 00fl30 sub fl_fileformat 30 - $f1_order
\n";
if($f1_order eq "inc" || $f1_order eq "lst"){
$f1_ordermark = "/";
}
elsif($f1_order eq "dec" || $f1_order eq "fst"){
$f1_ordermark = "|";
}
else{
$errmsg = $errmsg. "".$f1_order.":キーの指定「inc、dec、fst、lst」が間違っています。\n";
}
#print "DEBUG 00fx10 sub file_format 40 - $f1_order - $f1_keylen - $f1_type - $f1_nmbrlen
\n";
# if($f1_colnmbr != @f1_format){
# $errmsg = $errmsg."項目数第1行が第0行:".$f1_colnmbr."と異なります。\n"; UTF-8 では不可
# }
#print "DEBUG 00fx10 sub file_format 60 - $f1_order - $err_nmbr - $errmsg
\n";
if($f1_title[$f1_colnmbr-1] ne "END\n" || $f1_format[$f1_colnmbr-1] ne "END\n"){
$errmsg = $errmsg.$f1_colnmbr." - ".$f1_format[$f1_colnmbr-1]."第0・1・行の最終項目(「END」マーク)が不整です。\n";
}
#print "DEBUG 00fx10 sub file_format 70 - $f1_order - $err_nmbr - $errmsg
\n";
if($errmsg ne ""){
$errmsg = $file1.":ファイル・フォーマット・チェック(最初2行)
\n\n".$errmsg."
\n";
$errref1 = "プログラムエラー:".$prjcode0." - ".$work." - ".$prgname." - cg_00fl30x - file_format";
&io_errexit($errmsg,$errref1,$manager);
}
#print "DEBUG 00fx10 sub file_format 90 - $file1 - $f1_type
\n";
}
# *********** 主要ルーティン ********
sub fl_filecheck{
($file1) = @_;
&fl_fileformat($file1);
if($f1_type eq "var"){
$f2_SIZE=&io_fileread("",$file1,"err");
}
else{
$f2_SIZE=&io_fileread("",$f1_fixfile,"err");
}
$dspmsg = "ファイル・チェック(全行)(cg_00fl30x - sub file_check)\n";
$dspmsg = $dspmsg."
".$file1.":項目数 - ".$f1_colnmbr."、総行数(頭書2行を含む) - ".$f2_SIZE."\n";
$errmsg = "";
for(my $i=2;$i<$f2_SIZE;$i++){
#print "DEBUG sub file_check - $file1 - $i - $f2_SIZE - $f2_LINES[$i]
\n";
$errmsg1 = &fl_rcrdcheck($i,$f2_LINES[$i]);
if($errmsg1 ne ""){
$errmsg = $errmsg.$errmsg1;
if(length($errmsg)>5000){
$errmsg = $dspmsg."".$errmsg."
";
&io_dspexit($errmsg);
}
}
}
if($errmsg ne ""){
$errmsg = $dspmsg."".$errmsg."
";
&io_dspexit($errmsg);
}
return($dspmsg);
}
sub fl_rcrdcheck{
my($line,$record) = @_;
$line = $line - 1;
my @fld = split("_SP_",$record);
my $nmbr = @fld;
$errmsg1 = "";
#print "DEBUG sub rcrd_check - $line - $nmbr - $record
\n";
if($nmbr != $f1_colnmbr || substr($fld[$f1_colnmbr-1],0,3) ne "END"){
$errmsg1 = $errmsg1."".$line." 行目、項目数(".$f1_colnmbr."):".$nmbr."、END 欄:".$fld[$f1_colnmbr-1]."\n";
$err_nmbr++;
}
if($f1_type eq "var" && length($fld[0]) != $f1_keylen){
$errmsg1 = $errmsg1."".$line." 行目、キー長(".$f1_keylen."):".$fld[0]."\n";
$err_nmbr++;
}
return $errmsg1;
}
sub fl_rcrdinsert{
($file1) = @_;
&fl_fileformat($file1);
#print "DEBUG 00fx10 sub rcrd_insert 20 - $file1 - $f1_type
\n";
$errmsg = &fl0_floatinsert;
#print "DEBUG 00fx10 sub fl_rcrdinsert 20 - $errmsg
\n";
return($errmsg);
}
sub fl_rcrdrewrite{
($file1) = @_;
&fl_fileformat($file1);
#print "DEBUG 00fx10 sub fl_rcrdrewrite 20 - $errmsg
\n";
$errmsg = &fl0_floatrewrite;
return($errmsg)
}
sub fl_rcrdsearch{
($file1) = @_;
&fl_fileformat($file1);
$f2_SIZE=&io_fileread("",$file1,"err");
substr($f2_LINES[1],0,1) = $f1_ordermark;
$f2_rcrdnmbr = 0;
#print "DEBUG 00fx10 sub rcrd_search 81 - $file1 - $f1_order - $f1_keylist[0]
\n";
&fl0_floatsearch;
#print "DEBUG 00fx10 sub rcrd_search 82 - $file1 - $f1_order - $f1_keylist[0] - $f2_rcrdnmbr
@f2_rcrdlist
\n";
close(f0_FILE);
}
sub fl_rcrddelete{
($file1) = @_;
&fl_fileformat($file1);
$f2_SIZE=&io_fileread("",$file1,"err");
substr($f2_LINES[1],0,1) = $f1_ordermark;
$f2_rcrdnmbr = 0;
#print "DEBUG 00fx10 sub rcrd_delete 90 - $file1 - $f1_type - $f1_order - $f2_rcrdnmbr
@f2_rcrdlist
\n";
if($f1_type eq "var"){
&fl0_floatdelete;
}
}
# ************** 副ルーティン(ファイル・チェック)**************
# ************** 副ルーティン(挿入・書替)**************
# -------- データ挿入--------
sub fl0_floatinsert{
$f2_SIZE = &io_fileread("",$file1,"err");
substr($f2_LINES[1],0,1) = $f1_ordermark;
if($f1_order eq "inc" || $f1_order eq "dec"){
$f1_key = $f1_data[0];
my $keylen = length($f1_key);
#print "DEBUG 00fl30 sub fl0_floatinsert 01 $f1_keylen - $f1_data[0] - $keylen
\n";
if($keylen != $f1_keylen){
$errmsg = "キー:".$f1_key."(".$keylen.")、規定(".$f1_keylen.")外の長さは認められません。\n";
return($errmsg);
}
$f2_matchnmbr = 0;
&fl0_finding;
if($f2_matchnmbr>0){
$errmsg = "(cg_00fl20x - sub float_insert)".$f1_key.":同じキーのデータが既に存在します。\n";
return($errmsg);
}
}
elsif($f1_order eq "fst" || $f1_order eq "lst"){
my $line;
if($f1_order eq "fst"){
$line = $f2_LINES[2];
$f1_insline = 2;
}
elsif($f1_order eq "lst"){
$line = $f2_LINES[$f2_SIZE - 1];
$f1_insline = $f2_SIZE;
}
(my $key, my $other) = split("_SP_",$line);
$f1_data[0] = &st_nmbrform($f1_keylen,'0',$key+1);
$f1_key = $f1_data[0];
#print "DEBUG 00fx10 sub float_insert - 02 - $file1 - $f1_order - $f1_type - $f2_SIZE - $line
$f2_LINES[7]
\n";
}
&fl_rcrdform;
#print "DEBUG 00fx10 sub float_insert - 03 - $file1 - $f1_order - $f1_insline
$f1_record
\n";
splice(@f1_LINES,0);
for(my $i=0;$i<$f1_insline;$i++){
$f1_LINES[$i] = $f2_LINES[$i];
}
$f1_LINES[$f1_insline] = $f1_record;
for(my $i=$f1_insline;$i<$f2_SIZE;$i++){
$f1_LINES[$i+1] = $f2_LINES[$i];
}
&io_filewrite("",$file1,"err");
return($errmsg);
}
# -------- データ書換 --------
sub fl0_floatrewrite{
$f1_key = $f1_data[0];
my $keylen = length($f1_key);
print "DEBUG 00fl30 sub fl0_floatrewrite 01 - $f1_keylen - $f1_data[0] - $keylen
\n";
if($keylen != $f1_keylen){
$errmsg = "キー:".$f1_key."(".$keylen.")、規定(".$f1_keylen.")外の長さは認められません。\n";
return($errmsg);
}
&fl_rcrdform;
$f2_SIZE=&io_fileread("",$file1,"err");
#print "DEBUG 00xa - 65 - $file1 - $f2_SIZE
\n";
substr($f2_LINES[1],0,1) = $f1_ordermark;
$f2_matchnmbr = 0;
&fl0_finding;
if($f2_matchnmbr == 0){
$errmsg = "(cg_00fl20x - sub float_rewrite)".$f1_key.":該当コードのレコードは存在しません。\n";
return $errmsg;
# &err_exit($errmsg);
}
elsif($f2_matchnmbr > 1){
$errmsg = "(cg_00fl20x - sub float_rewrite)".$f1_key.":該当コードのレコードが複数あります。\n";
return $errmsg;
# &err_exit($errmsg);
}
#print "DEBUG 00xa - 65 - $file1 - $f1_type - $f2_matchline - $f2_SIZE
$f2_record
@f2_LINES
\n";
if($f1_type eq "var"){
$size = $f2_SIZE;
@f1_LINES = @f2_LINES;
$f1_LINES[$f2_matchline] = $f1_record;
#print "DEBUG 00xa - 65 - $file1 - $f2_matchline - $size
$f1_record
@f1_LINES
\n";
&io_filewrite($size,$file1,"err");
#print "DEBUG 00fl30 sub fl0_floatrewrite 65 - $errmsg
\n";
return($errmsg);
}
}
# -------- 入力データチェック 共通サブルーチン--------
sub fl_rcrdform{
#print "DEBUG 00fx10 sub rcrd_form - 01 - $file1 - $f1_type - $f1_colnmbr
@f1_data
\n";
if($f1_type eq "var"){
$f1_data[$f1_colnmbr-1] = "END";
$f1_record = join("_SP_",@f1_data);
$f1_record =~ s/\n/
/g; #「改行」をファイル記録用に
}
else{
$errmsg = "$f1_type = ".$f1_type."、ファイルのタイプ(可変長='var')不明です。\n";
$errref1 = "プログラムエラー:".$prjcode0." - ".$work." - ".$prgname." - cg_00fl30x - rcrd_form";
&io_errexit($errmsg,$errref1,$manager);
}
# unshift(@f1_data,$nodata);
}
# ************** 副ルーティン(検索・削除)**************
# -------- データ検索 --------
sub fl0_floatsearch{
$f8_keynmbr = 0;
$f2_rcrdnmbr = 0;
for(my $i=0; $i<$f1_keynmbr;$i++){
$f1_key = $f1_keylist[$i];
if($f1_key eq ""){next;}
$f2_matchnmbr=0;
&fl0_finding;
if($f2_matchnmbr == 0){
$f8_keylist[$f8_keynmbr]= $f1_key;
$f8_keynmbr++;
}
}
}
# -------- 検索 共通サブルーチン--------
sub fl0_finding{
local $min = 1;
local $max = $f2_SIZE-1;
local $line = $min;
&fl0_findingcheck;
if($line<0){return;}
$line = $max;
&fl0_findingcheck;
if($line<0){return;}
my $t=0;
while(1){
$t++;
$line = int(($min + $max)/2);
if($line == $min){
$f1_insline=$min + 1;
return;
}
elsif($t>20){
$errmsg = "(cg_00fl20x - sub finding)プログラム・エラー\n";
$errref1 = "プログラムエラー:".$prjcode0." - ".$work." - ".$prgname." - cg_00fl30x - sub finding";
&io_errexit($errmsg,$errref1,$manager);
}
else{
&fl0_findingcheck;
if($line<0){return;}
}
}
}
sub fl0_findingcheck{
my $keylen = length($f1_key);
my $key = substr($f2_LINES[$line],0,$keylen);
#print "DEBUG 00fl30 sub fl0_findingcheck 10 - $min - $max - $line - $f1_key - $key
\n";
if(($f1_order eq "inc" || $f1_order eq "lst") && $f1_key gt $key || ($f1_order eq "dec" || $f1_order eq "fst") && $f1_key lt $key){
$min = $line;
}
elsif(($f1_order eq "inc" || $f1_order eq "lst") && $f1_key lt $key || ($f1_order eq "dec" || $f1_order eq "fst") && $f1_key gt $key){
$max = $line;
}
else{
#print "DEBUG 00fx10 sub check 11 - $min - $max - $line - $f1_key - $key
\n";
&fl0_findinglist;
$line = -1;
return;
}
}
sub fl0_findinglist{
my $keylen = length($f1_key);
while(1){
$line = $line-1;
my $key = substr($f2_LINES[$line],0,$keylen);
if($line<2 || $key ne $f1_key){last;}
}
while(1){
$line++;
my $key = substr($f2_LINES[$line],0,$keylen);
if($line>$f2_SIZE-1 || $key ne $f1_key){last;}
else{
$f2_rcrdlist[$f2_rcrdnmbr] = $f2_LINES[$line];
$f2_rcrdnmbr++;
$f2_matchnmbr++;
$f2_matchline = $line;
$f2_record = $f2_LINES[$line];
}
}
}
# ------- データ削除 -------
sub fl0_floatdelete{
$f2_rcrdnmbr = 0;
@f0_keylist = @f1_keylist;
#print "DEBUG 00va - 71 - $f2_SIZE - $f1_keynmbr
@f1_keylist
\n";
$f1_LINES[0] = $f2_LINES[0];
$f1_LINES[1] = $f2_LINES[1];
for(my $i=2;$i<$f2_SIZE;$i++){
my $check = 0;
for(my $k=0;$k<$f1_keynmbr;$k++){
$f1_key = $f1_keylist[$k];
if($f1_key eq ""){next;}
my $keylen = length($f1_key);
my $key = substr($f2_LINES[$i],0,$keylen);
#print "DEBUG 00va - 73 - $i - $k - $f1_keynmbr
$key - $f1_key
\n";
if($key eq $f1_key){
$check=1;
$f2_rcrdlist[$f2_rcrdnmbr] = $f2_LINES[$i];
$f2_rcrdnmbr++;
$f0_keylist[$k] = "";
last;
}
}
#print "DEBUG 00va - 74 - $f2_rcrdnmbr
@f0_keylist
\n";
if($check==1){
next;
}
else{
$f1_LINES[$i-$f2_rcrdnmbr]=$f2_LINES[$i];
}
}
$size = $f2_SIZE-$f2_rcrdnmbr;
&io_filewrite($size,$file1,"err");
$f8_keynmbr=0;
for($k=0;$k<$f1_keynmbr;$k++){
if($f0_keylist[$k] ne ""){
$f8_keylist[$f8_keynmbr] = $f0_keylist[$k];
$f8_keynmbr++;
}
}
#print "DEBUG 00xa - 75 - $f8_keynmbr
@f8_keylist
\n";
}
1;