#========================================================
# GeneralFileFormat
#========================================================
package GeneralFileFormat;
use Exporter;
@ISA = qw(Exporter);
#公開したいサブルーチン
@EXPORT = qw();
#use strict;
#use MyTk::TkRietan;
#use MyTk::TkDVXa;
#use MyTk::TkWIEN2k;
#use MyTk::TkVASP;
#use MyTk::TkCASTEP;
#use MyTk::TkCRYSTAL06;
#use MyTk::TkGaussian;
#use MyTk::TkGULP;
#use MyTk::TkRINT2000;
#use MyTk::TkGeneralDataFile;
#nouse MyTk::TkRietan;
#============================================================
# モジュール内大域変数
#============================================================
my @Libs;
#============================================================
# 一般関数
#============================================================
#=====================================================
# Tkライブラリィで使われている関数 (Obsolete)
#=====================================================
sub LoadTkPlotModules
{
my ($pPathArray, $pLoadedModules) = @_;
my @PathArray = @$pPathArray;
my $DirSep = Deps::DirSep();
my $IsError = 0;
for(my $i = 0 ; $i < @PathArray ; $i++) {
my $lib = $PathArray[$i];
$lib =~ s/::/$DirSep/g;
my $path;
for(my $j = 0 ; $j < @INC ; $j++) {
my $inc = $INC[$j];
$path = Deps::MakePath($inc, "$lib.pm");
last if(-f $path);
}
if(-f $path) {
print "Load TkPlot Module: $path\n";
require $path if(!$pLoadedModules->{$lib});
push(@Libs, $lib)
}
else {
print "Error in LoadTkPlotModules: Can not load $path\n";
$IsError++;
}
}
return undef if($IsError);
return 1;
}
sub CheckFileType
{
my ($path) = @_;
my $Debug = 1;
print "In GeneralFileFormat::CheckFileType\n" if($Debug);
for(my $i = 0 ; $i < @Libs ; $i++) {
my $lib = $Libs[$i];
my ($ClassName) = ($lib =~ /Tk(.*)$/i);
#print "Lib: $lib\n";
next unless($ClassName);
my $TkClassName = "Tk$ClassName";
#use "$lib/$TkClassName";
# my $func = $ClassName . "::CheckFileType";
my $func = $TkClassName . "::CheckFileType";
my $FileType;
if(defined $func) {
print "GeneralFileFormat::CheckFileType: Call [$func]\n";
$FileType = eval('&$func($path)');
}
else {
print "GeneralFileFormat::CheckFileType: [$func] is not defined\n";
}
$FileType = 'unknown' unless($FileType);
print " FileType: $FileType\n";
if($FileType ne 'unknown') {
#print " Found in $TkClassName\n" if($Debug);
return new $TkClassName;
}
}
return undef;
#これ以降は、以前のルーチン
#使わない
if(WIEN2k::CheckFileType($path)) {
print "Check WIEN2k\n" if($Debug);
return new TkWIEN2k;
}
elsif(Rietan::CheckFileType($path)) {
print "Check Rietan\n" if($Debug);
return new TkRietan;
}
return undef;
}
#=====================================================
# Crystalライブラリィで使われている関数 (Obsolete)
#=====================================================
sub GuessFileFormat
{
my ($infile) = @_;
#ファイル名を(ベース名, ディレクトリ名, 拡張子)に分解
my @filenames = fileparse($infile, "\.[^\.]+");
#print "filenames: $filenames[0] : $filenames[1] : $filenames[2]
\n";
return "CIF" if($filenames[2] =~ /^\.cif$/i);
return "GULP Input" if($filenames[2] =~ /^\.glp$/i);
return "GULP MD History" if($filenames[2] =~ /^\.his$/i);
return "K.exe Input" if($filenames[2] =~ /^\.kin/i);
return "K.exe Output" if($filenames[2] =~ /^\.kout/i);
return "Rietan Input" if($filenames[2] =~ /^\.ins/i);
return "Rietan Intensity" if($filenames[2] =~ /^\.int/i);
my $linecount = 0;
my $IsGULP = 0;
my $nGULPSeparator = 0;
return "Read failed" unless(open(IN,"<$infile"));
while() {
$linecount++;
$nGULPSeparator++ if($_ =~ /^\*{80}/);
$IsGULP = 1 if($nGULPSeparator == 1 and $_ =~ /^\*\s+GENERAL\s+UTILITY\s+LATTICE\s+PROGRAM/i);
#print "$linecount: $nGULPSeperator: $IsGULP$LF";
if($IsGULP and $nGULPSeparator == 2) {
if($_ =~ /^\*\s+opti(mise)?\s/i) {
close(IN);
return "GULP Output opti";
}
elsif($_ =~ /^\*\s+fit\s/i) {
close(IN);
return "GULP Output fit";
}
elsif($_ =~ /^\*\s+md\s/i) {
close(IN);
return "GULP Output md";
}
}
}
close(IN);
return "unknown";
}
1;