File: slice_pass3.pl

package info (click to toggle)
slice 1.3.2-3
  • links: PTS
  • area: main
  • in suites: hamm, slink
  • size: 724 kB
  • ctags: 472
  • sloc: perl: 3,335; ansic: 3,054; sh: 437; makefile: 248; yacc: 105
file content (96 lines) | stat: -rw-r--r-- 2,788 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
##
##  slice_pass3.pl -- Pass 3
##  Copyright (c) 1997,1998 Ralf S. Engelschall. 
##

package main;

##
##
##  Pass 3: Output generation
##
##

sub pass3 {
    my ($CFG) = @_;

    my ($slice, $outfile, $chmod, $out);
    my ($set, $cmds, $var);
    my ($start, $min, $max);
    my ($entry);

    &verbose("\nPass 3: Output generation\n\n");

    foreach $entry (@{$CFG->{OPT}->{O}}) {

        #   determine parameters
        if ($entry =~ m|^([A-Z0-9~!+u*n\-\\^x()@]+):(.+)@(.+)$|) {
            # full syntax
            ($slice, $outfile, $chmod) = ($1, $2, $3);
        }
        elsif ($entry =~ m|^([_A-Z0-9~!+u*n\-\\^x()@]+):(.+)$|) {
            # only slice and file
            ($slice, $outfile, $chmod) = ($1, $2, '');
        }
        elsif ($entry =~ m|^([^@]+)@(.+)$|) {
            # only file and chmod
            ($slice, $outfile, $chmod) = ('ALL', $1, $2);
        }
        else {
            # only file 
            ($slice, $outfile, $chmod) = ('ALL', $entry, '');
        }
        &verbose("    file `$outfile': sliceterm='$slice', chmodopts='$chmod'\n");

        #   open output file
        if ($outfile eq '-') {
            $out = new IO::Handle;
            $out->fdopen(fileno(STDOUT), 'w');
        }
        else {
            $out = new IO::File;
            $out->open(">$outfile");
        }

        #   now when there is plain data cut out the slices
        if (length($CFG->{INPUT}->{PLAIN}) > 0) {
            #   parse the sliceterm and create corresponding
            #   Perl 5 statement containing Bit::Vector calls
            ($cmds, $var) = SliceTerm::Parse($slice);
    
            #   just debugging...
            if ($CFG->{OPT}->{X}) {
                &verbose("        calculated Perl 5 set term:\n");
                &verbose("        ----\n");
                my $x = $cmds; 
                $x =~ s|\n+$||;
                $x =~ s|\n|\n        |g;
                &verbose("        $x\n");
                &verbose("        ----\n");
            }
    
            #   now evaluate the Bit::Vector statements
            #   and move result to $set
            eval "$cmds; \$set = $var";
    
            #   now scan the set and write out characters
            #   which have a corresponding bit set.
            $start = 0;
            while (($start < $set->Size()) &&
                   (($min, $max) = $set->Interval_Scan_inc($start))) {
                $out->print(substr($CFG->{INPUT}->{PLAIN}, $min, ($max-$min+1)));
                $start = $max + 2;
            }
        }

        #   close outputfile
        $out->close;

        #   additionally run chmod on the output file
        if ($outfile ne '-' and $chmod ne '' and -f $outfile) {
            system("chmod $chmod $outfile");
        }
    }
}

1;