readcfg.pl to HTML.

index -|- end

Generated: Tue Feb 2 17:54:54 2010 from readcfg.pl 2006/04/11 11.2 KB.

#!/Perl
# test file for doing a am2dsp4.cfg read, and check - geoff 11 April, 2006
my $IF_PATTERN = "^if[ \t]+\([A-Za-z][A-Za-z0-9_]*\)[ \t]*\(#.*\)?\$";
my $ELSE_PATTERN = "^else[ \t]*\(#.*\)?\$";
my $ENDIF_PATTERN = "^endif[ \t]*\(#.*\)?\$";
my $verbose = 0;
my $verbose2 = 0;
my @excluded_dirs = ();
my @excluded_files = ();
my $msvc_cflags = "";
my $msvc_threads = "";
my $msvc_libs = "";
my @extra_sources = ();
my @extra_projects = ();
# new variables
my $msvc_dlibs = "";
my $msvc_rlibs = "";
my $in_debug = 0;
my $in_release = 0;
my $do_check = 0;
my $def_cfg = "am2dsp4.cfg";
my $root_dir = '';
my $src_cfg = $def_cfg;
my @msvc_dlibs_list = ();
my @msvc_rlibs_list = ();
my @msvc_libs_list = ();
my @msvc_dlibs_paths = ();
my @msvc_rlibs_paths = ();
my @msvc_libs_paths = ();
my @msvc_inc_paths = ();
my @test_headers = ( 'zlib.h', 'AL/al.h', 'AL/alut.h',
  'simgear/compiler.h', 'simgear/debug/logstream.hxx', 'plib/pu.h' );
