Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 1 | # |
| 2 | # Copyright 1999, 2000, 2001 Patrik Stridvall |
| 3 | # |
| 4 | # This library is free software; you can redistribute it and/or |
| 5 | # modify it under the terms of the GNU Lesser General Public |
| 6 | # License as published by the Free Software Foundation; either |
| 7 | # version 2.1 of the License, or (at your option) any later version. |
| 8 | # |
| 9 | # This library is distributed in the hope that it will be useful, |
| 10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 | # Lesser General Public License for more details. |
| 13 | # |
| 14 | # You should have received a copy of the GNU Lesser General Public |
| 15 | # License along with this library; if not, write to the Free Software |
Jonathan Ernst | 360a3f9 | 2006-05-18 14:49:52 +0200 | [diff] [blame] | 16 | # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 17 | # |
| 18 | |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 19 | package output; |
| 20 | |
| 21 | use strict; |
| 22 | |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 23 | use vars qw($VERSION @ISA @EXPORT @EXPORT_OK); |
| 24 | require Exporter; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 25 | |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 26 | @ISA = qw(Exporter); |
| 27 | @EXPORT = qw(); |
| 28 | @EXPORT_OK = qw($output); |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 29 | |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 30 | use vars qw($output); |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 31 | |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 32 | $output = '_output'->new; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 33 | |
| 34 | package _output; |
| 35 | |
| 36 | use strict; |
| 37 | |
Patrik Stridvall | bda5074 | 2001-07-14 00:48:41 +0000 | [diff] [blame] | 38 | my $stdout_isatty = -t STDOUT; |
| 39 | my $stderr_isatty = -t STDERR; |
| 40 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 41 | sub new($) { |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 42 | my $proto = shift; |
| 43 | my $class = ref($proto) || $proto; |
| 44 | my $self = {}; |
| 45 | bless ($self, $class); |
| 46 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 47 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 48 | my $progress = \${$self->{PROGRESS}}; |
| 49 | my $last_progress = \${$self->{LAST_PROGRESS}}; |
Patrik Stridvall | d07a646 | 2001-07-18 20:09:12 +0000 | [diff] [blame] | 50 | my $last_time = \${$self->{LAST_TIME}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 51 | my $progress_count = \${$self->{PROGRESS_COUNT}}; |
| 52 | my $prefix = \${$self->{PREFIX}}; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 53 | my $prefix_callback = \${$self->{PREFIX_CALLBACK}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 54 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 55 | $$progress_enabled = 1; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 56 | $$progress = ""; |
| 57 | $$last_progress = ""; |
Patrik Stridvall | d07a646 | 2001-07-18 20:09:12 +0000 | [diff] [blame] | 58 | $$last_time = 0; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 59 | $$progress_count = 0; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 60 | $$prefix = undef; |
| 61 | $$prefix_callback = undef; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 62 | |
| 63 | return $self; |
| 64 | } |
| 65 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 66 | sub DESTROY { |
| 67 | my $self = shift; |
| 68 | |
| 69 | $self->hide_progress; |
| 70 | } |
| 71 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 72 | sub enable_progress($) { |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 73 | my $self = shift; |
| 74 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
| 75 | |
| 76 | $$progress_enabled = 1; |
| 77 | } |
| 78 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 79 | sub disable_progress($) { |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 80 | my $self = shift; |
| 81 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
| 82 | |
| 83 | $$progress_enabled = 0; |
| 84 | } |
| 85 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 86 | sub show_progress($) { |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 87 | my $self = shift; |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 88 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 89 | my $progress = ${$self->{PROGRESS}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 90 | my $last_progress = \${$self->{LAST_PROGRESS}}; |
| 91 | my $progress_count = \${$self->{PROGRESS_COUNT}}; |
| 92 | |
| 93 | $$progress_count++; |
| 94 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 95 | if($$progress_enabled) { |
| 96 | if($$progress_count > 0 && $$progress && $stderr_isatty) { |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 97 | # If progress has more than $columns characters the xterm will |
| 98 | # scroll to the next line and our ^H characters will fail to |
| 99 | # erase it. |
| 100 | my $columns=$ENV{COLUMNS} || 80; |
| 101 | $progress = substr $progress,0,($columns-1); |
| 102 | print STDERR $progress; |
| 103 | $$last_progress = $progress; |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 104 | } |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 105 | } |
| 106 | } |
| 107 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 108 | sub hide_progress($) { |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 109 | my $self = shift; |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 110 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 111 | my $progress = \${$self->{PROGRESS}}; |
| 112 | my $last_progress = \${$self->{LAST_PROGRESS}}; |
| 113 | my $progress_count = \${$self->{PROGRESS_COUNT}}; |
| 114 | |
| 115 | $$progress_count--; |
| 116 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 117 | if($$progress_enabled) { |
| 118 | if($$last_progress && $stderr_isatty) { |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 119 | my $message=" " x length($$last_progress); |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 120 | print STDERR $message; |
| 121 | undef $$last_progress; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 122 | } |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 123 | } |
| 124 | } |
| 125 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 126 | sub update_progress($) { |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 127 | my $self = shift; |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 128 | my $progress_enabled = \${$self->{PROGRESS_ENABLED}}; |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 129 | my $progress = ${$self->{PROGRESS}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 130 | my $last_progress = \${$self->{LAST_PROGRESS}}; |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 131 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 132 | if($$progress_enabled) { |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 133 | # If progress has more than $columns characters the xterm will |
| 134 | # scroll to the next line and our ^H characters will fail to |
| 135 | # erase it. |
| 136 | my $columns=$ENV{COLUMNS} || 80; |
| 137 | $progress = substr $progress,0,($columns-1); |
| 138 | |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 139 | my $prefix = ""; |
| 140 | my $suffix = ""; |
| 141 | if($$last_progress) { |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 142 | $prefix = "" x length($$last_progress); |
Alexandre Julliard | 7cae558 | 2002-06-01 02:55:48 +0000 | [diff] [blame] | 143 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 144 | my $diff = length($$last_progress)-length($progress); |
Patrik Stridvall | 67f0a70 | 2001-07-26 21:42:12 +0000 | [diff] [blame] | 145 | if($diff > 0) { |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 146 | $suffix = (" " x $diff) . ("" x $diff); |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 147 | } |
| 148 | } |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 149 | print STDERR $prefix, $progress, $suffix; |
| 150 | $$last_progress = $progress; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 151 | } |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 152 | } |
| 153 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 154 | sub progress($$) { |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 155 | my $self = shift; |
| 156 | my $progress = \${$self->{PROGRESS}}; |
Patrik Stridvall | d07a646 | 2001-07-18 20:09:12 +0000 | [diff] [blame] | 157 | my $last_time = \${$self->{LAST_TIME}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 158 | |
Patrik Stridvall | d171a55 | 2001-09-10 23:16:05 +0000 | [diff] [blame] | 159 | my $new_progress = shift; |
| 160 | if(defined($new_progress)) { |
| 161 | if(!defined($$progress) || $new_progress ne $$progress) { |
| 162 | $$progress = $new_progress; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 163 | |
Patrik Stridvall | d171a55 | 2001-09-10 23:16:05 +0000 | [diff] [blame] | 164 | $self->update_progress; |
| 165 | $$last_time = 0; |
| 166 | } |
| 167 | } else { |
| 168 | return $$progress; |
| 169 | } |
Patrik Stridvall | d07a646 | 2001-07-18 20:09:12 +0000 | [diff] [blame] | 170 | } |
| 171 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 172 | sub lazy_progress($$) { |
Patrik Stridvall | d07a646 | 2001-07-18 20:09:12 +0000 | [diff] [blame] | 173 | my $self = shift; |
| 174 | my $progress = \${$self->{PROGRESS}}; |
| 175 | my $last_time = \${$self->{LAST_TIME}}; |
| 176 | |
| 177 | $$progress = shift; |
| 178 | |
| 179 | my $time = time(); |
| 180 | if($time - $$last_time > 0) { |
| 181 | $self->update_progress; |
| 182 | $$last_time = $time; |
| 183 | } |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 184 | } |
| 185 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 186 | sub prefix($$) { |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 187 | my $self = shift; |
| 188 | my $prefix = \${$self->{PREFIX}}; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 189 | my $prefix_callback = \${$self->{PREFIX_CALLBACK}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 190 | |
Patrik Stridvall | aeb023f | 2001-08-22 18:09:15 +0000 | [diff] [blame] | 191 | my $new_prefix = shift; |
| 192 | if(defined($new_prefix)) { |
Patrik Stridvall | d171a55 | 2001-09-10 23:16:05 +0000 | [diff] [blame] | 193 | if(!defined($$prefix) || $new_prefix ne $$prefix) { |
| 194 | $$prefix = $new_prefix; |
| 195 | $$prefix_callback = undef; |
| 196 | } |
Patrik Stridvall | aeb023f | 2001-08-22 18:09:15 +0000 | [diff] [blame] | 197 | } else { |
| 198 | return $$prefix; |
| 199 | } |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 200 | } |
| 201 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 202 | sub prefix_callback($) { |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 203 | my $self = shift; |
| 204 | |
| 205 | my $prefix = \${$self->{PREFIX}}; |
| 206 | my $prefix_callback = \${$self->{PREFIX_CALLBACK}}; |
| 207 | |
| 208 | $$prefix = undef; |
| 209 | $$prefix_callback = shift; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 210 | } |
| 211 | |
Francois Gouget | bac042c | 2004-10-05 18:08:57 +0000 | [diff] [blame] | 212 | sub write($$) { |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 213 | my $self = shift; |
| 214 | |
| 215 | my $message = shift; |
| 216 | |
| 217 | my $prefix = \${$self->{PREFIX}}; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 218 | my $prefix_callback = \${$self->{PREFIX_CALLBACK}}; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 219 | |
Patrik Stridvall | bda5074 | 2001-07-14 00:48:41 +0000 | [diff] [blame] | 220 | $self->hide_progress if $stdout_isatty; |
Patrik Stridvall | 1c61b3b | 2001-07-23 23:20:56 +0000 | [diff] [blame] | 221 | if(defined($$prefix)) { |
| 222 | print $$prefix . $message; |
| 223 | } elsif(defined($$prefix_callback)) { |
| 224 | print &{$$prefix_callback}() . $message; |
| 225 | } else { |
| 226 | print $message; |
| 227 | } |
Patrik Stridvall | bda5074 | 2001-07-14 00:48:41 +0000 | [diff] [blame] | 228 | $self->show_progress if $stdout_isatty; |
Patrik Stridvall | 6a012e2 | 2001-06-13 19:38:29 +0000 | [diff] [blame] | 229 | } |
| 230 | |
| 231 | 1; |