Reorganisation of the source tree
[ghc-hetmet.git] / utils / hstags / hstags.prl
diff --git a/utils/hstags/hstags.prl b/utils/hstags/hstags.prl
new file mode 100644 (file)
index 0000000..16e770b
--- /dev/null
@@ -0,0 +1,94 @@
+#
+# To fully function, this script needs the following variables
+# set:
+#
+#   INSTALLING
+#   DEFAULT_TMPDIR
+#   TOP_PWD
+#   libdir
+#   libexecdir
+#   ProjectVersionInt
+#   HSP_IMPORTS
+
+if ( $ENV{'TMPDIR'} ) { # where to make tmp file names
+    $tmp = $ENV{'TMPDIR'} . "/$$.eht";
+} else {
+    $tmp ="${DEFAULT_TMPDIR}/$$.eht";
+    $ENV{'TMPDIR'} = ${DEFAULT_TMPDIR}; # set the env var as well
+}
+
+$TopPwd         = "${TOP_PWD}"; # *Only* needed when using it in-situ (i.e., INSTALLING=0).
+$InstLibDirGhc  = "${libdir}";
+$InstLibExecDirGhc  = "${libexecdir}";
+
+$Unlit = ( $INSTALLING ? 
+           "${InstLibExecDirGhc}/unlit" : 
+          "${TopPwd}/ghc/utils/unlit/unlit" );
+# but this is re-set to "cat" (after options) if -cpp not seen
+$HsCpp = ( $INSTALLING ? 
+          "${InstLibDirGhc}/hscpp" : 
+          "${TopPwd}/ghc/utils/hscpp/hscpp" );
+$HsP   = ( $INSTALLING ? 
+          "${InstLibExecDirGhc}/hsp" : 
+          "${TopPwd}/ghc/compiler/hsp" );
+$HsTagsHelp = 
+        ( $INSTALLING ? 
+          "${InstLibExecDirGhc}/hstags-help" : 
+          "${TopPwd}/ghc/utils/hstags/hstags-help" );
+
+$Verbose = 0;
+$Append = '>';
+$DoCpp = 0;
+$Cpp_opts = '';
+$HsP_opts = '';
+@Files = ();
+
+while ($ARGV[0] =~ /^-./) {
+    $_ = shift(@ARGV);
+    /^--/              && last;
+    /^-v/              && ($Verbose  =  1, next);
+    /^-a$/             && ($Append   = '>>', next);
+    /^-fglasgow-exts/  && ($HsP_opts .= ' -N', next);
+    /^-optP(.*)/       && ($Cpp_opts .= " $1", next);
+    /^-[UDI]/          && ($Cpp_opts .= " $_", next);
+    /^-cpp/            && ($DoCpp = 1, next);
+    /^-/               && next; # ignore the rest
+    push(@Files, $_);
+}
+
+$DoHsCpp = ( ! $DoCpp ) ? 'cat'
+                       : "$HsCpp -D__HASKELL1__=2 -D__GLASGOW_HASKELL__=$ProjectVersionInt $Cpp_opts";
+
+# to find Prelude.hi and friends.
+$HsP_opts .= ( $INSTALLING  ? 
+              "-J${InstLibDirGhc}/imports" : 
+              ( '-J' . join(' -J',split(/:/,${HSP_IMPORTS})) ));
+
+open(STDOUT, "$Append TAGS") || die "can't create TAGS";
+
+foreach $f ( @ARGV ) {
+    # if file is in a dir && we are CPPing, then we add its dir to the -I list.
+    if ( $DoCpp && $f =~ /(.+)\/[^\/]+$/ ) {
+       $Idir = "-I$1";
+    } else {
+       $Idir = '';
+    }
+
+    if ( $f =~ /\.lhs$/ ) {
+       $ToDo = "$Unlit $f - | $DoHsCpp $Idir | $HsP -E $HsP_opts | $HsTagsHelp $f > $tmp";
+    } else {
+       $ToDo = "$DoHsCpp $Idir < $f | $HsP -E  $HsP_opts | $HsTagsHelp $f > $tmp";
+    }
+    print STDERR "$ToDo\n" if $Verbose;
+    system($ToDo);
+    $return_val = $?;
+    die "Fatal error $return_val\n" if $return_val != 0;
+
+    ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
+     $atime,$mtime, $ctime,$blksize,$blocks) = stat("$tmp");
+  
+    print STDOUT "\f\n$f,${size}\n";
+    print STDOUT `cat $tmp`;
+}
+
+unlink $tmp;