1# ex:ts=8 sw=4:
2# $OpenBSD: ProgressMeter.pm,v 1.54 2023/06/13 09:07:17 espie Exp $
3#
4# Copyright (c) 2010 Marc Espie <espie@openbsd.org>
5#
6# Permission to use, copy, modify, and distribute this software for any
7# purpose with or without fee is hereby granted, provided that the above
8# copyright notice and this permission notice appear in all copies.
9#
10# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17
18use v5.36;
19
20package OpenBSD::PackingElement;
21sub compute_size($self, $totsize)
22{
23	$$totsize += $self->{size} if defined $self->{size};
24}
25
26package OpenBSD::ProgressMeter;
27sub new($)
28{
29	bless {}, "OpenBSD::ProgressMeter::Stub";
30}
31
32sub compute_size($self, $plist)
33{
34	my $totsize = 0;
35	$plist->compute_size(\$totsize);
36	$totsize = 1 if $totsize == 0;
37	return $totsize;
38}
39
40sub setup($self, $opt_x, $opt_m, $state)
41{
42	$self->{state} = $state;
43	if ($opt_m || (!$opt_x && -t STDOUT)) {
44		require OpenBSD::ProgressMeter::Term;
45		bless $self, "OpenBSD::ProgressMeter::Term";
46		$self->init;
47	}
48}
49
50sub disable($) {}
51
52sub new_sizer($progress, $plist)
53{
54	return $progress->sizer_class->new($progress, $plist);
55}
56
57sub sizer_class($)
58{
59	"PureSizer"
60}
61
62sub for_list($self, $msg, $l, $code)
63{
64	if (defined $msg) {
65		$self->set_header($msg);
66	}
67	my $total = scalar @$l;
68	my $i = 0;
69	for my $e (@$l) {
70		$self->show(++$i, $total);
71		&$code($e);
72	}
73	$self->next;
74}
75
76sub compute_playfield($)
77{
78}
79
80sub handle_continue($self)
81{
82	$self->{continued} = 1;
83}
84
85sub can_output($self)
86{
87	return $self->{state}->can_output;
88}
89
90# stub class when no actual progressmeter that still prints out.
91# see methods documentation under ProgressMeter::Term
92package OpenBSD::ProgressMeter::Stub;
93our @ISA = qw(OpenBSD::ProgressMeter);
94
95sub forked($) {}
96
97sub clear($) {}
98
99
100sub show($, $, $) {}
101
102sub working($, $) {}
103sub message($, $) {}
104
105sub next($, $ = undef) {}
106
107sub set_header($, $) {}
108
109sub ntogo($, $, $ = undef)
110{
111	return "";
112}
113
114sub visit_with_size($progress, $plist, $method, @r)
115{
116	$plist->$method($progress->{state}, @r);
117}
118
119sub visit_with_count	# forwarder
120{
121	&OpenBSD::ProgressMeter::Stub::visit_with_size;
122}
123
124package PureSizer;
125
126sub new($class, $progress, $plist)
127{
128	$plist->{totsize} //= $progress->compute_size($plist);
129	bless {
130	    progress => $progress,
131	    totsize => $plist->{totsize},
132	    donesize => 0,
133	    }, $class;
134}
135
136sub advance($self, $e)
137{
138	if (defined $e->{size}) {
139		$self->{donesize} += $e->{size};
140	}
141}
142
1431;
144