| 21 | 
  | 
#  Filename     :  $RCSfile: filepp,v $ | 
| 22 | 
  | 
#  Author       :  $Author: tim $ | 
| 23 | 
  | 
#  Maintainer   :  Darren Miller: darren@cabaret.demon.co.uk | 
| 24 | 
< | 
#  File version :  $Revision: 1.2 $ | 
| 25 | 
< | 
#  Last changed :  $Date: 2004-10-02 04:40:48 $ | 
| 24 | 
> | 
#  File version :  $Revision: 1.5 $ | 
| 25 | 
> | 
#  Last changed :  $Date: 2004-10-11 21:10:28 $ | 
| 26 | 
  | 
#  Description  :  Main program | 
| 27 | 
  | 
#  Licence      :  GNU copyleft | 
| 28 | 
  | 
# | 
| 32 | 
  | 
 | 
| 33 | 
  | 
use strict "vars"; | 
| 34 | 
  | 
use strict "subs"; | 
| 35 | 
– | 
#use Graph; | 
| 35 | 
  | 
# Used to all filepp to work with any char, not just ascii, | 
| 36 | 
  | 
# feel free to remove this if it causes you problems | 
| 37 | 
< | 
use bytes; | 
| 37 | 
> | 
#use bytes; | 
| 38 | 
  | 
 | 
| 39 | 
  | 
# version number of program | 
| 40 | 
  | 
my $VERSION = '1.7.1'; | 
| 41 | 
  | 
 | 
| 42 | 
  | 
# list of paths to search for modules, normal Perl list + module dir | 
| 43 | 
< | 
push(@INC, "/home/maul/gezelter/tim/code/OOPSE-2.0/scripts/filepp-1.7.1/modules/f90dpend/"); | 
| 43 | 
> | 
#push(@INC, "/home/maul/gezelter/tim/code/OOPSE-2.0/scripts/filepp-1.7.1/modules/f90dpend/"); | 
| 44 | 
  | 
 | 
| 45 | 
  | 
# index of keywords supported and functions to deal with them | 
| 46 | 
  | 
my %Keywords = ( | 
| 280 | 
  | 
 all other arguments are assumed to be input files | 
| 281 | 
  | 
"; | 
| 282 | 
  | 
 | 
| 284 | 
– | 
# graph for dependency files | 
| 285 | 
– | 
my $dependencyGraph; | 
| 283 | 
  | 
 | 
| 284 | 
  | 
# visited table | 
| 285 | 
  | 
my %visitedTable = (); | 
| 293 | 
  | 
# | 
| 294 | 
  | 
my %f90ModList = (); | 
| 295 | 
  | 
 | 
| 296 | 
< | 
# | 
| 296 | 
> | 
# suffix of fortran object file | 
| 297 | 
  | 
my $objExt = '.o'; | 
| 298 | 
+ | 
 | 
| 299 | 
+ | 
# suffix of fortran 90 module | 
| 300 | 
+ | 
my $modSuffix = "mod"; | 
| 301 | 
+ | 
 | 
| 302 | 
+ | 
# case of basename of fortran 90 module | 
| 303 | 
+ | 
my $modBasenameCase = "lower"; | 
| 304 | 
+ | 
 | 
| 305 | 
+ | 
#flag for generating dependency, by default, it is off | 
| 306 | 
+ | 
my $dependency = 0; | 
| 307 | 
+ | 
 | 
| 308 | 
+ | 
#skip system header file | 
| 309 | 
+ | 
my $skipSysInclude = 0; | 
| 310 | 
+ | 
 | 
| 311 | 
+ | 
#saved command line define macro | 
| 312 | 
+ | 
my @savedDefine; | 
| 313 | 
+ | 
 | 
| 314 | 
  | 
############################################################################## | 
| 315 | 
  | 
# SetDebug - controls debugging level | 
| 316 | 
  | 
############################################################################## | 
| 1945 | 
  | 
    } | 
| 1946 | 
  | 
    # else assume filename given without "" or <>, naughty but allowed | 
| 1947 | 
  | 
     | 
| 1948 | 
+ | 
    #if skipSysInclude option is turned on, skip current file | 
| 1949 | 
+ | 
    if ($skipSysInclude && $sysinclude) { | 
| 1950 | 
+ | 
        return; | 
| 1951 | 
+ | 
    } | 
| 1952 | 
+ | 
     | 
| 1953 | 
  | 
    # check for file in current directory | 
