BEGIN { $| = 1; print "1..33\n"; } END {print "not ok 1\n" unless $loaded;} use String::Multibyte; $bytes = String::Multibyte->new('Bytes',1); $euc = String::Multibyte->new('EUC',1); $eucjp = String::Multibyte->new('EUC_JP',1); $sjis = String::Multibyte->new('ShiftJIS',1); $utf8 = String::Multibyte->new('UTF8',1); $u16be = String::Multibyte->new('UTF16BE',1); $u16le = String::Multibyte->new('UTF16LE',1); $u32be = String::Multibyte->new('UTF32BE',1); $u32le = String::Multibyte->new('UTF32LE',1); $^W = 1; $loaded = 1; print "ok 1\n"; ##### sub asc2str ($$) { my($cs, $str) = @_; my $tmp = { UTF16LE => 'v', UTF32LE => 'V', UTF16BE => 'n', UTF32BE => 'N', }->{$cs}; $tmp and $str =~ s/([\x00-\xFF])/pack $tmp, ord $1/ge; return $str; } sub str2asc ($$) { my($cs, $str) = @_; my $re = { UTF16LE => '([\0-\xFF])\0', UTF32LE => '([\0-\xFF])\0\0\0', UTF16BE => '\0([\0-\xFF])', UTF32BE => '\0\0\0([\0-\xFF])', }->{$cs}; $re and $str =~ s/$re/$1/g; return $str; } ##### for (["A-D", "ABCD"], ["-0", "-0"], ["ab-", "ab-"], ['-+\-XYZ-', "-+-XYZ-"], ['-+\\-XYZ-', "-+-XYZ-"], ['-+\\\\-`', "-+\\]^_`"], ['\\\-^', '\\]^' ], ['\\\\-]', '\\]' ], ['\\\\\-]', '\-]' ], ['\a-c', '\abc'], ['abZ-\\', 'abZ[\\'], ["0-9", "0123456789"], ["0-9", "0123456789", 1], ["9-0", "9876543210", 1], ["0-9-5", "01234567898765", 1], ["0-9-5-7", "0123456789876567", 1], ["", ""] ) { #17 $NG = 0; $NG++ unless $bytes->mkrange($_->[0], $_->[2]) eq $_->[1]; $NG++ unless $euc ->mkrange($_->[0], $_->[2]) eq $_->[1]; $NG++ unless $eucjp->mkrange($_->[0], $_->[2]) eq $_->[1]; $NG++ unless $sjis ->mkrange($_->[0], $_->[2]) eq $_->[1]; $NG++ unless $utf8 ->mkrange($_->[0], $_->[2]) eq $_->[1]; $NG++ unless asc2str('UTF16BE', $_->[1]) eq $u16be->mkrange(asc2str('UTF16BE', $_->[0]), $_->[2]); $NG++ unless asc2str('UTF16LE', $_->[1]) eq $u16le->mkrange(asc2str('UTF16LE', $_->[0]), $_->[2]); $NG++ unless asc2str('UTF32BE', $_->[1]) eq $u32be->mkrange(asc2str('UTF32BE', $_->[0]), $_->[2]); $NG++ unless asc2str('UTF32LE', $_->[1]) eq $u32le->mkrange(asc2str('UTF32LE', $_->[0]), $_->[2]); print ! $NG ? "ok" : "not ok", " ", ++$loaded, "\n"; } ##### print $sjis->mkrange("\xDE-\x81\x42") eq "\xDE\xDF\x81\x40\x81\x41\x81\x42" && $sjis->mkrange("\x9F\xFC-\xE0\x41") eq "\x9F\xFC\xE0\x40\xE0\x41" && $sjis->mkrange("\x7D-\xA1\xA3") eq "\x7D\x7E\x7F\xA1\xA3" && $sjis->mkrange("\x81\x7D-\x81\x81") eq "\x81\x7D\x81\x7E\x81\x80\x81\x81" && $sjis->mkrange("\x86\xF9-\x87\x42") eq "\x86\xF9\x86\xFA\x86\xFB\x86\xFC\x87\x40\x87\x41\x87\x42" ? "ok" : "not ok", " ", ++$loaded, "\n"; print $euc->mkrange("\x7E-\xA1\xA2") eq "\x7E\x7F\xA1\xA1\xA1\xA2" && $euc->mkrange("\xA1\xFC-\xA2\xA2") eq "\xA1\xFC\xA1\xFD\xA1\xFE\xA2\xA1\xA2\xA2" ? "ok" : "not ok", " ", ++$loaded, "\n"; print $eucjp->mkrange("\x7E-\x8E\xA2") eq "\x7E\x7F\x8E\xA1\x8E\xA2" && $eucjp->mkrange("\x8E\xDF-\xA1\xA2") eq join('', map "\x8E".chr, 0xDF..0xFE)."\xA1\xA1\xA1\xA2" && $eucjp->mkrange("\x8E\xFD-\xA1\xA2") eq "\x8E\xFD\x8E\xFE\xA1\xA1\xA1\xA2" && $eucjp->mkrange("\xA1\xFC-\xA2\xA2") eq "\xA1\xFC\xA1\xFD\xA1\xFE\xA2\xA1\xA2\xA2" && $eucjp->mkrange("\xFD\xFD-\xFE\xA2") eq "\xFD\xFD\xFD\xFE\xFE\xA1\xFE\xA2" && $eucjp->mkrange("\xFE\xFE-\x8F\xA1\xA2") eq "\xFE\xFE\x8F\xA1\xA1\x8F\xA1\xA2" && $eucjp->mkrange("\x8F\xA3\xB1-\x8F\xA3\xB2") eq "\x8F\xA3\xB1\x8F\xA3\xB2" && $eucjp->mkrange("\x8F\xA1\xFC-\x8F\xA2\xA2") eq "\x8F\xA1\xFC\x8F\xA1\xFD\x8F\xA1\xFE\x8F\xA2\xA1\x8F\xA2\xA2" ? "ok" : "not ok", " ", ++$loaded, "\n"; ##### # U+D7FE..U+E002 print $utf8->mkrange("\xed\x9f\xbe-\xee\x80\x82") eq "\xed\x9f\xbe\xed\x9f\xbf\xee\x80\x80\xee\x80\x81\xee\x80\x82" && $u16be->mkrange("\xD7\xFE\0-\xE0\x02") eq "\xD7\xFE\xD7\xFF\xE0\x00\xE0\x01\xE0\x02" && $u16le->mkrange("\xFE\xD7-\0\x02\xE0") eq "\xFE\xD7\xFF\xD7\x00\xE0\x01\xE0\x02\xE0" && $u32be->mkrange("\0\0\xD7\xFE\0\0\0-\0\0\xE0\x02") eq "\0\0\xD7\xFE\0\0\xD7\xFF\0\0\xE0\x00\0\0\xE0\x01\0\0\xE0\x02" && $u32le->mkrange("\xFE\xD7\0\0-\0\0\0\x02\xE0\0\0") eq "\xFE\xD7\0\0\xFF\xD7\0\0\x00\xE0\0\0\x01\xE0\0\0\x02\xE0\0\0" ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+FFFD..U+10001 print $utf8->mkrange("\xef\xbf\xbd-\xf0\x90\x80\x81") eq pack('H*', "efbfbdefbfbeefbfbff0908080f0908081") && $u16be->mkrange("\xFF\xFD\0-\xD8\x00\xDC\x01") eq pack('H*', "fffdfffeffffd800dc00d800dc01") && $u16le->mkrange("\xFD\xFF-\0\x00\xD8\x01\xDC") eq pack('H*', "fdfffeffffff00d800dc00d801dc") && $u32be->mkrange("\0\0\xFF\xFD\0\0\0-\x00\x01\x00\x01") eq pack('H*', "0000fffd0000fffe0000ffff0001000000010001") && $u32le->mkrange("\xFD\xFF\0\0-\0\0\0\x01\x00\x01\x00") eq pack('H*', "fdff0000feff0000ffff00000000010001000100") ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+2FFFE..U+30001 print $utf8->mkrange("\xf0\xaf\xbf\xbe-\xf0\xb0\x80\x81") eq pack('H*', "f0afbfbef0afbfbff0b08080f0b08081") && $u16be->mkrange("\xd8\x7f\xdf\xfe\0-\xd8\x80\xdc\x01") eq pack('H*', "d87fdffed87fdfffd880dc00d880dc01") && $u16le->mkrange("\x7f\xd8\xfe\xdf-\0\x80\xd8\x01\xdc") eq pack('H*', "7fd8fedf7fd8ffdf80d800dc80d801dc") && $u32be->mkrange("\x00\x02\xFF\xFE\0\0\0-\x00\x03\x00\x01") eq pack('H*', "0002fffe0002ffff0003000000030001") && $u32le->mkrange("\xFE\xFF\x02\x00-\0\0\0\x01\x00\x03\x00") eq pack('H*', "feff0200ffff02000000030001000300") ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+7FFFE..U+80001 print $utf8->mkrange("\xf1\xbf\xbf\xbe-\xf2\x80\x80\x81") eq pack('H*', "f1bfbfbef1bfbfbff2808080f2808081") && $u16be->mkrange("\xd9\xbf\xdf\xfe\0-\xd9\xc0\xdc\x01") eq pack('H*', "d9bfdffed9bfdfffd9c0dc00d9c0dc01") && $u16le->mkrange("\xbf\xd9\xfe\xdf-\0\xc0\xd9\x01\xdc") eq pack('H*', "bfd9fedfbfd9ffdfc0d900dcc0d901dc") && $u32be->mkrange("\x00\x07\xFF\xFE\0\0\0-\x00\x08\x00\x01") eq pack('H*', "0007fffe0007ffff0008000000080001") && $u32le->mkrange("\xFE\xFF\x07\x00-\0\0\0\x01\x00\x08\x00") eq pack('H*', "feff0700ffff07000000080001000800") ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+8FFFE..U+90001 print $utf8->mkrange("\xf2\x8f\xbf\xbe-\xf2\x90\x80\x81") eq pack('H*', "f28fbfbef28fbfbff2908080f2908081") && $u16be->mkrange("\xd9\xff\xdf\xfe\0-\xda\x00\xdc\x01") eq pack('H*', "d9ffdffed9ffdfffda00dc00da00dc01") && $u16le->mkrange("\xff\xd9\xfe\xdf-\0\x00\xda\x01\xdc") eq pack('H*', "ffd9fedfffd9ffdf00da00dc00da01dc") && $u32be->mkrange("\x00\x08\xFF\xFE\0\0\0-\x00\x09\x00\x01") eq pack('H*', "0008fffe0008ffff0009000000090001") && $u32le->mkrange("\xFE\xFF\x08\x00-\0\0\0\x01\x00\x09\x00") eq pack('H*', "feff0800ffff08000000090001000900") ? "ok" : "not ok", " ", ++$loaded, "\n"; ##### # U+E002..U+D7FE print $utf8->mkrange("\xee\x80\x82-\xed\x9f\xbe", 1) eq pack('H*', "ee8082ee8081ee8080ed9fbfed9fbe") && $u16be->mkrange("\xE0\x02\0-\xD7\xFE", 1) eq pack('H*', "e002e001e000d7ffd7fe") && $u16le->mkrange("\x02\xE0-\0\xFE\xD7", 1) eq pack('H*', "02e001e000e0ffd7fed7") && $u32be->mkrange("\0\0\xE0\x02\0\0\0-\0\0\xD7\xFE", 1) eq pack('H*', "0000e0020000e0010000e0000000d7ff0000d7fe") && $u32le->mkrange("\x02\xE0\0\0-\0\0\0\xFE\xD7\0\0", 1) eq pack('H*', "02e0000001e0000000e00000ffd70000fed70000") ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+10001..U+FFFD print $utf8->mkrange("\xf0\x90\x80\x81-\xef\xbf\xbd", 1) eq pack('H*', "f0908081f0908080efbfbfefbfbeefbfbd") && $u16be->mkrange("\xD8\x00\xDC\x01\0-\xFF\xFD", 1) eq "\xD8\x00\xDC\x01\xD8\x00\xDC\x00\xFF\xFF\xFF\xFE\xFF\xFD" && $u16le->mkrange("\x00\xD8\x01\xDC-\0\xFD\xFF", 1) eq "\x00\xD8\x01\xDC\x00\xD8\x00\xDC\xFF\xFF\xFE\xFF\xFD\xFF" && $u32be->mkrange("\x00\x01\x00\x01\0\0\0-\0\0\xFF\xFD", 1) eq "\0\1\0\1\0\1\0\0\0\0\xFF\xFF\0\0\xFF\xFE\0\0\xFF\xFD" && $u32le->mkrange("\x01\x00\x01\x00-\0\0\0\xFD\xFF\0\0", 1) eq "\1\0\1\0\0\0\1\0\xFF\xFF\0\0\xFE\xFF\0\0\xFD\xFF\0\0" ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+30001..U+2FFFE print $utf8->mkrange("\xf0\xb0\x80\x81-\xf0\xaf\xbf\xbe", 1) eq pack('H*', "f0b08081f0b08080f0afbfbff0afbfbe") && $u16be->mkrange("\xd8\x80\xdc\x01\0-\xd8\x7f\xdf\xfe", 1) eq pack('H*', "d880dc01d880dc00d87fdfffd87fdffe") && $u16le->mkrange("\x80\xd8\x01\xdc-\0\x7f\xd8\xfe\xdf", 1) eq pack('H*', "80d801dc80d800dc7fd8ffdf7fd8fedf") && $u32be->mkrange("\x00\x03\x00\x01\0\0\0-\x00\x02\xFF\xFE", 1) eq pack('H*', "00030001000300000002ffff0002fffe") && $u32le->mkrange("\x01\x00\x03\x00-\0\0\0\xFE\xFF\x02\x00", 1) eq pack('H*', "0100030000000300ffff0200feff0200") ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+80001..U+7FFFE print $utf8->mkrange("\xf2\x80\x80\x81-\xf1\xbf\xbf\xbe", 1) eq pack('H*', "f2808081f2808080f1bfbfbff1bfbfbe") && $u16be->mkrange("\xd9\xc0\xdc\x01\0-\xd9\xbf\xdf\xfe", 1) eq pack('H*', "d9c0dc01d9c0dc00d9bfdfffd9bfdffe") && $u16le->mkrange("\xc0\xd9\x01\xdc-\0\xbf\xd9\xfe\xdf", 1) eq pack('H*', "c0d901dcc0d900dcbfd9ffdfbfd9fedf") && $u32be->mkrange("\x00\x08\x00\x01\0\0\0-\x00\x07\xFF\xFE", 1) eq pack('H*', "00080001000800000007ffff0007fffe") && $u32le->mkrange("\xFE\xFF\x07\x00-\0\0\0\x01\x00\x08\x00") eq pack('H*', "feff0700ffff07000000080001000800") ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+90001..U+8FFFE print $utf8->mkrange("\xf2\x90\x80\x81-\xf2\x8f\xbf\xbe", 1) eq pack('H*', "f2908081f2908080f28fbfbff28fbfbe") && $u16be->mkrange("\xda\x00\xdc\x01\0-\xd9\xff\xdf\xfe", 1) eq pack('H*', "da00dc01da00dc00d9ffdfffd9ffdffe") && $u16le->mkrange("\x00\xda\x01\xdc-\0\xff\xd9\xfe\xdf", 1) eq pack('H*', "00da01dc00da00dcffd9ffdfffd9fedf") ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+D7FF..U+E000, U+10000..U+FFFF print $utf8->mkrange( "\xed\x9f\xbf-\xee\x80\x80\xf0\x90\x80\x80-\xef\xbf\xbf", 1) eq "\xed\x9f\xbf\xee\x80\x80\xf0\x90\x80\x80\xef\xbf\xbf" && $u16be->mkrange("\xD7\xFF\0-\xE0\x00\xD8\x00\xDC\x00\0-\xFF\xFF", 1) eq "\xD7\xFF\xE0\x00\xD8\x00\xDC\x00\xFF\xFF" && $u16le->mkrange("\xFF\xD7-\0\x00\xE0\x00\xD8\x00\xDC-\0\xFF\xFF", 1) eq "\xFF\xD7\x00\xE0\x00\xD8\x00\xDC\xFF\xFF" ? "ok" : "not ok", " ", ++$loaded, "\n"; # U+D7FF..U+E000, U+10000..U+FFFF, U+7F print $utf8->mkrange( "\xed\x9f\xbf-\xee\x80\x80\xf0\x90\x80\x80-\xef\xbf\xbf\x7F") eq "\xed\x9f\xbf\xee\x80\x80\x7F" && $u16be->mkrange("\xD7\xFF\0-\xE0\x00\xD8\x00\xDC\x00\0-\xFF\xFF\0\x7F") eq "\xD7\xFF\xE0\x00\0\x7F" && $u16le->mkrange("\xFF\xD7-\0\x00\xE0\x00\xD8\x00\xDC-\0\xFF\xFF\x7F\0") eq "\xFF\xD7\x00\xE0\x7F\0" ? "ok" : "not ok", " ", ++$loaded, "\n"; 1; __END__