#!/usr/bin/perl
use
Regexp::Common;
$^W = 1;
sub
create_parts;
my
$gopher
=
$RE
{URI} {gopher};
my
$gopher_notab
=
$RE
{URI} {gopher} {-notab};
my
@tests
= (
[
gopher
=>
$gopher
=> {
gopher
=> NORMAL_PASS | FAIL}],
[
gopher_notab
=>
$gopher_notab
=> {
gopher_notab
=> NORMAL_PASS | FAIL}],
);
my
(
$good
,
$bad
) = create_parts;
run_tests
version
=>
"Regexp::Common::URI::gopher"
,
tests
=> \
@tests
,
good
=>
$good
,
bad
=>
$bad
,
query
=> \
&gopher
,
wanted
=> \
&wanted
,
filter
=> \
&filter
,
;
sub
gopher {
my
(
$tag
,
$host
,
$port
,
$gtype
,
$selector
,
$search
,
$gopherplus_string
) =
(
$_
[0], @{
$_
[1]});
$gopher
.=
$host
if
defined
$host
;
$gopher
.=
":$port"
if
defined
$port
;
$gopher
.=
"/$gtype"
if
defined
$gtype
;
$gopher
.=
$selector
if
defined
$selector
;
$gopher
.=
"%09$search"
if
defined
$search
;
$gopher
.=
"%09$gopherplus_string"
if
defined
$gopherplus_string
;
$gopher
;
}
sub
wanted {
my
(
$tag
,
$parts
) =
@_
;
my
@wanted
;
$wanted
[0] =
$_
;
$wanted
[1] =
"gopher"
;
$wanted
[2] =
$$parts
[0];
$wanted
[3] =
$$parts
[1];
$wanted
[4] =
join
""
=>
grep
{
defined
}
@$parts
[2, 3];
$wanted
[4] .=
"%09"
.
$$parts
[4]
if
defined
$$parts
[4];
$wanted
[4] .=
"%09"
.
$$parts
[5]
if
defined
$$parts
[5];
$wanted
[5] =
$$parts
[2];
if
(
$tag
eq
'gopher_notab'
) {
$wanted
[6] =
$$parts
[3];
$wanted
[7] =
$$parts
[4];
$wanted
[8] =
$$parts
[5];
}
else
{
$wanted
[6] =
join
"%09"
=>
grep
{
defined
}
@$parts
[3, 4, 5];
}
\
@wanted
;
}
sub
create_parts {
my
(
@good
,
@bad
);
local
$^W = 0;
$good
[0] = [
qw /www.abigail.be
127.0.0.1 w--w--w3.ABIGAIL.nl/];
$bad
[0] = [
qw /www.example..com
w+w.example.com 127.0.0.0.1/];
$good
[1] = [
undef
, 70];
$bad
[1] = [
""
,
qw /:
port/];
$good
[2] = [
qw /0
+ T/];
$bad
[2] = [
""
,
qw /~/];
$good
[3] = [
""
,
qw {FNURD
0},
q {$_.+!*'(),:@&=%FF}];
pop
@{
$good
[3]}
if
$] < 5.006;
$bad
[3] = [
qw {/
[]}];
$good
[4] = [
undef
,
""
,
qw {FNORD
0},
q {$_.+!*'(),:@&=%FF}];
$bad
[4] = [
qw {/
[]}];
$good
[5] = [
undef
,
""
,
qw {fnord
0},
q {$_.+%09!*'(),:@&=%FF}];
$bad
[5] = [
qw {/
[]}];
return
(\
@good
, \
@bad
);
}
sub
filter {
return
0
if
defined
$_
[0] -> [5] && !
defined
$_
[0] -> [4];
return
0
if
$_
[0] -> [2] eq
""
&&
defined
$_
[0] -> [3]
&&
$_
[0] -> [3] =~ /^[0-9+IgT]/;
return
1;
}