1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
# $NetBSD: Type.pm,v 1.1 2015/11/25 16:42:21 rillig Exp $
#
# A Type in pkglint is a combination of a data type and a permission
# specification. Further details can be found in the chapter ``The pkglint
# type system'' of the pkglint book.
#
package PkgLint::Type;
use strict;
use warnings;
BEGIN {
import PkgLint::Util qw(
false true
);
import PkgLint::Logging qw(
log_warning NO_LINES
);
use Exporter;
use vars qw(@ISA @EXPORT_OK);
@ISA = qw(Exporter);
@EXPORT_OK = qw(
LK_NONE LK_INTERNAL LK_EXTERNAL
GUESSED NOT_GUESSED
);
}
use enum qw(KIND_OF_LIST BASIC_TYPE ACLS IS_GUESSED);
use enum qw(:LK_ NONE INTERNAL EXTERNAL);
use enum qw(:ACLE_ SUBJECT_RE PERMS);
use enum qw(NOT_GUESSED GUESSED);
sub new($$$) {
my ($class, $kind_of_list, $basic_type, $acls, $guessed) = @_;
my ($self) = ([$kind_of_list, $basic_type, $acls, $guessed]);
bless($self, $class);
return $self;
}
sub kind_of_list($) { return shift()->[KIND_OF_LIST]; }
sub basic_type($) { return shift()->[BASIC_TYPE]; }
# no getter method for acls
sub is_guessed($) { return shift()->[IS_GUESSED]; }
sub perms($$) {
my ($self, $fname) = @_;
my ($perms);
foreach my $acl_entry (@{$self->[ACLS]}) {
if ($fname =~ $acl_entry->[ACLE_SUBJECT_RE]) {
return $acl_entry->[ACLE_PERMS];
}
}
return;
}
# Returns the union of all possible permissions. This can be used to
# check whether a variable may be defined or used at all, or if it is
# read-only.
sub perms_union($) {
my ($self) = @_;
my ($perms);
$perms = "";
foreach my $acl_entry(@{$self->[ACLS]}) {
$perms .= $acl_entry->[ACLE_PERMS];
}
return $perms;
}
# Returns whether the type is considered an external list. All external
# lists are, of course, as well as some other data types that are not
# defined as lists to make the implementation of checkline_mk_vartype
# easier.
sub is_practically_a_list($) {
my ($self) = @_;
return ($self->kind_of_list == LK_EXTERNAL) ? true
: ($self->kind_of_list == LK_INTERNAL) ? false
: ($self->basic_type eq "BuildlinkPackages") ? true
: ($self->basic_type eq "SedCommands") ? true
: ($self->basic_type eq "ShellCommand") ? true
: false;
}
# Returns whether variables of this type may be extended using the "+="
# operator.
sub may_use_plus_eq($) {
my ($self) = @_;
return ($self->kind_of_list != LK_NONE) ? true
: ($self->basic_type eq "AwkCommand") ? true
: ($self->basic_type eq "BuildlinkPackages") ? true
: ($self->basic_type eq "SedCommands") ? true
: false;
}
sub to_string($) {
my ($self) = @_;
return (["", "InternalList of ", "List of "]->[$self->kind_of_list]) . $self->basic_type;
}
|