| 1954 | 
  | 
    if($sysinclude == 0) { | 
| 1955 | 
  | 
        # get name of directory base file is in | 
| 2233 | 
  | 
sub Write | 
| 2234 | 
  | 
{ | 
| 2235 | 
  | 
    my $string = shift; | 
| 2236 | 
< | 
    #print(OUTPUT $string); | 
| 2236 | 
> | 
     | 
| 2237 | 
> | 
    if(!$dependency){ | 
| 2238 | 
> | 
        print(OUTPUT $string); | 
| 2239 | 
> | 
    } | 
| 2240 | 
  | 
} | 
| 2241 | 
  | 
 | 
| 2242 | 
  | 
 | 
| 2459 | 
  | 
    if ($modulename !~ /^procedure/){ | 
| 2460 | 
  | 
         | 
| 2461 | 
  | 
        $modulename =~ s/\s+$//; | 
| 2462 | 
< | 
        $parsedModList{uc($modulename) . ".mod"} =  Filepp::GetDefine('__FILE__'); | 
| 2462 | 
> | 
        $parsedModList{GetModBasename($modulename) .  "." . $modSuffix} | 
| 2463 | 
> | 
                    =  Filepp::GetDefine('__FILE__'); | 
| 2464 | 
  | 
         | 
| 2465 | 
  | 
        #$modulefile = Filepp::GetDefine('__BASE_FILE__'); | 
| 2466 | 
  | 
        #print $modulefile; | 
| 2484 | 
  | 
    $f90module =~ s/\s+$//; | 
| 2485 | 
  | 
    $f90module = uc($f90module); | 
| 2486 | 
  | 
     | 
| 2487 | 
< | 
    print " " . $objDir . $f90module . '.mod \\', "\n"; | 
| 2466 | 
< | 
    #addModule($f90module); | 
| 2487 | 
> | 
    print " " . $objDir . GetModBasename($f90module) . "." . $modSuffix . " \\\n"; | 
| 2488 | 
  | 
} | 
| 2489 | 
  | 
 | 
| 2490 | 
  | 
############################################################################## | 
| 2509 | 
  | 
                $visitedTable{$fullfile} = 1; | 
| 2510 | 
  | 
                return 0; | 
| 2511 | 
  | 
        } | 
| 2512 | 
+ | 
} | 
| 2513 | 
+ | 
 | 
| 2514 | 
+ | 
############################################################################## | 
| 2515 | 
+ | 
# Clean Visited Table | 
| 2516 | 
+ | 
############################################################################## | 
| 2517 | 
+ | 
sub cleanVisited { | 
| 2518 | 
+ | 
    my $visitedFile; | 
| 2519 | 
+ | 
    foreach $visitedFile (keys %visitedTable) { | 
| 2520 | 
+ | 
        delete $visitedTable{$visitedFile}; | 
| 2521 | 
+ | 
    } | 
| 2522 | 
+ | 
 | 
| 2523 | 
  | 
} | 
| 2524 | 
  | 
 | 
| 2525 | 
  | 
sub AddModule { | 
| 2534 | 
  | 
 | 
| 2535 | 
  | 
} | 
| 2536 | 
  | 
 | 
| 2537 | 
< | 
 | 
| 2537 | 
> | 
############################################################################## | 
| 2538 | 
> | 
# Generate rules for fortran 90 module | 
| 2539 | 
> | 
############################################################################## | 
| 2540 | 
  | 
sub printModule { | 
| 2541 | 
  | 
        my $modname; | 
| 2542 | 
  | 
        my $objname; | 
| 2547 | 
  | 
        } | 
| 2548 | 
  | 
} | 
| 2549 | 
  | 
 | 
| 2550 | 
+ | 
############################################################################## | 
| 2551 | 
+ | 
# Get the object file name | 
| 2552 | 
+ | 
############################################################################## | 
| 2553 | 
  | 
sub GetObjFile { | 
| 2554 | 
  | 
        use File::Basename; | 
| 2555 | 
  | 
        my $fullname = shift; | 
| 2559 | 
  | 
        ($filename, $dir, $suffix) = fileparse($fullname, '\.[^.]*');    | 
| 2560 | 
  | 
        return $filename . $objExt; | 
| 2561 | 
  | 
} | 
| 2562 | 
+ | 
 | 
| 2563 | 
  | 
