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