The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use warnings;

my $uri_unsafe = qr/[^A-Za-z0-9\-\._~]/; # defined by RFC 3986

print "/* Check whether a character is unsafe by the definition of RFC 3986 */\n";
print "/* This file is automatically generated by $0 */\n";

print <<'C';
static int
is_uri_unsafe(char const c) {
    switch((unsigned char)c) {
C

for(my $i = 0; $i < 256; $i++) {
    my $c = chr $i;

    if($c !~ $uri_unsafe) {
        printf "    case 0x%02X: return 0;%s\n",
            $i,
            ($c =~ /[[:print:]]/ ? " /* $c */" : '');
    }
}

print <<'C';
    default: return 1;
    }
} /* is_uri_unsafe */
C