diff options
Diffstat (limited to 'solenv/bin/mhids.pl')
-rw-r--r-- | solenv/bin/mhids.pl | 394 |
1 files changed, 394 insertions, 0 deletions
diff --git a/solenv/bin/mhids.pl b/solenv/bin/mhids.pl new file mode 100644 index 000000000000..f0abf2e5cdca --- /dev/null +++ b/solenv/bin/mhids.pl @@ -0,0 +1,394 @@ +: +eval 'exec perl -wS $0 ${1+"$@"}' + if 0; +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2000, 2010 Oracle and/or its affiliates. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +my $filename; +my $srs; +my $prjname; +my $defs; +my $solarincludes; +my $verbose = 0; + +my $debug = 0; +my $filebase; +my $workfile; +my $shell_workfile; +my @cleanuplist = (); + +# variables to setup the compiler line +my $appext; +my $compiler; +my $outbin_flag; +my $outobj_flag; +my $objext; +my $preprocess_flag; # preprocess to stdout + +my $no_hid_files; + +sub cleandie +{ + my $errstring = shift @_; + my $erroreval = $@; + + print STDERR "$errstring\n"; + if ( not $debug ) { + foreach my $i (@cleanuplist) { + unlink "$workfile$i" if -f "$workfile$i" or print STDERR "ERROR - couldn't remove $workfile$i\n"; + } + } + die "$erroreval\n"; +} + +sub setcompiler +{ + my $whichcom = $ENV{COM}; + my $extra_cflags = $ENV{EXTRA_CFLAGS}; + $extra_cflags = "" if (!$extra_cflags); + if ( "$whichcom" eq "GCC" ) { + $appext = ""; # windows for now + $compiler = "gcc -x c $extra_cflags"; + $outbin_flag = "-o "; + $outobj_flag = ""; + $objext = ".o"; + $preprocess_flag = "-E"; # preprocess to stdout + } elsif ( "$whichcom" eq "MSC" ) { + $appext = ".exe"; # windows for now + $compiler = "cl -nologo"; + $outbin_flag = "-Fe"; + $outobj_flag = "-Fo"; + $objext = ".obj"; + $preprocess_flag = "-EP"; # preprocess to stdout + $solarincludes =~ s/\/stl/\/xstlx/g; + $defs =~ s/\/stl/\/xstlx/g; + } elsif ( "$whichcom" eq "C52" ) { + $appext = ""; # windows for now + $compiler = "cc"; + $outbin_flag = "-o "; + $outobj_flag = ""; + $objext = ".o"; + $preprocess_flag = "-E"; # preprocess to stdout + + # hack for SO cc wrapper + $ENV{wrapper_override_cc_wrapper} = "TRUE"; + $solarincludes =~ s/stl/xstlx/g; + $defs =~ s/\/stl/\/xstlx/g; + } else { + print STDERR "----------------------------------------------------------------------\n"; + print STDERR "OOops... looks like your compiler isn't known to \n$0\n"; + print STDERR "please edit the \"setcompiler\" section of this script to make it work.\n"; + print STDERR "----------------------------------------------------------------------\n"; + die "ERROR - compiler (or \$COM settings) unknown!\n"; + } +} + +#--------------------------------------------------- +$filename = undef; +$srs = undef; +$prjname = undef; + +my @expectedArgs = ( \$filename, \$srs, \$prjname ); +my $expectedArgsIndex = 0; +while ( ( $#ARGV >= 0 ) && ( $expectedArgsIndex < 3 ) ) +{ + $_ = shift @ARGV; + if ( /^-verbose$/ ) + { + $verbose = 1; + next; + } + ${$expectedArgs[ $expectedArgsIndex ]} = $_; + ++$expectedArgsIndex; +} + +$defs = join " ",@ARGV if ($#ARGV); + +if ( !defined $prjname ) { die "ERROR - check usage\n"; } + +if ( $ENV{NO_HID_FILES} ) { + $no_hid_files = $ENV{"NO_HID_FILES"}; +} +$solarincludes = $ENV{SOLARINCLUDES}; +if (defined $ENV{TMPDIR}) { + $tmpdir = $ENV{TMPDIR}; +} elsif (defined $ENV{TMP}) { + $tmpdir = $ENV{TMP}; +} else { + die "ERROR - \"TMPDIR\" & \"TMP\" environment variables not set\n"; +}; +die "ERROR - \"$tmpdir\" doesn't exist\n" if ( ! -d $tmpdir ); + +setcompiler(); + +# convert windows only? +$srs =~ s/\\/\//g; +$filename =~ s/\\/\//g; + +$filebase = $filename; +$filebase =~ s/.*[\\\/]//; +$filebase =~ s/\..*?$//; +# now stript it to something that doesn't togger vista execution prevention :( +$flbs = $filebase; +$flbs =~ s/[aeiou]//g; +# call srand ony once per script! +srand(); +$workfile = "$tmpdir/${flbs}_".$$.rand(); +#$workfile =~ s/setup/set_up/; + +# now get $workfile ready for shell usage... +$shell_workfile = $workfile; + +print "workfile: $workfile\n" if $verbose; + +#remove old objects which remained in place by a former bug +unlink "$workfile.obj"; + +# can't do this for modules with mixed case! +#$prjname =~ lc $prjname; + +if ( -f "$workfile.hid" ) +{ + unlink "$workfile.hid" or die "ERRROR - cannot remove $workfile.hid\n"; +} + +# hack to quit for files which cannot be handled +if ( defined $ENV{"NO_HID_FILES"} ) { + foreach $fname ( split / /, $ENV{"NO_HID_FILES"} ) + { + if ( $fname eq $filename ) + { + print "No hid generation for $filename due to NO_HID_FILES\n"; + print "Touching $srs/$filebase.hid anyways\n"; + open TOUCH, ">$srs/$filebase.hid" or die "ERRROR - cannot open $srs/$filebase.hid for writing\n"; + close TOUCH; + exit 0; + } + } +} + +#echo "perl5 -p -e "s/=[ \t]*\".*\"/=\"\"/go; s/\".*\"[ \t]*;/\"\" ;/go ; s/(\".*)\/\/(.*\")/$1\/\\\/$2/go ;" < %filename% > %srs%\%workfile%.c0" +#call perl5 -p -e "s/=[ \t]*\".*\"/=\"\"/go; s/\".*\"[ \t]*;/\"\" ;/go ; s/(\".*)\/\/(.*\")/$1\/\\\/$2/go ;" < %filename% > %srs%\%workfile%.c0 + +my $verboseSwitch = $verbose ? "-verbose" : ""; +print "$ENV{SOLARBINDIR}/hidc $verboseSwitch $filename ${shell_workfile}.c1 $prjname\n" if $verbose; +$ret = system "$ENV{SOLARBINDIR}/hidc $verboseSwitch $filename ${shell_workfile}.c1 $prjname"; +if ( $ret ) { + push @cleanuplist, ".c1"; + cleandie("ERROR - calling \"hidc\" failed"); +} +push @cleanuplist, ".c1"; + +print "$compiler $defs $solarincludes $preprocess_flag ${shell_workfile}.c1 > ${shell_workfile}.c2\n" if $verbose; +$ret = system "$compiler $defs $solarincludes $preprocess_flag ${shell_workfile}.c1 > ${shell_workfile}.c2"; +if ( $ret ) { + push @cleanuplist, ".c2"; + cleandie("ERROR - calling compiler for preprocessing failed"); +} +push @cleanuplist, ".c2"; + +if (!open C_PROG, ">$workfile.c") { + push @cleanuplist, ".c"; + cleandie("ERROR - open $workfile.c\n for writing failed"); +} +push @cleanuplist, ".c"; +print C_PROG "#include <stdio.h>\n"; +print C_PROG "#include <wctype.h>\n"; + +if ( !open PRE, "<$workfile.c2" ) { + cleandie("ERROR - open $workfile.c2\n for reading failed"); +} + +$InMain = 0; +while (<PRE>) +{ + if ( /int\s*main/ ) + { + $InMain = 1; + } + + if ( $InMain && !/^\s*$/ ) + { + print C_PROG; + } +} + +close PRE; +close C_PROG; + +#cl %SOLARINCLUDES% %_srs%\%_workfile%.c /Fe%_srs%\%_workfile%$appext +my $outobj_param = ""; +if ( $outobj_flag ne "" ) +{ + $outobj_param = "$outobj_flag${shell_workfile}$objext"; +} +print "$compiler $defs $solarincludes ${shell_workfile}.c $outobj_param $outbin_flag${shell_workfile}$appext \n" if $verbose; +$ret = system "$compiler $defs $solarincludes ${shell_workfile}.c $outobj_param $outbin_flag${shell_workfile}$appext"; +if ( $ret ) { + push @cleanuplist, "$appext"; + cleandie("ERROR - compiling $workfile.c failed"); +} +push @cleanuplist, "$objext"; +push @cleanuplist, "$appext"; + +#awk -f %ENV_TOOLS%\hidcode.awk < %srs%\%workfile%.c3 > %srs%\%workfile%.hid +if ( !open C3,"$workfile$appext|" ) { + cleandie("ERROR - executing $workfile$appext failed"); +} +if ( !open HID,">$srs/$filebase.hid.$ENV{INPATH}" ) { + cleandie("ERROR - open $srs/$filebase.hid.$ENV{INPATH} for writing failed"); +} + +while (<C3>) +{ + @fields = split /\s+/; + + if ( $fields[1] eq "HelpID" ) + { + print HID "$fields[0] $fields[2]\n"; + next; + } + + @arr = split /:/, $fields[0]; + if( $arr[1] =~ /^leer$|^bitmap$|^font$|^color$|^image$|^imagelist$|^date$|^brush$|^fixedtext$|^keycode$|^time$|^mapmode$/i ) + { + #print "skipping $arr[1]\n"; + next; + } + + if ( $fields[1] eq "Norm" ) + { + # Felder der Zeile auf Variable verteilen + $helpIDString = $fields[0]; + $GClass = lc($fields[2]); + $GID = $fields[3]; + $LClass = lc($fields[4]); + $LID = $fields[5] || 0; + + #print $LID + #print $LClass + #print $GID + #print $GClass + + $nHID=0; + + $VAL1 = 536870912; #2 hoch 29 + if ( $GClass eq "workwindow" ) { $nHID= $VAL1 *5; } + elsif( $GClass eq "modelessdialog" ) { $nHID= $VAL1 *4; } + elsif( $GClass eq "floatingwindow" ) { $nHID= $VAL1 *3; } + elsif( $GClass eq "modaldialog" ) { $nHID= $VAL1 *2; } + elsif( $GClass eq "tabpage" ) { $nHID= $VAL1 *1; } + elsif( $GClass eq "dockingwindow" ) { $nHID= $VAL1 *6; } + #Maximal bis 7 dann sind 32Bit ausgeschoepft + else { + $nHID=0; + $outline = "No GClass ".$helpIDString." ".$nHID." ".$GClass; + #print "$outline\n"; + next; + } + if( $LID != 0 ) { + if ( $LClass eq "tabcontrol" ) { $nHID += 0; } + elsif( $LClass eq "radiobutton" ) { $nHID += 2*256; } + elsif( $LClass eq "checkbox" ) { $nHID += 4*256; } + elsif( $LClass eq "tristatebox" ) { $nHID += 6*256; } + elsif( $LClass eq "edit" ) { $nHID += 8*256; } + elsif( $LClass eq "multilineedit" ) { $nHID += 10*256; } + elsif( $LClass eq "multilistbox" ) { $nHID += 12*256; } + elsif( $LClass eq "listbox" ) { $nHID += 14*256; } + elsif( $LClass eq "combobox" ) { $nHID += 16*256; } + elsif( $LClass eq "pushbutton" ) { $nHID += 18*256; } + elsif( $LClass eq "spinfield" ) { $nHID += 20*256; } + elsif( $LClass eq "patternfield" ) { $nHID += 22*256; } + elsif( $LClass eq "numericfield" ) { $nHID += 24*256; } + elsif( $LClass eq "metricfield" ) { $nHID += 26*256; } + elsif( $LClass eq "currencyfield" ) { $nHID += 28*256; } + elsif( $LClass eq "datefield" ) { $nHID += 30*256; } + elsif( $LClass eq "timefield" ) { $nHID += 32*256; } + elsif( $LClass eq "imageradiobutton" ) { $nHID += 34*256; } + elsif( $LClass eq "numericbox" ) { $nHID += 36*256; } + elsif( $LClass eq "metricbox" ) { $nHID += 38*256; } + elsif( $LClass eq "currencybox" ) { $nHID += 40*256; } + elsif( $LClass eq "datebox" ) { $nHID += 42*256; } + elsif( $LClass eq "timebox" ) { $nHID += 44*256; } + elsif( $LClass eq "imagebutton" ) { $nHID += 46*256; } + elsif( $LClass eq "menubutton" ) { $nHID += 48*256; } + elsif( $LClass eq "morebutton" ) { $nHID += 50*256; } + else { + $nHID=0; + $outline = "No LClass ".$helpIDString." ".$nHID; + #print "$outline\n"; + next; + } + + #GID und LID auch beruecksichtigen + $nHID += $LID; + } + $nHID += $GID * 16384; #14 Bit nach links shiften + + # check here and not above to avoid warnings for restypes not generated anyways + if( $GID == 0 || $GID >32767 || $LID > 511 ) + { + #GID & LID ungueltig + print STDERR "Invalid Global or Local ID: 0 < GID <= 32767 ; LID <= 511\n"; + print STDERR "$helpIDString GID = $GID; LID = $LID\n"; + next; + } + + # + # 1. Stelle selber ausgeben, falls groesser als 2^21 + # wg. problemen von awk/gawk bei printf mit %u + # + $x=0; + if( $nHID >= 4000000000 ) { + $nHID -= 4000000000; + $x=4; + }elsif( $nHID >= 3000000000) { + $nHID -= 3000000000; + $x=3; + }elsif( $nHID >= 2000000000) { + $nHID -= 2000000000; + $x=2; + } + if( $x != 0) + { printf HID "%s %d%u \n",$helpIDString,$x, $nHID; } + else + { printf HID "%s %u \n",$helpIDString, $nHID; } + } +} + +close C3; +close HID; + +rename("$srs/$filebase.hid.$ENV{INPATH}", "$srs/$filebase.hid") or cleandie("ERROR - couldn't rename tmp file to final for $filebase"); + +if ( not $debug ) { + foreach my $i (@cleanuplist) { + if ( -f "$workfile$i" ) { + unlink "$workfile$i" or cleandie(""); + } + } +} |