############################################################################## | 
| 2564 | 
+ | 
# Get the base name of fortran 90 module | 
| 2565 | 
+ | 
############################################################################## | 
| 2566 | 
+ | 
sub GetModBasename { | 
| 2567 | 
+ | 
        my $modname = shift; | 
| 2568 | 
+ | 
         | 
| 2569 | 
+ | 
        if ($modBasenameCase eq "lower") { | 
| 2570 | 
+ | 
            $modname = lc($modname); | 
| 2571 | 
+ | 
             | 
| 2572 | 
+ | 
        } elsif ($modBasenameCase eq "upper") { | 
| 2573 | 
+ | 
            $modname = uc($modname); | 
| 2574 | 
+ | 
        } elsif ($modBasenameCase eq "mixed") { | 
| 2575 | 
+ | 
            $modname = ucfirst(lc($modname)); | 
| 2576 | 
+ | 
        } | 
| 2577 | 
+ | 
         | 
| 2578 | 
+ | 
        return $modname; | 
| 2579 | 
+ | 
} | 
| 2580 | 
+ | 
 | 
| 2581 | 
+ | 
sub RestoreCommandLineDefine { | 
| 2582 | 
+ | 
    my $macro; | 
| 2583 | 
+ | 
     | 
| 2584 | 
+ | 
    foreach $macro(@savedDefine) { | 
| 2585 | 
+ | 
        Define($macro); | 
| 2586 | 
+ | 
    } | 
| 2587 | 
+ | 
} | 
| 2588 | 
+ | 
 | 
| 2589 | 
+ | 
sub SaveCommandLineDefine { | 
| 2590 | 
+ | 
    my $macro = shift; | 
| 2591 | 
+ | 
    push @savedDefine, $macro; | 
| 2592 | 
+ | 
} | 
| 2593 | 
+ | 
############################################################################## | 
| 2594 | 
  | 
# Main routine | 
| 2595 | 
  | 
############################################################################## | 
| 2596 | 
  | 
 | 
| 2634 | 
  | 
        } | 
| 2635 | 
  | 
        # add macro and defn to hash table | 
| 2636 | 
  | 
        Define($macro." ".$defn); | 
| 2637 | 
+ | 
         | 
| 2638 | 
+ | 
        #save define macro from command line | 
| 2639 | 
+ | 
        #it will be restored when next source file is processed | 
| 2640 | 
+ | 
        SaveCommandLineDefine($macro." ".$defn); | 
| 2641 | 
  | 
    } | 
| 2642 | 
  | 
 | 
| 2643 | 
  | 
    # Debugging turned on: -d | 
| 2768 | 
  | 
    } | 
| 2769 | 
  | 
 | 
| 2770 | 
  | 
    # Module paths: -Minclude or -M include | 
| 2771 | 
< | 
    elsif(substr($ARGV[$i], 0, 2) eq "-M") { | 
| 2772 | 
< | 
        # -M include format | 
| 2773 | 
< | 
        if(length($ARGV[$i]) == 2) { | 
| 2774 | 
< | 
            if($i+1 >= $argc) { | 
| 2775 | 
< | 
                Error("Argument to `-M' is missing"); | 
| 2776 | 
< | 
            } | 
| 2777 | 
< | 
            AddModulePath($ARGV[++$i]); | 
| 2778 | 
< | 
        } | 
| 2779 | 
< | 
        # -Minclude format | 
| 2780 | 
< | 
        else { | 
| 2781 | 
< | 
            AddModulePath(substr($ARGV[$i], 2)); | 
| 2782 | 
< | 
        } | 
| 2783 | 
< | 
    } | 
| 2771 | 
> | 
    #elsif(substr($ARGV[$i], 0, 2) eq "-M") { | 
| 2772 | 
> | 
    #   # -M include format | 
| 2773 | 
> | 
    #   if(length($ARGV[$i]) == 2) { | 
| 2774 | 
> | 
    #       if($i+1 >= $argc) { | 
| 2775 | 
> | 
    #           Error("Argument to `-M' is missing"); | 
| 2776 | 
> | 
    #       } | 
| 2777 | 
> | 
    #       AddModulePath($ARGV[++$i]); | 
| 2778 | 
> | 
    #   } | 
| 2779 | 
> | 
    #   # -Minclude format | 
| 2780 | 
> | 
    #   else { | 
| 2781 | 
> | 
    #       AddModulePath(substr($ARGV[$i], 2)); | 
| 2782 | 
> | 
    #   } | 
| 2783 | 
> | 
    #} | 
| 2784 | 
  | 
 | 
| 2785 | 
  | 
    # use module | 
