"Fossies" - the Fresh Open Source Software Archive

Member "install-tl-20200916/tlpkg/tlperl/site/lib/Win32/Shortcut.pm" (5 Apr 2016, 19070 Bytes) of package /windows/misc/install-tl.zip:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Perl source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file.

    1 package Win32::Shortcut;
    2 #######################################################################
    3 #
    4 # Win32::Shortcut - Perl Module for Shell Link Interface
    5 # ^^^^^^^^^^^^^^^
    6 # This module creates an object oriented interface to the Win32
    7 # Shell Links (IShellLink interface).
    8 #
    9 #######################################################################
   10 
   11 $VERSION = "0.08";
   12 
   13 require Exporter;
   14 require DynaLoader;
   15 
   16 @ISA= qw( Exporter DynaLoader );
   17 @EXPORT = qw(
   18     SW_SHOWMAXIMIZED
   19     SW_SHOWMINNOACTIVE
   20     SW_SHOWNORMAL
   21 );
   22 
   23 
   24 #######################################################################
   25 # This AUTOLOAD is used to 'autoload' constants from the constant()
   26 # XS function.  If a constant is not found then control is passed
   27 # to the AUTOLOAD in AutoLoader.
   28 #
   29 
   30 sub AUTOLOAD {
   31     my($constname);
   32     ($constname = $AUTOLOAD) =~ s/.*:://;
   33     #reset $! to zero to reset any current errors.
   34     local $!;
   35     my $val = constant($constname, @_ ? $_[0] : 0);
   36     if ($!) {
   37         my(undef, $file, $line) = caller;
   38         die "Win32::Shortcut::$constname is not defined, used at $file line $line.";
   39     }
   40     eval "sub $AUTOLOAD { $val }";
   41     goto &$AUTOLOAD;
   42 }
   43 
   44 
   45 #######################################################################
   46 # PUBLIC METHODS
   47 #
   48 
   49 #========
   50 sub new {
   51 #========
   52     my($class, $file) = @_;
   53     my($ilink, $ifile) = _Instance();
   54     return unless $ilink && $ifile;
   55 
   56     my $self = bless {
   57         ilink            => $ilink,
   58         ifile            => $ifile,
   59         File             => "",
   60         Path             => "",
   61         Arguments        => "",
   62         WorkingDirectory => "",
   63         Description      => "",
   64         ShowCmd          => 0,
   65         Hotkey           => 0,
   66         IconLocation     => "",
   67         IconNumber       => 0,
   68     };
   69 
   70 
   71     if ($file) {
   72     $self->{File} = $file;
   73     $self->Load($file);
   74     }
   75 
   76     return $self;
   77 }
   78 
   79 #=========
   80 sub Load {
   81 #=========
   82     my($self, $file) = @_;
   83     return undef unless ref($self);
   84   
   85     my $result = _Load($self->{'ilink'}, $self->{'ifile'}, $file);
   86 
   87     if ($result) {
   88   
   89         # fill the properties of $self
   90         $self->{'File'} = $file;
   91         $self->{'Path'} = _GetPath($self->{'ilink'}, $self->{'ifile'},0);
   92         $self->{'ShortPath'} = _GetPath($self->{'ilink'}, $self->{'ifile'},1);
   93         $self->{'Arguments'} = _GetArguments($self->{'ilink'}, $self->{'ifile'});
   94         $self->{'WorkingDirectory'} = _GetWorkingDirectory($self->{'ilink'}, $self->{'ifile'});
   95         $self->{'Description'} = _GetDescription($self->{'ilink'}, $self->{'ifile'});
   96         $self->{'ShowCmd'} = _GetShowCmd($self->{'ilink'}, $self->{'ifile'});
   97         $self->{'Hotkey'} = _GetHotkey($self->{'ilink'}, $self->{'ifile'});
   98         ($self->{'IconLocation'},
   99          $self->{'IconNumber'}) = _GetIconLocation($self->{'ilink'}, $self->{'ifile'});
  100     }
  101     return $result;
  102 }
  103 
  104 
  105 #========
  106 sub Set {
  107 #========
  108     my($self, $path, $arguments, $dir, $description, $show, $hotkey, 
  109        $iconlocation, $iconnumber) = @_;
  110     return undef unless ref($self);
  111 
  112     $self->{'Path'}             = $path;
  113     $self->{'Arguments'}        = $arguments;
  114     $self->{'WorkingDirectory'} = $dir;
  115     $self->{'Description'}      = $description;
  116     $self->{'ShowCmd'}          = $show;
  117     $self->{'Hotkey'}           = $hotkey;
  118     $self->{'IconLocation'}     = $iconlocation;
  119     $self->{'IconNumber'}       = $iconnumber;
  120     return 1;
  121 }
  122 
  123 
  124 #=========
  125 sub Save {
  126 #=========
  127     my($self, $file) = @_;
  128     return unless ref($self);
  129 
  130     $file = $self->{'File'} unless $file;
  131     return unless $file;
  132 
  133     require Win32 unless defined &Win32::GetFullPathName;
  134     $file = Win32::GetFullPathName($file);
  135 
  136     _SetPath($self->{'ilink'}, $self->{'ifile'}, $self->{'Path'});
  137     _SetArguments($self->{'ilink'}, $self->{'ifile'}, $self->{'Arguments'});
  138     _SetWorkingDirectory($self->{'ilink'}, $self->{'ifile'}, $self->{'WorkingDirectory'});
  139     _SetDescription($self->{'ilink'}, $self->{'ifile'}, $self->{'Description'});
  140     _SetShowCmd($self->{'ilink'}, $self->{'ifile'}, $self->{'ShowCmd'});
  141     _SetHotkey($self->{'ilink'}, $self->{'ifile'}, $self->{'Hotkey'});
  142     _SetIconLocation($self->{'ilink'}, $self->{'ifile'},
  143                      $self->{'IconLocation'}, $self->{'IconNumber'});
  144 
  145     my $result = _Save($self->{'ilink'}, $self->{'ifile'}, $file);
  146     if ($result) {
  147     $self->{'File'} = $file unless $self->{'File'};
  148     }
  149     return $result;
  150 }
  151 
  152 #============
  153 sub Resolve {
  154 #============
  155     my($self, $flags) = @_;
  156     return undef unless ref($self);
  157     $flags = 1 unless defined($flags);
  158     my $result = _Resolve($self->{'ilink'}, $self->{'ifile'}, $flags);
  159     return $result;
  160 }
  161 
  162 
  163 #==========
  164 sub Close {
  165 #==========
  166     my($self) = @_;
  167     return undef unless ref($self);
  168 
  169     my $result = _Release($self->{'ilink'}, $self->{'ifile'});
  170     $self->{'released'} = 1;
  171     return $result;
  172 }
  173 
  174 #=========
  175 sub Path {
  176 #=========
  177     my($self, $value) = @_;
  178     return undef unless ref($self);
  179 
  180     if(not defined($value)) {
  181         return $self->{'Path'};
  182     } else {
  183         $self->{'Path'} = $value;
  184     }
  185     return $self->{'Path'};
  186 }
  187 
  188 #==============
  189 sub ShortPath {
  190 #==============
  191     my($self) = @_;
  192     return undef unless ref($self);
  193     return $self->{'ShortPath'};
  194 }
  195 
  196 #==============
  197 sub Arguments {
  198 #==============
  199     my($self, $value) = @_;
  200     return undef unless ref($self);
  201 
  202     if(not defined($value)) {
  203         return $self->{'Arguments'};
  204     } else {
  205         $self->{'Arguments'} = $value;
  206     }
  207     return $self->{'Arguments'};
  208 }
  209 
  210 #=====================
  211 sub WorkingDirectory {
  212 #=====================
  213     my($self, $value) = @_;
  214     return undef unless ref($self);
  215 
  216     if(not defined($value)) {
  217         return $self->{'WorkingDirectory'};
  218     } else {
  219         $self->{'WorkingDirectory'} = $value;
  220     }
  221     return $self->{'WorkingDirectory'};
  222 }
  223 
  224 
  225 #================
  226 sub Description {
  227 #================
  228     my($self, $value) = @_;
  229     return undef unless ref($self);
  230 
  231     if(not defined($value)) {
  232         return $self->{'Description'};
  233     } else {
  234         $self->{'Description'} = $value;
  235     }
  236     return $self->{'Description'};
  237 }
  238 
  239 #============
  240 sub ShowCmd {
  241 #============
  242     my($self, $value) = @_;
  243     return undef unless ref($self);
  244 
  245     if(not defined($value)) {
  246         return $self->{'ShowCmd'};
  247     } else {
  248         $self->{'ShowCmd'} = $value;
  249     }
  250     return $self->{'ShowCmd'};
  251 }
  252 
  253 #===========
  254 sub Hotkey {
  255 #===========
  256     my($self, $value) = @_;
  257     return undef unless ref($self);
  258 
  259     if(not defined($value)) {
  260         return $self->{'Hotkey'};
  261     } else {
  262         $self->{'Hotkey'} = $value;
  263     }
  264     return $self->{'Hotkey'};
  265 }
  266 
  267 #=================
  268 sub IconLocation {
  269 #=================
  270     my($self, $value) = @_;
  271     return undef unless ref($self);
  272 
  273     if(not defined($value)) {
  274         return $self->{'IconLocation'};
  275     } else {
  276         $self->{'IconLocation'} = $value;
  277     }
  278     return $self->{'IconLocation'};
  279 }
  280 
  281 #===============
  282 sub IconNumber {
  283 #===============
  284     my($self, $value) = @_;
  285     return undef unless ref($self);
  286 
  287     if(not defined($value)) {
  288         return $self->{'IconNumber'};
  289     } else {
  290         $self->{'IconNumber'} = $value;
  291     }
  292     return $self->{'IconNumber'};
  293 }
  294 
  295 #============
  296 sub Version {
  297 #============
  298     # [dada] to get rid of the "used only once" warning...
  299     return $VERSION;
  300 }
  301 
  302 
  303 #######################################################################
  304 # PRIVATE METHODS
  305 #
  306 
  307 #============
  308 sub DESTROY {
  309 #============
  310     my($self) = @_;
  311 
  312     if (not $self->{'released'}) {
  313         _Release($self->{'ilink'}, $self->{'ifile'});
  314     $self->{'released'} = 1;
  315     }
  316 }
  317 
  318 bootstrap Win32::Shortcut;
  319 
  320 1;
  321 
  322 __END__
  323 
  324 =head1 NAME
  325 
  326 Win32::Shortcut - Perl Module to deal with Windows Shortcuts
  327 
  328 =head1 SYNOPSIS
  329 
  330 This module implements the Win32 IShellLink Interface to allow
  331 management of shortcut files from Perl.
  332 
  333   use Win32::Shortcut;
  334 
  335   $LINK = Win32::Shortcut->new();
  336   $LINK->{'Path'} = "C:\\Directory\\Target.exe";
  337   $LINK->{'Description'} = "Target executable";
  338   $LINK->Save("Target.lnk");
  339   $LINK->Close();
  340 
  341 =head1 REFERENCE
  342 
  343 =head2 General Usage
  344 
  345 To use this module, first add the following line at the beginning of
  346 your script:
  347 
  348   use Win32::Shortcut;
  349 
  350 Then, use this command to create a shortcut object:
  351 
  352   $LINK = Win32::Shortcut->new();
  353 
  354 This function will create a C<$LINK> object on which you can apply the
  355 Methods and Properties explained later.
  356 
  357 The object is not yet a shortcut file; it is just the definition of a
  358 shortcut. Basically, you can do 2 things:
  359 
  360 =over
  361 
  362 =item 1. Load a shortcut file into the object.
  363 
  364 =item 2. Save the object into a shortcut file.
  365 
  366 =back
  367 
  368 For the rest, the object can be accessed as it were a normal
  369 associative array reference. It has the following keys (here referred
  370 as properties):
  371 
  372   $LINK->{'File'}
  373   $LINK->{'Path'}               $LINK->Path()
  374   $LINK->{'ShortPath'}
  375   $LINK->{'WorkingDirectory'}   $LINK->WorkingDirectory()
  376   $LINK->{'Arguments'}          $LINK->Arguments()
  377   $LINK->{'Description'}        $LINK->Description()
  378   $LINK->{'ShowCmd'}            $LINK->ShowCmd()
  379   $LINK->{'Hotkey'}             $LINK->Hotkey()
  380   $LINK->{'IconLocation'}       $LINK->IconLocation()
  381   $LINK->{'IconNumber'}         $LINK->IconNumber()
  382 
  383 Thus, assuming you have a shortcut file named C<test.lnk> in your
  384 current directory, this simple script will tell you where this shortcut
  385 points to:
  386 
  387   use Win32::Shortcut;
  388   $LINK = Win32::Shortcut->new();
  389   $LINK->Load("test.lnk");
  390   print "Shortcut to: $LINK->{'Path'} $LINK->{'Arguments'} \n";
  391   $LINK->Close();
  392 
  393 But you can also modify its values:
  394 
  395   use Win32::Shortcut;
  396   $LINK = Win32::Shortcut->new();
  397   $LINK->Load("test.lnk");
  398   $LINK->{'Path'} =~ s/C:/D:/i;   # move the target from C: to D:
  399   $LINK->{'ShowCmd'} = SW_NORMAL; # runs in a normal window
  400 
  401 and then you can save your changes to the shortcut file with this
  402 command:
  403 
  404   $LINK->Save();
  405   $LINK->Close();
  406 
  407 or you can save it with another name, creating a new shortcut file:
  408 
  409   $LINK->Save("test2.lnk");
  410   $LINK->Close();
  411 
  412 Finally, you can create a completely new shortcut:
  413 
  414   $LINK = Win32::Shortcut->new();
  415   $LINK->{'Path'} = "C:\\PERL5\\BIN\\PERL.EXE";
  416   $LINK->{'Arguments'} = "-v";
  417   $LINK->{'WorkingDirectory'} = "C:\PERL5\\BIN";
  418   $LINK->{'Description'} = "Prints out the version of Perl";
  419   $LINK->{'ShowCmd'} = SW_SHOWMAXIMIZED;
  420   $LINK->Save("Perl Version Info.lnk");
  421   $LINK->Close();
  422 
  423 Note also that in the examples above the two lines:
  424 
  425   $LINK = Win32::Shortcut->new();
  426   $LINK->Load("test.lnk");
  427 
  428 can be collapsed to:
  429 
  430   $LINK = Win32::Shortcut->new("test.lnk");
  431 
  432 
  433 =head2 Methods
  434 
  435 =over
  436 
  437 =item B<Close>
  438 
  439 Closes a shortcut object. Note that it is not "strictly" required to
  440 close the objects you created, since the Win32::Shortcut objects are
  441 automatically closed when the program ends (or when you somehow destroy
  442 such an object).
  443 
  444 Note also that a shortcut is not automatically saved when it is closed,
  445 even if you modified it. You have to call Save in order to apply
  446 modifications to a shortcut file.
  447 
  448 Example:
  449 
  450   $LINK->Close();
  451 
  452 =item B<Load> I<file>
  453 
  454 Loads the content of the shortcut file named I<file> in a shortcut
  455 object and fill the properties of the object with its values. Will
  456 return B<undef> on errors, or a true value if everything was
  457 successful.
  458 
  459 Example:
  460 
  461   $LINK->Load("test.lnk") or print "test.lnk not found!";
  462 
  463   print join("\n", $LINK->Path,
  464                    $LINK->ShortPath,
  465                    $LINK->Arguments,
  466                    $LINK->WorkingDirectory,
  467                    $LINK->Description,
  468                    $LINK->ShowCmd,
  469                    $LINK->Hotkey,
  470                    $LINK->IconLocation,
  471                    $LINK->IconNumber);
  472   }
  473 
  474 =item B<new Win32::Shortcut> I<[file]>
  475 
  476 Creates a new shortcut object. If a filename is passed in I<file>,
  477 automatically Loads this file also. Returns the object created or
  478 B<undef> on errors.
  479 
  480 Example:
  481 
  482   $LINK = Win32::Shortcut->new();
  483 
  484   $RegEdit = Win32::Shortcut->new("Registry Editor.lnk");
  485   die "File not found" if not $RegEdit;
  486 
  487 =item B<Resolve> I<[flag]>
  488 
  489 Attempts to automatically resolve a shortcut and returns the resolved
  490 path, or B<undef> on errors; in case no resolution was made, the path
  491 is returned unchanged. Note that the path is automatically updated in
  492 the Path property of the shortcut.
  493 
  494 By default this method acts quietly, but if you pass a value of 0
  495 (zero) in the I<flag> parameter, it will eventually post a dialog box
  496 prompting the user for more information.
  497 
  498 Example:
  499 
  500   # if the target doesn't exist...
  501   if(! -f $LINK->Path) {
  502     # save the actual target for comparison
  503     $oldpath = $LINK->Path;
  504 
  505     # try to resolve it (with dialog box)
  506     $newpath = $LINK->Resolve(0);
  507 
  508     die "Not resolved..." if $newpath == $oldpath;
  509   }
  510 
  511 =item B<Save> I<[file]>
  512 
  513 Saves the content of the shortcut object into the file named I<file>.
  514 If I<file> is omitted, it is taken from the File property of the object
  515 (which, if not changed, is the name of the last Loaded file).
  516 
  517 If no file was loaded and the File property doesn't contain a valid
  518 filename, the method will return B<undef>, which will also be returned
  519 on errors. A true value will be returned if everything was successful.
  520 
  521 Example:
  522 
  523  $LINK->Save();
  524  $LINK->Save("Copy of " . $LINK->{'File'});
  525 
  526 =item B<Set> I<path, arguments, workingdirectory, description, showcmd,
  527 hotkey, iconlocation, iconnumber>
  528 
  529 Sets all the properties of the shortcut object with a single command.
  530 This method is supplied for convenience only, you can also set those
  531 values changing the values of the properties.
  532 
  533 Example:
  534 
  535   $LINK->Set("C:\\PERL5\\BIN\\PERL.EXE",
  536              "-v",
  537              "C:\\PERL5\\BIN",
  538              "Prints out the version of Perl",
  539              SW_SHOWMAXIMIZED,
  540              hex('0x0337'),
  541              "C:\\WINDOWS\\SYSTEM\\COOL.DLL",
  542              1);
  543 
  544   # it is the same of...
  545   $LINK->Path("C:\\PERL5\\BIN\\PERL.EXE");
  546   $LINK->Arguments("-v");
  547   $LINK->WorkingDirectory("C:\\PERL5\\BIN");
  548   $LINK->Description("Prints out the version of Perl");
  549   $LINK->ShowCmd(SW_SHOWMAXIMIZED);
  550   $LINK->Hotkey(hex('0x0337'));
  551   $LINK->IconLocation("C:\\WINDOWS\\SYSTEM\\COOL.DLL");
  552   $LINK->IconNumber(1);
  553 
  554 =back
  555 
  556 =head2 Properties
  557 
  558 The properties of a shortcut object can be accessed as:
  559 
  560   $OBJECT->{'property'}
  561 
  562 Eg., assuming that you have created a shortcut object with:
  563 
  564   $LINK=new Win32::Shortcut();
  565 
  566 you can for example see its description with:
  567 
  568   print $LINK->{'Description'};
  569 
  570 You can of course also set it:
  571 
  572   $LINK->{'Description'}="This is a description";
  573 
  574 From version 0.02, those properties have also a corresponding method
  575 (subroutine), so you can write the 2 lines above using this syntax too:
  576 
  577   print $LINK->Description;
  578   $LINK->Description("This is a description");
  579 
  580 The properties of a shortcut reflect the content of the Shortcut
  581 Properties Dialog Box, which can be obtained by clicking the third
  582 mouse button on a shortcut file in the Windows 95 (or NT 4.0) Explorer
  583 and choosing "Properties" (well, I hope you already knew :).
  584 
  585 The fields corresponding to the single properties are marked in B<bold>
  586 in the following list.
  587 
  588 =over
  589 
  590 =item B<Arguments>
  591 
  592 The arguments associated with the shell link object. They will be
  593 passed to the targeted program (see Path) when it gets executed. In
  594 fact, joined with Path, this parameter forms the "B<Target>" field of a
  595 Shortcut Properties Dialog Box.
  596 
  597 =item B<Description>
  598 
  599 An optional description given to the shortcut. Seems to be missing in
  600 the Shortcut Properties Dialog Box (not yet implemented?).
  601 
  602 =item B<File>
  603 
  604 The filename of the shortcut file opened with Load, and/or the filename
  605 under which the shortcut will be saved with Save (if the I<file>
  606 argument is not specified).
  607 
  608 =item B<Hotkey>
  609 
  610 The hotkey associated to the shortcut, in the form of a 2-byte number
  611 of which the first byte identifies the modifiers (Ctrl, Alt, Shift...
  612 but I didn't find out how it works) and the second is the ASCII code of
  613 the character key. Correspond to the "B<Shortcut key>" field of a
  614 Shortcut Properties Dialog Box.
  615 
  616 =item B<IconLocation>
  617 
  618 The file that contain the icon for the shortcut. Seems actually to
  619 always return nothing (YMMV, I hope...).
  620 
  621 =item B<IconNumber>
  622 
  623 The number of the icon for the shortcut in the file pointed by
  624 IconLocation, in case more that one icon is contained in that file (I
  625 suppose this, documentation isn't so clear at this point).
  626 
  627 =item B<Path>
  628 
  629 The target of the shortcut. This is (joined with Arguments) the content
  630 of the "B<Target>" field in a Shortcut Properties Dialog Box.
  631 
  632 =item B<ShortPath>
  633 
  634 Same as Path, but expressed in a DOS-readable format (8.3 characters
  635 filenames). It is available as read-only (well, you can change it, but
  636 it has no effect on the shortcut; change Path instead) once you Load a
  637 shortcut file.
  638 
  639 =item B<ShowCmd>
  640 
  641 The condition of the window in which the program will be executed (can
  642 be Normal, Minimized or Maximized). Correspond to the "B<Run>" field of
  643 a Shortcut Properties Dialog Box.
  644 
  645 Allowed values are:
  646 
  647 B<Value>    B<Meaning>       B<Constant>
  648 
  649    1     Normal Window SW_SHOWNORMAL
  650    3     Maximized     SW_SHOWMAXIMIZED
  651    7     Minimized     SW_SHOWMINNOACTIVE
  652 
  653 Any other value (theoretically should) result in a Normal Window
  654 display.
  655 
  656 =item B<WorkingDirectory>
  657 
  658 The directory in which the targeted program will be executed.
  659 Correspond to the "B<Start in>" field of a Shortcut Properties Dialog
  660 Box.
  661 
  662 =back
  663 
  664 =head2 Constants
  665 
  666 The following constants are exported in the main namespace of your
  667 script using Win32::Shortcut:
  668 
  669 =over
  670 
  671 =item * SW_SHOWNORMAL
  672 
  673 =item * SW_SHOWMAXIMIZED
  674 
  675 =item * SW_SHOWMINNOACTIVE
  676 
  677 =back
  678 
  679 Those constants are the allowed values for the ShowCmd property.
  680 
  681 
  682 
  683 =head1 VERSION HISTORY
  684 
  685 B<0.03 (07 Apr 1997)>
  686 
  687 =over
  688 
  689 =item * The PLL file now comes in 2 versions, one for Perl version
  690 5.001 (build 110) and one for Perl version 5.003 (build 300 and higher,
  691 EXCEPT 304).
  692 
  693 =item * Added an installation program which will automatically copy the
  694 right files in the right place.
  695 
  696 =back
  697 
  698 B<0.02 (21 Jan 1997)>
  699 
  700 =over
  701 
  702 =item * Added methods matching properties to reduce typing overhead
  703 (eg. Alt-123 and 125...).
  704 
  705 =back
  706 
  707 B<0.01 (15 Jan 1997)>
  708 
  709 =over
  710 
  711 =item *
  712 
  713 First public release.
  714 
  715 =item *
  716 
  717 Added "Set" and "Resolve" and the properties "Hotkey", "IconLocation"
  718 and "IconNumber".
  719 
  720 =back
  721 
  722 B<0.01a (10 Jan 1997)>
  723 
  724 =over
  725 
  726 =item *
  727 
  728 First implementation of the IShellLink interface (wow, it works!); can
  729 "Load", "Save", and modify properties of shortcut files.
  730 
  731 =back
  732 
  733 =head1 AUTHOR
  734 
  735 Aldo Calpini L<dada@perl.it>
  736 
  737 Distributed under the terms of Larry Wall's Artistic License.
  738 
  739 =head1 CREDITS
  740 
  741 Thanks to: Jesse Dougherty, Dave Roth, ActiveWare, and the
  742 Perl-Win32-Users community.
  743 
  744 =head1 DISCLAIMER
  745 
  746 I<This program is FREE; you can redistribute, modify, disassemble, or
  747 even reverse engineer this software at your will. Keep in mind,
  748 however, that NOTHING IS GUARANTEED to work and everything you do is AT
  749 YOUR OWN RISK - I will not take responsibility for any damage, loss of
  750 money and/or health that may arise from the use of this program!>
  751 
  752 =cut