# Extracted from AM_INIT_AUTOMAKE(package,version)
my $dsp_package = 'FGFS';
my $dsp_version = '0.2';
my $static_lib = 0;
parse_arguments(@ARGV);
read_am2dsprc($src_cfg);
if ($do_check) {
   check_includes();
}
# debug stuff only
if ($verbose) {
   print "msvc_libs = [$msvc_libs] ...\n";
   print "msvc_dlibs = [$msvc_dlibs] ...\n";
   print "msvc_rlibs = [$msvc_rlibs] ...\n";
}
if ($verbose == 2) {
   my $item = '';
   my $cnt = 0;
   print "msvc_cflags = [$msvc_cflags] ...\n";
   print "excluded_dirs ...\n";
   $cnt = 0;
   foreach $item (@excluded_dirs) {
      $cnt++;
      print "$cnt [$item] ...\n";
   }
   print "Done $cnt excluded_dirs ...\n";
   print "excluded_files ...\n";
   $cnt = 0;
   foreach $item (@excluded_files) {
      $cnt++;
      print "$cnt [$item] ...\n";
   }
   print "Done $cnt excluded_files ...\n";
   print "extra_sources ...\n";
   $cnt = 0;
   foreach $item (@extra_sources) {
      $cnt++;
      print "$cnt [$item] ...\n";
   }
   print "Done $cnt extra_sources ...\n";
   print "extra_projects ...\n";
   $cnt = 0;
   foreach $item (@extra_projects) {
      $cnt++;
      print "$cnt [$item] ...\n";
   }
   print "Done $cnt extra_projects ...\n";
}
exit 0;
sub add_2_msvc {
   my $flg = shift;
   if ($in_debug) {
      $msvc_dlibs .= $flg;
   } elsif ($in_release) {
      $msvc_rlibs .= $flg;
   } else {
      $msvc_libs .= $flg;
   }
}
sub add_2_libs {
   my $flg = shift;
   if ($in_debug) {
      push(@msvc_dlibs_list, $flg);
   } elsif ($in_release) {
      push(@msvc_rlibs_list, $flg);
   } else {
      push(@msvc_libs_list, $flg);
   }
}
sub add_2_libpaths {
   my $flg = shift;
   if ($in_debug) {
      push(@msvc_dlibs_paths, $flg);
   } elsif ($in_release) {
      push(@msvc_rlibs_paths, $flg);
   } else {
      push(@msvc_libs_paths, $flg);
   }
}
sub read_am2dsprc {
    my $rc_file = shift;
    open( RC_FILE, $rc_file )
   or die "Can't open $rc_file: $!\n";
    my $line;
   my @cond_stack = ();
    while (defined($line = <RC_FILE>)) {
   chomp $line;
   if ($line =~ s/\\$//) {
       # continuation line
       $line .= "%";
       $line .= <RC_FILE>;
       redo unless eof(RC_FILE);
   }
   next if $line =~ /^$/; # ignore blank lines
   next if $line =~ /^#/; # ignore comments
   if ($line =~ /exclude_dir\s*=\s*(\S+)/) {
       push( @excluded_dirs, $1 );
   }
   elsif ($line =~ /exclude_file\s*=\s*(\S+)/) {
       my $f;
       ($f = $1) =~ s/\\/\\\\/g; # escape path separators, "\" -> "\\"
       push( @excluded_files, $f );
       print "Excluding file: $f\n" if $verbose;
   }
   elsif ($line =~ /include_path\s*=\s*(\S+)/) {
       $msvc_cflags .= " /I \"$1\"";
      push(@msvc_inc_paths, $1);
   }
   elsif ($line =~ /define\s*=\s*(\S+)/) {
       $msvc_cflags .= " /D \"$1\"";
   }
   elsif ($line =~ /lib_path\s*=\s*(\S+)/) {
       add_2_msvc( " /libpath:\"$1\"" );
      add_2_libpaths( "$1" );
   }
   elsif ($line =~ /add_lib\s*=\s*(\S+)/) {
       add_2_msvc( " $1.lib" );
      add_2_libs( "$1.lib" );
   }
   elsif ($line =~ /type\s*=\s*(\S+)/) {
       my ($type,$threads,$debug) = split /,/, $1;
       print "type=$type, threading=$threads, debug=$debug\n" if $verbose;
       if ($type =~ "ConsoleApplication") {
      $static_lib = 0
       }
       elsif ($type =~ "StaticLibrary") {
      $static_lib = 1
       }
       else {
      # Invalid type
       }
       my $flags = " /ML"; # single threaded.
       if ($threads =~ /Multithreaded/) {
      $flags = " /MT";
       }
       elsif ($threads =~ /Singlethreaded/) {
      $flags = " /ML";
       }
       else {
      # Invalid threading option.
       }
       if ($debug =~ /Debug/) {
      $flags .= "d";
       }
       $msvc_cflags .= $flags;
   }
   elsif ($line =~ /add_source_file\s*=\s*(.*)/) {
       my $rule;
       ($rule = $1) =~ s/%/\r\n/g;
       push( @extra_sources, $rule );
   }
   elsif ($line =~ /add_project\s*=\s*(.*)/) {
       push( @extra_projects, $1 );
   }
   elsif ($line =~ /$IF_PATTERN/o) {
      if ($1 =~ /Debug/io) {
         print "Entering DEBUG ...\n" if $verbose2;
         $in_debug = 1;
         $in_release = 0;
      } elsif ($1 =~ /Release/io) {
         print "Entering RELEASE ...\n" if $verbose2;
         $in_release = 1;
         $in_debug = 0;
      } else {
         print "EEK! Got $1 ...\n";
         die "Presently ONLY if switch is 'Debug' or 'Release'!\n";
      }
       push (@cond_stack, "\@" . $1 . "_TRUE\@");
   }
   elsif ($line =~ /$ELSE_PATTERN/o) {
      if (! @cond_stack) {
          die "else without if!\n";
      }
       elsif ($cond_stack[$#cond_stack] =~ /_FALSE\@$/) {
         die "else after an else!\n";
      } else {
         if ($in_debug) {
            print "Switch to RELEASE ...\n" if $verbose2;
            $in_debug = 0;
            $in_release = 1;
         } else {
            print "Switch to DEBUG ...\n" if $verbose2;
            $in_debug = 1;
            $in_release = 0;
         }
         $cond_stack[$#cond_stack] =~ s/_TRUE\@$/_FALSE\@/;
      }
   }
   elsif ($line =~ /$ENDIF_PATTERN/o) {
       if (! @cond_stack) {
         die "endif without if!\n";
      }
      print "Exit $cond_stack[$#cond_stack] ...\n" if $verbose2;
      pop (@cond_stack);
      $in_debug = 0;
      $in_release = 0;
   }
    } # end while
    close(RC_FILE);
}
sub give_little_help {
   print "am2dsp4: Just a little help ...\n";
   print "--help (or -h, -?) - This brief help!\n";
   print "--version          - Does nothing?\n";
   print "--verbose (or -v)  - Sets verbose mode. (-v2 for MORE)\n";
   print "--package name     - Set the DSP package name (default = $dsp_package)\n";
   print "--lib (or -l)      - To create static library (Default is console app.)\n";
   print "--dir path         - Establish input path for $def_cfg.\n";
   print "--check (or -c)    - Check libraries, and some known include files, and exit.\n";
   print "Any other option with '-' will abort, with a complaint ...\n";
   die   "Any other input    - is ignored ...\n";
}
sub set_config {
   my $cfg = shift;
   if ( !(($cfg =~ /\/$/) || ($cfg =~ /\\$/)) ) {
      $cfg .= '\\';
   }
   my $fil = $cfg . $def_cfg;
   if( -r $fil ) {
      $src_cfg = $fil;
      $root_dir = $cfg;
   } else {
      # a thought to use 'source' folder, but later abandoned!
      #$fil = $cfg . 'source\\' . $def_cfg;
      #if( -r $fil ) {
      #   $src_cfg = $fil;
      #   $root_dir = $cfg . 'source\\';
      #} else {
         die "ERROR: Can NOT locate $def_cfg on the path $cfg, nor $cfg\\source! ... aborting!\n";
      #}
   }
   print "Using root path [$root_dir] to find file $src_cfg ...\n";
}
sub parse_arguments {
    my @av = @_;
    while (@av) {
   if ($av[0] eq '--version') {
      # does nothing
   } elsif ($av[0] eq '--help' || $av[0] eq '-h' || $av[0] eq '-?') {
      give_little_help();
   } elsif ($av[0] eq '--verbose' || $av[0] eq '-v') {
       $verbose = 1;
   } elsif ($av[0] eq '--package' || $av[0] eq '-p') {
       require_argument(@av);
       shift @av;
       $dsp_package = $av[0];
   } elsif ($av[0] eq '--lib' || $av[0] eq '-l') {
       # Create a static library
       $static_lib = 1;
   } elsif ($av[0] eq '--dir') {
       require_argument(@av);
       shift @av;
      set_config($av[0]);
   } elsif ($av[0] eq '--check' || $av[0] eq '-c') {
      $do_check = 1;
   } elsif ($av[0] eq '-v2' ) {
      $verbose2 = 1;
   } elsif ($av[0] =~ /^-/) {
       die "am2dsp4: unrecognised option -- `$av[0]'\nTry am2dsp --help for more information.\n";
   } else {
   }
   shift @av;
    }
}
# Ensure argument exists, or die.
sub require_argument
{
    my ($arg, @arglist) = @_;
    die "am2dsp4: no argument given for option '$arg'\n"
        if ! @arglist;
}
sub subroot {
   my ($rt, $fi) = @_;
   my $l1 = length($rt);
   my $l2 = length($fi);
   if ($l1 <= $l2) {
      $rt = substr($fi, $l1);
   } else {
      $rt = $fi;
   }
   return $rt;
}
sub check_lib_paths {
   my $fil = shift;
   my $inc = '';
   my $ff = '';
   my $found = 0;
   if( ! $found ) {
      foreach $inc (@msvc_libs_paths) {
         $ff = $root_dir . $inc;
         if ( !(($ff =~ /\/$/) || ($ff =~ /\\$/)) ) {
            $ff .= '\\';
         }
         $ff .= $fil;
         if( -f $ff ) {
            $found = 1;
            last;
         }
      }
   }
   if( ! $found ) {
      foreach $inc (@msvc_rlibs_paths) {
         $ff = $root_dir . $inc;
         if ( !(($ff =~ /\/$/) || ($ff =~ /\\$/)) ) {
            $ff .= '\\';
         }
         $ff .= $fil;
         if( -f $ff ) {
            $found = 1;
            last;
         }
      }
   }
   if( ! $found ) {
      foreach $inc (@msvc_dlibs_paths) {
         $ff = $root_dir . $inc;
         if ( !(($ff =~ /\/$/) || ($ff =~ /\\$/)) ) {
            $ff .= '\\';
         }
         $ff .= $fil;
         if( -f $ff ) {
            $found = 1;
            last;
         }
      }
   }
   if( $found ) {
      print "Found $fil in $inc [$ff] ...\n" if $verbose2;
   } else {
      print "WARNING: Unable to locate $fil ...\n" if $verbose2;
   }
   return $found;
}
sub check_inc_paths {
   my $fil = shift;
   my $inc = '';
   my $ff = '';
   my $found = 0;
   if( ! $found ) {
      foreach $inc (@msvc_inc_paths) {
         $ff = $root_dir . $inc;
         if ( !(($ff =~ /\/$/) || ($ff =~ /\\$/)) ) {
            $ff .= '\\';
         }
         $ff .= $fil;
         ### print "Checking for $fil in $ff ...\n" if $verbose9;
         if( -f $ff ) {
            $found = 1;
            last;
         }
      }
   }
   if( $found ) {
      print "Found $fil in $inc [$ff] ...\n" if $verbose2;
   } else {
      print "WARNING: Unable to locate $fil ...\n" if $verbose2;
   }
   return $found;
}
sub check_includes {
   # check for a known set of INCLUDE files
   my $fil = '';
   my $ff = '';
   my $cnt1 = 0;
   my $cnt2 = 0;
   my @missed = ();
   my @missed2 = ();
   $cnt1 = scalar @msvc_dlibs_list + scalar @msvc_rlibs_list + scalar @msvc_libs_list;
   print "Check each $cnt1 additional library, in each library include path ...\n" if $verbose;
   $cnt1 = 0;
   foreach $fil (@msvc_dlibs_list) {
      $cnt1++;
      if( check_lib_paths( $fil ) == 0 ) {
         push(@missed, $fil);
      }
   }
   foreach $fil (@msvc_rlibs_list) {
      $cnt1++;
      if( check_lib_paths( $fil ) == 0 ) {
         push(@missed, $fil);
      }
   }
   foreach $fil (@msvc_libs_list) {
      $cnt1++;
      if( check_lib_paths( $fil ) == 0 ) {
         push(@missed, $fil);
      }
   }
   $cnt2 = scalar @test_headers;
   print "Check each of $cnt2 test headers, in each include path ...\n" if $verbose;
   foreach $fil (@test_headers) {
      $cnt2++;
      if( check_inc_paths( $fil ) == 0 ) {
         push(@missed2, $fil);
      }
   }
   print "Done checking $cnt1 libraries, and $cnt2 test includes ...\n";
   if( @missed ) {
      print "WARNING: Missed ". join(' ',@missed) . ".\n";
      print "Check 'add_lib' and 'lib_path' in $src_cfg ...\n";
   }
   if( @missed2 ) {
      print "WARNING: Missed ". join(' ',@missed2) . ".\n";
      print "Check 'include_path' in $src_cfg ...\n";
   }
   die "End check of libraries and include files ... aborting ...\n";
}
# eof - readcfg.pl

index -|- top

checked by tidy  Valid HTML 4.01 Transitional