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