Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 1 | package output; |
| 2 | |
| 3 | use strict; |
| 4 | |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 5 | use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); |
| 6 | require Exporter; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 7 | |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 8 | @ISA = qw(Exporter); |
| 9 | @EXPORT = qw(); |
| 10 | @EXPORT_OK = qw($output); |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 11 | |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 12 | use vars qw($output); |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 13 | |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 14 | $output = '_output'->new; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 15 | |
| 16 | package _output; |
| 17 | |
| 18 | use strict; |
| 19 | |
Patrik Stridvall | bda5074 | 2001-07-14 00:48:41 +0000 | [diff] [blame] | 20 | my $stdout_isatty = -t STDOUT; |
| 21 | my $stderr_isatty = -t STDERR; |
| 22 | |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 23 | sub new { |
| 24 | my $proto = shift; |
| 25 | my $class = ref($proto) || $proto; |
| 26 | my $self = {}; |
| 27 | bless ($self, $class); |
| 28 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 29 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 30 | my $progress = \${$self->{PROGRESS}}; |
| 31 | my $last_progress = \${$self->{LAST_PROGRESS}}; |
Patrik Stridvall | d07a646 | 2001-07-18 20:09:12 +0000 | [diff] [blame] | 32 | my $last_time = \${$self->{LAST_TIME}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 33 | my $progress_count = \${$self->{PROGRESS_COUNT}}; |
| 34 | my $prefix = \${$self->{PREFIX}}; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 35 | my $prefix_callback = \${$self->{PREFIX_CALLBACK}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 36 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 37 | $$progress_enabled = 1; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 38 | $$progress = ""; |
| 39 | $$last_progress = ""; |
Patrik Stridvall | d07a646 | 2001-07-18 20:09:12 +0000 | [diff] [blame] | 40 | $$last_time = 0; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 41 | $$progress_count = 0; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 42 | $$prefix = undef; |
| 43 | $$prefix_callback = undef; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 44 | |
| 45 | return $self; |
| 46 | } |
| 47 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 48 | sub DESTROY { |
| 49 | my $self = shift; |
| 50 | |
| 51 | $self->hide_progress; |
| 52 | } |
| 53 | |
| 54 | sub enable_progress { |
| 55 | my $self = shift; |
| 56 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
| 57 | |
| 58 | $$progress_enabled = 1; |
| 59 | } |
| 60 | |
| 61 | sub disable_progress { |
| 62 | my $self = shift; |
| 63 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
| 64 | |
| 65 | $$progress_enabled = 0; |
| 66 | } |
| 67 | |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 68 | sub show_progress { |
| 69 | my $self = shift; |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 70 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 71 | my $progress = \${$self->{PROGRESS}}; |
| 72 | my $last_progress = \${$self->{LAST_PROGRESS}}; |
| 73 | my $progress_count = \${$self->{PROGRESS_COUNT}}; |
| 74 | |
| 75 | $$progress_count++; |
| 76 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 77 | if($$progress_enabled) { |
| 78 | if($$progress_count > 0 && $$progress && $stderr_isatty) { |
| 79 | print STDERR $$progress; |
| 80 | $$last_progress = $$progress; |
| 81 | } |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 82 | } |
| 83 | } |
| 84 | |
| 85 | sub hide_progress { |
| 86 | my $self = shift; |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 87 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 88 | my $progress = \${$self->{PROGRESS}}; |
| 89 | my $last_progress = \${$self->{LAST_PROGRESS}}; |
| 90 | my $progress_count = \${$self->{PROGRESS_COUNT}}; |
| 91 | |
| 92 | $$progress_count--; |
| 93 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 94 | if($$progress_enabled) { |
| 95 | if($$last_progress && $stderr_isatty) { |
| 96 | my $message; |
| 97 | for (1..length($$last_progress)) { |
| 98 | $message .= " "; |
| 99 | } |
| 100 | print STDERR $message; |
| 101 | undef $$last_progress; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 102 | } |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 103 | } |
| 104 | } |
| 105 | |
| 106 | sub update_progress { |
| 107 | my $self = shift; |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 108 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 109 | my $progress = \${$self->{PROGRESS}}; |
| 110 | my $last_progress = \${$self->{LAST_PROGRESS}}; |
| 111 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 112 | if($$progress_enabled) { |
| 113 | my $prefix = ""; |
| 114 | my $suffix = ""; |
| 115 | if($$last_progress) { |
| 116 | for (1..length($$last_progress)) { |
| 117 | $prefix .= ""; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 118 | } |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 119 | |
| 120 | my $diff = length($$last_progress)-length($$progress); |
| 121 | if($diff > 0) { |
| 122 | for (1..$diff) { |
| 123 | $suffix .= " "; |
| 124 | } |
| 125 | for (1..$diff) { |
| 126 | $suffix .= ""; |
| 127 | } |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 128 | } |
| 129 | } |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 130 | print STDERR $prefix . $$progress . $suffix; |
| 131 | $$last_progress = $$progress; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 132 | } |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 133 | } |
| 134 | |
| 135 | sub progress { |
| 136 | my $self = shift; |
| 137 | my $progress = \${$self->{PROGRESS}}; |
Patrik Stridvall | d07a646 | 2001-07-18 20:09:12 +0000 | [diff] [blame] | 138 | my $last_time = \${$self->{LAST_TIME}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 139 | |
Patrik Stridvall | d171a55 | 2001-09-10 23:16:05 +0000 | [diff] [blame^] | 140 | my $new_progress = shift; |
| 141 | if(defined($new_progress)) { |
| 142 | if(!defined($$progress) || $new_progress ne $$progress) { |
| 143 | $$progress = $new_progress; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 144 | |
Patrik Stridvall | d171a55 | 2001-09-10 23:16:05 +0000 | [diff] [blame^] | 145 | $self->update_progress; |
| 146 | $$last_time = 0; |
| 147 | } |
| 148 | } else { |
| 149 | return $$progress; |
| 150 | } |
Patrik Stridvall | d07a646 | 2001-07-18 20:09:12 +0000 | [diff] [blame] | 151 | } |
| 152 | |
| 153 | sub lazy_progress { |
| 154 | my $self = shift; |
| 155 | my $progress = \${$self->{PROGRESS}}; |
| 156 | my $last_time = \${$self->{LAST_TIME}}; |
| 157 | |
| 158 | $$progress = shift; |
| 159 | |
| 160 | my $time = time(); |
| 161 | if($time - $$last_time > 0) { |
| 162 | $self->update_progress; |
| 163 | $$last_time = $time; |
| 164 | } |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 165 | } |
| 166 | |
| 167 | sub prefix { |
| 168 | my $self = shift; |
| 169 | my $prefix = \${$self->{PREFIX}}; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 170 | my $prefix_callback = \${$self->{PREFIX_CALLBACK}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 171 | |
Patrik Stridvall | aeb023f | 2001-08-22 18:09:15 +0000 | [diff] [blame] | 172 | my $new_prefix = shift; |
| 173 | if(defined($new_prefix)) { |
Patrik Stridvall | d171a55 | 2001-09-10 23:16:05 +0000 | [diff] [blame^] | 174 | if(!defined($$prefix) || $new_prefix ne $$prefix) { |
| 175 | $$prefix = $new_prefix; |
| 176 | $$prefix_callback = undef; |
| 177 | } |
Patrik Stridvall | aeb023f | 2001-08-22 18:09:15 +0000 | [diff] [blame] | 178 | } else { |
| 179 | return $$prefix; |
| 180 | } |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 181 | } |
| 182 | |
| 183 | sub prefix_callback { |
| 184 | my $self = shift; |
| 185 | |
| 186 | my $prefix = \${$self->{PREFIX}}; |
| 187 | my $prefix_callback = \${$self->{PREFIX_CALLBACK}}; |
| 188 | |
| 189 | $$prefix = undef; |
| 190 | $$prefix_callback = shift; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 191 | } |
| 192 | |
| 193 | sub write { |
| 194 | my $self = shift; |
| 195 | |
| 196 | my $message = shift; |
| 197 | |
| 198 | my $prefix = \${$self->{PREFIX}}; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 199 | my $prefix_callback = \${$self->{PREFIX_CALLBACK}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 200 | |
Patrik Stridvall | bda5074 | 2001-07-14 00:48:41 +0000 | [diff] [blame] | 201 | $self->hide_progress if $stdout_isatty; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 202 | if(defined($$prefix)) { |
| 203 | print $$prefix . $message; |
| 204 | } elsif(defined($$prefix_callback)) { |
| 205 | print &{$$prefix_callback}() . $message; |
| 206 | } else { |
| 207 | print $message; |
| 208 | } |
Patrik Stridvall | bda5074 | 2001-07-14 00:48:41 +0000 | [diff] [blame] | 209 | $self->show_progress if $stdout_isatty; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 210 | } |
| 211 | |
| 212 | 1; |