| 2786 | 
< | 
    elsif($ARGV[$i] eq "-m") { | 
| 2787 | 
< | 
        if($i+1 >= $argc) { | 
| 2788 | 
< | 
            Error("Argument to `-m' is missing"); | 
| 2789 | 
< | 
        } | 
| 2790 | 
< | 
        UseModule($ARGV[++$i]); | 
| 2786 | 
> | 
    #elsif($ARGV[$i] eq "-m") { | 
| 2787 | 
> | 
    #   if($i+1 >= $argc) { | 
| 2788 | 
> | 
    #       Error("Argument to `-m' is missing"); | 
| 2789 | 
> | 
    #   } | 
| 2790 | 
> | 
    #   UseModule($ARGV[++$i]); | 
| 2791 | 
> | 
    #} | 
| 2792 | 
> | 
 | 
| 2793 | 
> | 
    # make dependency | 
| 2794 | 
> | 
    elsif($ARGV[$i] eq "-M") { | 
| 2795 | 
> | 
        $dependency = 1; | 
| 2796 | 
  | 
    } | 
| 2797 | 
  | 
 | 
| 2798 | 
+ | 
    # make dependency (skip system header files) | 
| 2799 | 
+ | 
    elsif($ARGV[$i] eq "-MM") { | 
| 2800 | 
+ | 
        $dependency = 1; | 
| 2801 | 
+ | 
        $skipSysInclude = 1; | 
| 2802 | 
+ | 
    } | 
| 2803 | 
+ | 
 | 
| 2804 | 
+ | 
    #case of basename of fortran module | 
| 2805 | 
+ | 
    elsif($ARGV[$i] eq "-mc") { | 
| 2806 | 
+ | 
        my $tempVar = lc($ARGV[++$i]); | 
| 2807 | 
+ | 
        if ($modBasenameCase ne 'lower' && $modBasenameCase ne 'upper' | 
| 2808 | 
+ | 
                                        && $modBasenameCase ne 'mixed'){ | 
| 2809 | 
+ | 
            Error("Valid argument for `-om' are lower, upper or mixed"); | 
| 2810 | 
+ | 
        } | 
| 2811 | 
+ | 
        $modBasenameCase = $tempVar; | 
| 2812 | 
+ | 
    } | 
| 2813 | 
+ | 
     | 
| 2814 | 
+ | 
    #the suffix of fortran module | 
| 2815 | 
+ | 
    elsif($ARGV[$i] eq "-ms") { | 
| 2816 | 
+ | 
        $modSuffix = $ARGV[++$i]; | 
| 2817 | 
+ | 
    } | 
| 2818 | 
+ | 
     | 
| 2819 | 
  | 
    # set macro prefix | 
| 2820 | 
  | 
    elsif($ARGV[$i] eq "-mp") { | 
| 2821 | 
  | 
        if($i+1 >= $argc) { | 
| 2833 | 
  | 
    # module files will be built in a separate directory from the sources. | 
| 2834 | 
  | 
    elsif($ARGV[$i] eq "-od") { | 
| 2835 | 
  | 
        $objDir = $ARGV[++$i]; | 
| 2836 | 
< | 
    }     | 
| 2836 | 
> | 
    } | 
| 2837 | 
> | 
     | 
| 2838 | 
  | 
    # turn on overwrite mode | 
| 2839 | 
  | 
    elsif($ARGV[$i] eq "-ov") { | 
| 2840 | 
  | 
        $overwrite = 1; | 
| 2944 | 
  | 
    } | 
| 2945 | 
  | 
     | 
| 2946 | 
  | 
    #clean visitedTable | 
| 2947 | 
< | 
    %visitedTable = (); | 
| 2947 | 
> | 
    cleanVisited(); | 
| 2948 | 
> | 
     | 
| 2949 | 
> | 
    #clear all define | 
| 2950 | 
> | 
    UndefAll(); | 
| 2951 | 
> | 
     | 
| 2952 | 
> | 
    #restore command line define | 
| 2953 | 
> | 
    RestoreCommandLineDefine(); | 
| 2954 | 
> | 
     | 
| 2955 | 
> | 
    #print dependency rule | 
| 2956 | 
  | 
    print "\n"; | 
| 2957 | 
< | 
    print $objDir . GetObjFile($base_file) . " : "; | 
| 2957 | 
> | 
    print $objDir . GetObjFile($base_file) . " : " . $base_file . " \\"; | 
| 2958 | 
> | 
    print "\n"; | 
| 2959 | 
> | 
 | 
| 2960 | 
  | 
    Parse($base_file); | 
| 2961 | 
  | 
    # close output file if in overwrite mode | 
| 2962 | 
  | 
    if($overwrite) { CloseOutputFile(); }     |