On Mon, 19 Mar 2001 15:29:14 -0500, Ronald J Kimball wrote:

>I think adding a line to your code should fix this bug:
>
>#!perl
>use Mac::LowMem;
>
>$lmh = LMGetScrapHandle;
>$str = $lmh->get;
>
># diagnostics...
>     #print "$str\n\n";
>     #@l = split(//, $str);
>     #foreach (@l) {print ord($_), '|'}; print "\n\n";
>
>while(length $str) {
>     $key = substr($str, 0, 4);
>         print $key, "/";
>     $num   = substr($str, 4, 4);
>     $len = unpack("L", $num);
>         print "$len\n";
>         print substr($str, 8, $len), "\n";
>
>     $len % 2 and $len++;
>     # skip the extra padding byte when $len is odd
>
>     $str = substr($str, 8+$len);
>        #print $str, "\n";
>}

Damn, you guys beat me to it. Ok, here's how I would have done it. Note
that the functionality is the same.

    #!perl
    use Data::Dumper; $Data::Dumper::Useqq = 1;  # diagnostics
    use Mac::LowMem;

    {
        my $lmh = LMGetScrapHandle;
        $_ = $lmh->get;
    } # does this release the clipboard? I hope so...
        
    print Dumper $_;

    while(length) {
        my($key, $len) = unpack 'a4N', $_;  # Mac is Big Endian
        (my $data, $_) = unpack "x8a${len}x@{[$len & 1]}a*", $_;
        print Dumper $key, $len, $data;
    }


A hash, anyone?

    #!perl
    use Data::Dumper; $Data::Dumper::Useqq = 1;  # diagnostics

    print Dumper scalar get_clipboard();

    sub get_clipboard {
        use Mac::LowMem;
        local $_ = do {
            my $lmh = LMGetScrapHandle;
            $lmh->get;
         };
         my %data;
         while(length) {
             my($key, $len) = unpack 'a4N', $_;
             ($data{$key}, $_) = unpack "x8a${len}x@{[$len & 1]}a*", $_;
         }
         return wantarray?%data:\%data;
    }

-- 
        Bart.

Reply via email to