xref: /openbsd/usr.sbin/pkg_add/OpenBSD/Subst.pm (revision 8932bfb7)
1# ex:ts=8 sw=4:
2# $OpenBSD: Subst.pm,v 1.14 2010/12/24 09:04:14 espie Exp $
3#
4# Copyright (c) 2008 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 strict;
19use warnings;
20
21# very simple package, just holds everything needed for substitution
22# according to package rules.
23
24package OpenBSD::Subst;
25
26sub new
27{
28	bless {}, shift;
29}
30
31sub hash
32{
33	shift;
34}
35
36sub add
37{
38	my ($self, $k, $v) = @_;
39	$k =~ s/^\^//;
40	$self->{$k} = $v;
41}
42
43sub value
44{
45	my ($self, $k) = @_;
46	return $self->{$k};
47}
48
49sub parse_option
50{
51	my ($self, $opt) = @_;
52	if ($opt =~ m/^([^=]+)\=(.*)$/o) {
53		my ($k, $v) = ($1, $2);
54		$v =~ s/^\'(.*)\'$/$1/;
55		$v =~ s/^\"(.*)\"$/$1/;
56		$self->add($k, $v);
57	} else {
58		$self->add($opt, 1);
59	}
60}
61
62sub do
63{
64	my $self = shift;
65	my $_ = shift;
66	return $_ unless m/\$/o;	# optimization
67	while (my ($k, $v) = each %{$self->hash}) {
68		s/\$\{\Q$k\E\}/$v/g;
69	}
70	s/\$\\/\$/go;
71	return $_;
72}
73
74sub copy_fh2
75{
76	my ($self, $src, $dest) = @_;
77	my $_;
78	while (<$src>) {
79		print $dest $self->do($_);
80	}
81}
82
83sub copy_fh
84{
85	my ($self, $srcname, $dest) = @_;
86	open my $src, '<', $srcname or die "can't open $srcname";
87	$self->copy_fh2($src, $dest);
88}
89
90sub copy
91{
92	my ($self, $srcname, $destname) = @_;
93	open my $dest, '>', $destname or die "can't open $destname";
94	$self->copy_fh($srcname, $dest);
95	return $dest;
96}
97
98sub has_fragment
99{
100	my ($self, $def, $frag) = @_;
101
102	my $v = $self->value($def);
103
104	if (!defined $v) {
105		die "Error: unknown fragment $frag";
106	} elsif ($v == 1) {
107		return 1;
108	} elsif ($v == 0) {
109		return 0;
110	} else {
111		die "Incorrect define for $frag";
112	}
113}
114
115sub empty
116{
117	my ($self, $k) = @_;
118
119	my $v = $self->value($k);
120	if (defined $v && $v) {
121		return 0;
122	} else {
123		return 1;
124	}
125}
126
1271;
128