1d186597fSespie# ex:ts=8 sw=4: 2*039cbdaaSespie# $OpenBSD: ProgressMeter.pm,v 1.54 2023/06/13 09:07:17 espie Exp $ 3d186597fSespie# 433efc49fSespie# Copyright (c) 2010 Marc Espie <espie@openbsd.org> 5d186597fSespie# 6d186597fSespie# Permission to use, copy, modify, and distribute this software for any 7d186597fSespie# purpose with or without fee is hereby granted, provided that the above 8d186597fSespie# copyright notice and this permission notice appear in all copies. 9d186597fSespie# 10d186597fSespie# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11d186597fSespie# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12d186597fSespie# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13d186597fSespie# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14d186597fSespie# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15d186597fSespie# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1633efc49fSespie# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17d186597fSespie 18*039cbdaaSespieuse v5.36; 19d186597fSespie 20466e8b70Sespiepackage OpenBSD::PackingElement; 21*039cbdaaSespiesub compute_size($self, $totsize) 22466e8b70Sespie{ 23466e8b70Sespie $$totsize += $self->{size} if defined $self->{size}; 24466e8b70Sespie} 25466e8b70Sespie 26d186597fSespiepackage OpenBSD::ProgressMeter; 27*039cbdaaSespiesub new($) 28af363cbdSespie{ 2933efc49fSespie bless {}, "OpenBSD::ProgressMeter::Stub"; 30af363cbdSespie} 31af363cbdSespie 32*039cbdaaSespiesub compute_size($self, $plist) 33466e8b70Sespie{ 34466e8b70Sespie my $totsize = 0; 35466e8b70Sespie $plist->compute_size(\$totsize); 36466e8b70Sespie $totsize = 1 if $totsize == 0; 37466e8b70Sespie return $totsize; 38466e8b70Sespie} 39466e8b70Sespie 40*039cbdaaSespiesub setup($self, $opt_x, $opt_m, $state) 416e574fa7Sespie{ 42ecb1e57bSespie $self->{state} = $state; 43a409537dSespie if ($opt_m || (!$opt_x && -t STDOUT)) { 4433efc49fSespie require OpenBSD::ProgressMeter::Term; 4533efc49fSespie bless $self, "OpenBSD::ProgressMeter::Term"; 4633efc49fSespie $self->init; 476e574fa7Sespie } 486e574fa7Sespie} 496e574fa7Sespie 50*039cbdaaSespiesub disable($) {} 51f43f2e8dSespie 52*039cbdaaSespiesub new_sizer($progress, $plist) 530386587aSespie{ 54ecb1e57bSespie return $progress->sizer_class->new($progress, $plist); 550386587aSespie} 560386587aSespie 57*039cbdaaSespiesub sizer_class($) 580386587aSespie{ 59466e8b70Sespie "PureSizer" 600386587aSespie} 610386587aSespie 62*039cbdaaSespiesub for_list($self, $msg, $l, $code) 63f4f6c15cSespie{ 64f4f6c15cSespie if (defined $msg) { 65f4f6c15cSespie $self->set_header($msg); 66f4f6c15cSespie } 67f4f6c15cSespie my $total = scalar @$l; 68f4f6c15cSespie my $i = 0; 69f4f6c15cSespie for my $e (@$l) { 70f4f6c15cSespie $self->show(++$i, $total); 71f4f6c15cSespie &$code($e); 72f4f6c15cSespie } 73f4f6c15cSespie $self->next; 74f4f6c15cSespie} 75f4f6c15cSespie 76*039cbdaaSespiesub compute_playfield($) 77645b31caSespie{ 78645b31caSespie} 79645b31caSespie 80*039cbdaaSespiesub handle_continue($self) 81ef1b7bf1Sespie{ 82ef1b7bf1Sespie $self->{continued} = 1; 83ef1b7bf1Sespie} 84ef1b7bf1Sespie 85*039cbdaaSespiesub can_output($self) 869451df68Sespie{ 879451df68Sespie return $self->{state}->can_output; 889451df68Sespie} 899451df68Sespie 9033efc49fSespie# stub class when no actual progressmeter that still prints out. 91fba25992Sespie# see methods documentation under ProgressMeter::Term 9233efc49fSespiepackage OpenBSD::ProgressMeter::Stub; 9333efc49fSespieour @ISA = qw(OpenBSD::ProgressMeter); 943cf81a87Sespie 95*039cbdaaSespiesub forked($) {} 96f92c37f6Sespie 97*039cbdaaSespiesub clear($) {} 9833efc49fSespie 99f43f2e8dSespie 100*039cbdaaSespiesub show($, $, $) {} 10133efc49fSespie 102*039cbdaaSespiesub working($, $) {} 103*039cbdaaSespiesub message($, $) {} 10433efc49fSespie 105*039cbdaaSespiesub next($, $ = undef) {} 10633efc49fSespie 107*039cbdaaSespiesub set_header($, $) {} 108d186597fSespie 109*039cbdaaSespiesub ntogo($, $, $ = undef) 110f9ed702cSespie{ 11133efc49fSespie return ""; 11233efc49fSespie} 11333efc49fSespie 114*039cbdaaSespiesub visit_with_size($progress, $plist, $method, @r) 11533efc49fSespie{ 11623b5e034Sespie $plist->$method($progress->{state}, @r); 11733efc49fSespie} 11833efc49fSespie 119*039cbdaaSespiesub visit_with_count # forwarder 12033efc49fSespie{ 12133efc49fSespie &OpenBSD::ProgressMeter::Stub::visit_with_size; 122f9ed702cSespie} 123f9ed702cSespie 124466e8b70Sespiepackage PureSizer; 125466e8b70Sespie 126*039cbdaaSespiesub new($class, $progress, $plist) 127466e8b70Sespie{ 128466e8b70Sespie $plist->{totsize} //= $progress->compute_size($plist); 129466e8b70Sespie bless { 130466e8b70Sespie progress => $progress, 131466e8b70Sespie totsize => $plist->{totsize}, 132466e8b70Sespie donesize => 0, 133466e8b70Sespie }, $class; 134466e8b70Sespie} 135466e8b70Sespie 136*039cbdaaSespiesub advance($self, $e) 137466e8b70Sespie{ 138466e8b70Sespie if (defined $e->{size}) { 139466e8b70Sespie $self->{donesize} += $e->{size}; 140466e8b70Sespie } 141466e8b70Sespie} 142466e8b70Sespie 143d186597fSespie1; 144