1*48edc7cfSGordon Ross#!/bin/sh 2*48edc7cfSGordon Ross 3*48edc7cfSGordon Ross# 4*48edc7cfSGordon Ross# This file and its contents are supplied under the terms of the 5*48edc7cfSGordon Ross# Common Development and Distribution License ("CDDL"), version 1.0. 6*48edc7cfSGordon Ross# You may only use this file in accordance with the terms of version 7*48edc7cfSGordon Ross# 1.0 of the CDDL. 8*48edc7cfSGordon Ross# 9*48edc7cfSGordon Ross# A full copy of the text of the CDDL should have accompanied this 10*48edc7cfSGordon Ross# source. A copy of the CDDL is also available via the Internet at 11*48edc7cfSGordon Ross# http://www.illumos.org/license/CDDL. 12*48edc7cfSGordon Ross# 13*48edc7cfSGordon Ross 14*48edc7cfSGordon Ross# 15*48edc7cfSGordon Ross# Copyright 2012 Nexenta Systems, Inc. All rights reserved. 16*48edc7cfSGordon Ross# 17*48edc7cfSGordon Ross 18*48edc7cfSGordon RossICONV=${ICONV:-/usr/bin/iconv} 19*48edc7cfSGordon Ross#ICONV=${ROOT}/usr/bin/iconv 20*48edc7cfSGordon Ross 21*48edc7cfSGordon Ross# test name, file a, file b 22*48edc7cfSGordon Rosscheck() { 23*48edc7cfSGordon Ross if ! cmp -s "$2" "$3" ; then 24*48edc7cfSGordon Ross echo "TEST FAIL: $1" 25*48edc7cfSGordon Ross exit 1 26*48edc7cfSGordon Ross fi 27*48edc7cfSGordon Ross echo "TEST PASS: $1" 28*48edc7cfSGordon Ross} 29*48edc7cfSGordon Ross 30*48edc7cfSGordon Ross 31*48edc7cfSGordon Ross# fromcs, tocs, in, out 32*48edc7cfSGordon Rosstest_conv() { 33*48edc7cfSGordon Ross echo "$3" > in 34*48edc7cfSGordon Ross echo "$4" > o1 35*48edc7cfSGordon Ross $ICONV -f "$1" -t "$2" < in > o2 36*48edc7cfSGordon Ross check "${1}:${2}" o1 o2 37*48edc7cfSGordon Ross rm in o1 o2 38*48edc7cfSGordon Ross} 39*48edc7cfSGordon Ross 40*48edc7cfSGordon Rossmkmap_one() { 41*48edc7cfSGordon Ross echo '<code_set_name> one' 42*48edc7cfSGordon Ross echo 'CHARMAP' 43*48edc7cfSGordon Ross echo '<NULL>\t\x00' 44*48edc7cfSGordon Ross for i in 8 9 a b c d e f 45*48edc7cfSGordon Ross do 46*48edc7cfSGordon Ross for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f 47*48edc7cfSGordon Ross do 48*48edc7cfSGordon Ross echo "<c1-$i$j>\t\x$i$j" 49*48edc7cfSGordon Ross done 50*48edc7cfSGordon Ross done 51*48edc7cfSGordon Ross echo 'END CHARMAP' 52*48edc7cfSGordon Ross} 53*48edc7cfSGordon Ross 54*48edc7cfSGordon Rossmkmap_two() { 55*48edc7cfSGordon Ross echo '<code_set_name> two' 56*48edc7cfSGordon Ross echo 'CHARMAP' 57*48edc7cfSGordon Ross echo '<NULL>\t\x00' 58*48edc7cfSGordon Ross for i in 8 9 a b c d e f 59*48edc7cfSGordon Ross do 60*48edc7cfSGordon Ross for j in 0 1 2 3 4 5 6 7 8 9 a b c d e f 61*48edc7cfSGordon Ross do 62*48edc7cfSGordon Ross echo "<c1-$i$j>\t\x20\x$i$j" 63*48edc7cfSGordon Ross done 64*48edc7cfSGordon Ross done 65*48edc7cfSGordon Ross echo 'END CHARMAP' 66*48edc7cfSGordon Ross} 67*48edc7cfSGordon Ross 68*48edc7cfSGordon Ross# write 1023 bytes of space 69*48edc7cfSGordon Rosswr1023() { 70*48edc7cfSGordon Ross n=1023 71*48edc7cfSGordon Ross while [[ $n -gt 0 ]]; do 72*48edc7cfSGordon Ross echo ' \c' 73*48edc7cfSGordon Ross ((n-=1)) 74*48edc7cfSGordon Ross done 75*48edc7cfSGordon Ross} 76*48edc7cfSGordon Ross 77*48edc7cfSGordon Ross# two-byte utf-8 crossing 1024 byte boundary 78*48edc7cfSGordon Rossmkbuf_utf8() { 79*48edc7cfSGordon Ross wr1023 80*48edc7cfSGordon Ross echo '\0303\0240' 81*48edc7cfSGordon Ross} 82*48edc7cfSGordon Ross 83*48edc7cfSGordon Ross# one-byte 8859-1 at 1024 byte boundary 84*48edc7cfSGordon Rossmkbuf_8859() { 85*48edc7cfSGordon Ross wr1023 86*48edc7cfSGordon Ross echo '\0340' 87*48edc7cfSGordon Ross} 88*48edc7cfSGordon Ross 89*48edc7cfSGordon Ross# Test some simple, built-in conversions 90*48edc7cfSGordon Ross 91*48edc7cfSGordon Rosstest_conv ascii utf-8 abcdef abcdef 92*48edc7cfSGordon Rosstest_conv utf-8 ascii abcdef abcdef 93*48edc7cfSGordon Rosstest_conv ascii ucs-2le abc 'a\0b\0c\0\n\0\c' 94*48edc7cfSGordon Rosstest_conv ucs-2le ascii 'a\0b\0c\0\n\0\c' abc 95*48edc7cfSGordon Ross 96*48edc7cfSGordon Ross# Test user-provided charmap 97*48edc7cfSGordon Ross 98*48edc7cfSGordon Rossmkmap_one > one.cm 99*48edc7cfSGordon Rossmkmap_two > two.cm 100*48edc7cfSGordon Rosstest_conv ./one.cm ./two.cm '\0200\0201\0202\c' ' \0200 \0201 \0202\c' 101*48edc7cfSGordon Rossrm one.cm two.cm 102*48edc7cfSGordon Ross 103*48edc7cfSGordon Ross# test crossing 1024 byte buffer boundary 104*48edc7cfSGordon Ross 105*48edc7cfSGordon Rossmkbuf_utf8 > in 106*48edc7cfSGordon Rossmkbuf_8859 > o1 107*48edc7cfSGordon Ross$ICONV -f UTF-8 -t 8859-1 < in > o2 108*48edc7cfSGordon Rosscheck "boundary" o1 o2 109*48edc7cfSGordon Rossrm in o1 o2 110*48edc7cfSGordon Ross 111*48edc7cfSGordon Rossexit 0 112