blob: 49939740f82774cc566c4452bd6fbca163e21569 [file] [log] [blame]
Patrik Stridvall6a012e22001-06-13 19:38:29 +00001package output;
2
3use strict;
4
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +00005use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
6require Exporter;
Patrik Stridvall6a012e22001-06-13 19:38:29 +00007
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +00008@ISA = qw(Exporter);
9@EXPORT = qw();
10@EXPORT_OK = qw($output);
Patrik Stridvall6a012e22001-06-13 19:38:29 +000011
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +000012use vars qw($output);
Patrik Stridvall6a012e22001-06-13 19:38:29 +000013
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +000014$output = '_output'->new;
Patrik Stridvall6a012e22001-06-13 19:38:29 +000015
16package _output;
17
18use strict;
19
Patrik Stridvallbda50742001-07-14 00:48:41 +000020my $stdout_isatty = -t STDOUT;
21my $stderr_isatty = -t STDERR;
22
Patrik Stridvall6a012e22001-06-13 19:38:29 +000023sub new {
24 my $proto = shift;
25 my $class = ref($proto) || $proto;
26 my $self = {};
27 bless ($self, $class);
28
Patrik Stridvall67f0a702001-07-26 21:42:12 +000029 my $progress_enabled = \${$self->{PROGRESS_ENABLED}};
Patrik Stridvall6a012e22001-06-13 19:38:29 +000030 my $progress = \${$self->{PROGRESS}};
31 my $last_progress = \${$self->{LAST_PROGRESS}};
Patrik Stridvalld07a6462001-07-18 20:09:12 +000032 my $last_time = \${$self->{LAST_TIME}};
Patrik Stridvall6a012e22001-06-13 19:38:29 +000033 my $progress_count = \${$self->{PROGRESS_COUNT}};
34 my $prefix = \${$self->{PREFIX}};
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +000035 my $prefix_callback = \${$self->{PREFIX_CALLBACK}};
Patrik Stridvall6a012e22001-06-13 19:38:29 +000036
Patrik Stridvall67f0a702001-07-26 21:42:12 +000037 $$progress_enabled = 1;
Patrik Stridvall6a012e22001-06-13 19:38:29 +000038 $$progress = "";
39 $$last_progress = "";
Patrik Stridvalld07a6462001-07-18 20:09:12 +000040 $$last_time = 0;
Patrik Stridvall6a012e22001-06-13 19:38:29 +000041 $$progress_count = 0;
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +000042 $$prefix = undef;
43 $$prefix_callback = undef;
Patrik Stridvall6a012e22001-06-13 19:38:29 +000044
45 return $self;
46}
47
Patrik Stridvall67f0a702001-07-26 21:42:12 +000048sub DESTROY {
49 my $self = shift;
50
51 $self->hide_progress;
52}
53
54sub enable_progress {
55 my $self = shift;
56 my $progress_enabled = \${$self->{PROGRESS_ENABLED}};
57
58 $$progress_enabled = 1;
59}
60
61sub disable_progress {
62 my $self = shift;
63 my $progress_enabled = \${$self->{PROGRESS_ENABLED}};
64
65 $$progress_enabled = 0;
66}
67
Patrik Stridvall6a012e22001-06-13 19:38:29 +000068sub show_progress {
69 my $self = shift;
Patrik Stridvall67f0a702001-07-26 21:42:12 +000070 my $progress_enabled = \${$self->{PROGRESS_ENABLED}};
Patrik Stridvall6a012e22001-06-13 19:38:29 +000071 my $progress = \${$self->{PROGRESS}};
72 my $last_progress = \${$self->{LAST_PROGRESS}};
73 my $progress_count = \${$self->{PROGRESS_COUNT}};
74
75 $$progress_count++;
76
Patrik Stridvall67f0a702001-07-26 21:42:12 +000077 if($$progress_enabled) {
78 if($$progress_count > 0 && $$progress && $stderr_isatty) {
79 print STDERR $$progress;
80 $$last_progress = $$progress;
81 }
Patrik Stridvall6a012e22001-06-13 19:38:29 +000082 }
83}
84
85sub hide_progress {
86 my $self = shift;
Patrik Stridvall67f0a702001-07-26 21:42:12 +000087 my $progress_enabled = \${$self->{PROGRESS_ENABLED}};
Patrik Stridvall6a012e22001-06-13 19:38:29 +000088 my $progress = \${$self->{PROGRESS}};
89 my $last_progress = \${$self->{LAST_PROGRESS}};
90 my $progress_count = \${$self->{PROGRESS_COUNT}};
91
92 $$progress_count--;
93
Patrik Stridvall67f0a702001-07-26 21:42:12 +000094 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 Stridvall6a012e22001-06-13 19:38:29 +0000102 }
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000103 }
104}
105
106sub update_progress {
107 my $self = shift;
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000108 my $progress_enabled = \${$self->{PROGRESS_ENABLED}};
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000109 my $progress = \${$self->{PROGRESS}};
110 my $last_progress = \${$self->{LAST_PROGRESS}};
111
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000112 if($$progress_enabled) {
113 my $prefix = "";
114 my $suffix = "";
115 if($$last_progress) {
116 for (1..length($$last_progress)) {
117 $prefix .= "";
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000118 }
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000119
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 Stridvall6a012e22001-06-13 19:38:29 +0000128 }
129 }
Patrik Stridvall67f0a702001-07-26 21:42:12 +0000130 print STDERR $prefix . $$progress . $suffix;
131 $$last_progress = $$progress;
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000132 }
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000133}
134
135sub progress {
136 my $self = shift;
137 my $progress = \${$self->{PROGRESS}};
Patrik Stridvalld07a6462001-07-18 20:09:12 +0000138 my $last_time = \${$self->{LAST_TIME}};
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000139
Patrik Stridvalld171a552001-09-10 23:16:05 +0000140 my $new_progress = shift;
141 if(defined($new_progress)) {
142 if(!defined($$progress) || $new_progress ne $$progress) {
143 $$progress = $new_progress;
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000144
Patrik Stridvalld171a552001-09-10 23:16:05 +0000145 $self->update_progress;
146 $$last_time = 0;
147 }
148 } else {
149 return $$progress;
150 }
Patrik Stridvalld07a6462001-07-18 20:09:12 +0000151}
152
153sub 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 Stridvall6a012e22001-06-13 19:38:29 +0000165}
166
167sub prefix {
168 my $self = shift;
169 my $prefix = \${$self->{PREFIX}};
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +0000170 my $prefix_callback = \${$self->{PREFIX_CALLBACK}};
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000171
Patrik Stridvallaeb023f2001-08-22 18:09:15 +0000172 my $new_prefix = shift;
173 if(defined($new_prefix)) {
Patrik Stridvalld171a552001-09-10 23:16:05 +0000174 if(!defined($$prefix) || $new_prefix ne $$prefix) {
175 $$prefix = $new_prefix;
176 $$prefix_callback = undef;
177 }
Patrik Stridvallaeb023f2001-08-22 18:09:15 +0000178 } else {
179 return $$prefix;
180 }
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +0000181}
182
183sub 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 Stridvall6a012e22001-06-13 19:38:29 +0000191}
192
193sub write {
194 my $self = shift;
195
196 my $message = shift;
197
198 my $prefix = \${$self->{PREFIX}};
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +0000199 my $prefix_callback = \${$self->{PREFIX_CALLBACK}};
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000200
Patrik Stridvallbda50742001-07-14 00:48:41 +0000201 $self->hide_progress if $stdout_isatty;
Patrik Stridvall1c61b3b2001-07-23 23:20:56 +0000202 if(defined($$prefix)) {
203 print $$prefix . $message;
204 } elsif(defined($$prefix_callback)) {
205 print &{$$prefix_callback}() . $message;
206 } else {
207 print $message;
208 }
Patrik Stridvallbda50742001-07-14 00:48:41 +0000209 $self->show_progress if $stdout_isatty;
Patrik Stridvall6a012e22001-06-13 19:38:29 +0000210}
211
2121;