File: Util.pm

package info (click to toggle)
libperl-prereqscanner-notquitelite-perl 0.9917-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 944 kB
  • sloc: perl: 5,239; makefile: 2
file content (169 lines) | stat: -rw-r--r-- 3,661 bytes parent folder | download | duplicates (3)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
package Perl::PrereqScanner::NotQuiteLite::Util;

use strict;
use warnings;
use Exporter 5.57 qw/import/;

our %FLAGS; BEGIN {
  my $i = 0;
  %FLAGS = map {$_ => 1 << $i++} qw/
  F_KEEP_TOKENS
  F_EVAL
  F_STRING_EVAL
  F_EXPECTS_BRACKET
  F_CONDITIONAL
  F_SIDEFF
  F_SCOPE_END
  F_STATEMENT_END
  F_EXPR_END
  F_EXPR
  /;
}

use constant \%FLAGS;
use constant {
  MASK_KEEP_TOKENS => ~(F_KEEP_TOKENS),
  MASK_EXPR_END => ~(F_EXPR_END|F_EXPR),
  MASK_STATEMENT_END => ~(F_KEEP_TOKENS|F_STATEMENT_END|F_EXPR|F_EXPR_END|F_SIDEFF),
  MASK_EVAL => ~(F_EVAL),
  MASK_SIDEFF => ~(F_SIDEFF),
  F_RESCAN => (F_KEEP_TOKENS|F_EVAL|F_STRING_EVAL|F_CONDITIONAL),
};

our @EXPORT = ((keys %FLAGS), qw/
  is_module_name
  is_version
  convert_string_tokens
  convert_string_token_list
  MASK_KEEP_TOKENS
  MASK_EXPR_END
  MASK_STATEMENT_END
  MASK_EVAL
  MASK_SIDEFF
  F_RESCAN
/);

sub is_module_name {
  my $name = shift or return;
  return 1 if $name =~ /^[A-Za-z_][A-Za-z0-9_]*(?:(?:::|')[A-Za-z0-9_]+)*$/;
  return;
}

sub is_version {
  my $version = shift;
  return unless defined $version;
  return 1 if $version =~ /\A
    (
      [0-9]+(?:\.[0-9]+)?
      |
      v[0-9]+(?:\.[0-9]+)*
      |
      [0-9]+(?:\.[0-9]+){2,}
    ) (?:_[0-9]+)?
  \z/x;
  return;
}

sub convert_string_tokens {
  my $org_tokens = shift;
  my @tokens;
  my @copied_tokens = @$org_tokens;
  my $prev = '';
  while(my $copied_token = shift @copied_tokens) {
    my ($token, $desc) = @$copied_token;
    if ($desc and $desc eq '()' and $prev ne 'WORD') {
      unshift @copied_tokens, @$token;
      next;
    }

    if (!$desc) {
      push @tokens, $copied_token;
    } elsif ($desc eq 'VERSION_STRING' or $desc eq 'NUMBER') {
      push @tokens, $token;
    } elsif ($desc eq 'STRING') {
      push @tokens, $token->[0];
    } elsif ($desc eq 'QUOTED_WORD_LIST') {
      push @tokens, grep {defined $_ and $_ ne ''} split /\s/, $token->[0];
    } else {
      push @tokens, $copied_token;
    }
    $prev = $desc;
  }
  \@tokens;
}

sub convert_string_token_list {
  my $org_tokens = shift;
  my @list;
  my @tokens;
  my @copied_tokens = @$org_tokens;
  my $prev = '';
  while(my $copied_token = shift @copied_tokens) {
    my ($token, $desc) = @$copied_token;
    if ($desc and $desc eq '()' and $prev ne 'WORD') {
      unshift @copied_tokens, @$token;
      next;
    }

    if (!$desc) {
      push @tokens, $copied_token;
    } elsif ($desc eq 'VERSION_STRING' or $desc eq 'NUMBER') {
      push @tokens, $token;
    } elsif ($desc eq 'STRING') {
      push @tokens, $token->[0];
    } elsif ($desc eq 'QUOTED_WORD_LIST') {
      push @list, grep {defined $_ and $_ ne ''} split /\s/, $token->[0];
    } elsif ($token eq ',' or $token eq '=>') {
      push @list, @tokens == 1 ? $tokens[0] : \@tokens;
      @tokens = ();
      $prev = '';
    } elsif ($desc eq ';') {
      last;
    } else {
      push @tokens, $copied_token;
    }
    $prev = $desc;
  }
  if (@tokens) {
    push @list, @tokens == 1 ? $tokens[0] : \@tokens;
  }

  \@list;
}

1;

__END__

=encoding utf-8

=head1 NAME

Perl::PrereqScanner::NotQuiteLite::Util

=head1 DESCRIPTION

This provides a few utility functions for internal use.

=head1 FUNCTIONS

=head2 is_module_name

takes a string and returns true if it looks like a module.

=head2 is_version

takes a string and returns true if it looks like a version.

=head1 AUTHOR

Kenichi Ishigaki, E<lt>ishigaki@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2015 by Kenichi Ishigaki.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut