1#!/bin/sh 2 3echo T.utf: tests of utf functions 4 5awk=${awk-../a.out} 6 7$awk ' 8BEGIN { 9 FS = "\t" 10 awk = "../a.out" 11} 12NF == 0 || $1 ~ /^#/ { 13 next 14} 15$1 ~ /try/ { # new test 16 nt++ 17 sub(/try [a-zA-Z_0-9]+ /, "") 18 prog = $0 19 printf("try %3d %s\n", nt, prog) 20 prog = sprintf("%s -F\"\\t\" '"'"'%s'"'"'", awk, prog) 21 # print "prog is", prog 22 nt2 = 0 23 while (getline > 0) { 24 if (NF == 0) # blank line terminates a sequence 25 break 26 input = $1 27 for (i = 2; i < NF; i++) # input data 28 input = input "\t" $i 29 test = sprintf("./echo '"'"'%s'"'"' | %s >foo1; ", 30 input, prog) 31 if ($NF == "\"\"") 32 output = ">foo2;" 33 else 34 output = sprintf("./echo '"'"'%s'"'"' >foo2; ", $NF) 35 gsub(/\\t/, "\t", output) 36 gsub(/\\n/, "\n", output) 37 run = sprintf("diff foo1 foo2 || echo test %d.%d failed", 38 nt, ++nt2) 39 # print "input is", input 40 # print "test is", test 41 # print "output is", output 42 # print "run is", run 43 system(test output run) 44 } 45 tt += nt2 46} 47END { print tt, "tests" } 48' <<\!!!! 49# General format: 50# try program as rest of line 51# $1 $2 $3 output1 (\t for tab, \n for newline, 52# $1 $2 $3 output2 ("" for null) 53# ... terminated by blank line 54 55# try another program... 56 57try length { print length($1) } 58 0 59a 1 60の今がその時だ 7 61Сейчас 6 62现在是时候了 6 63给所有的好男 6 64来参加聚会。 6 65 1 66 finger 8 67Τωρα 4 68για 3 69να 2 70עכשיו 5 71לכל 3 72לבוא 4 73の今がその時だ 7 74지금이 3 75모든 2 76파티에 3 77Сейчас 6 78для 3 79прийти 6 80 81try index { print index($1, $2) } 82abc a 1 83abc b 2 84abc x 0 85现在是时候了 "" 0 86现在是时候了 了 6 87现在是时候了 在是 2 88现在是时候了 x 0 89现x在是时候了 x 2 90 fingerすべての善人のためにすべての善人のために f 3 91 finger r 8 92 93try substr { print substr($0, 2, 3) } 94abcdef bcd 95Τωρα ειναι η ωρα 96Τω ω 97지금 이절호의 금 이 98xпyрийти пyр 99 100try rematch { print $1 ~ $2 } 101abc a 1 102abc x 0 103すべての善人のために の 1 104すべての善人のために の.*の 1 105すべての善人のために の.*て 0 106Τωρα ω+ 1 107 108# replace first occurrence of $2 by $3 in $1 109try sub { n = sub($2, $3, $1); print n, $1 } 110abcdef bc XYZ 1 aXYZdef 111abcdef xy XYZ 0 abcdef 112の今がその時だ の NO 1 NO今がその時だ 113 finger .*g FING 1 FINGer 114Сейчас . x 1 xейчас 115 116# replace all occurrences of $2 by $3 in $1 117try gsub { n = gsub($2, $3, $1); print n, $1 } 118abcdef bc XYZ 1 aXYZdef 119abcdef xy XYZ 0 abcdef 120の今がその時だ の NO 2 NO今がそNO時だ 121 finger .*g FING 1 FINGer 122Сейчас . x 6 xxxxxx 123 124try match { print match($1, $2), RSTART, RLENGTH } 125abc [^a] 2 2 1 126abc [^ab] 3 3 1 127すべての善人のために [^す] 2 2 1 128すべての善人のために [^ぁ-ゖ] 5 5 1 129abc a 1 1 1 130abc x 0 0 -1 131すべての善人のために の 4 4 1 132すべての善人のために の.*の 4 4 4 133すべての善人のために の.*て 0 0 -1 134Τωρα ω+ 2 2 1 135Τωρα x+ 0 0 -1 136Τωρα ω. 2 2 2 137すべての善人のために [の] 4 4 1 138すべての善人のために [ぁ-え] 0 0 -1 139すべての善人のために [^ぁ-え] 1 1 1 140Τωρα ειναι η [α-ω] 2 2 1 141Τωρα ειναι η [α-ω]+ 2 2 3 142xxxΤωρα ειναι η [Α-Ω] 4 4 1 143για όλους τους καλούς ά α.*α 3 3 15 144να έρθει στο πά [^ν] 2 2 1 145 146# FS="" should split into unicode chars 147try emptyFS BEGIN {FS=""} {print NF} 148すべての善人のために 10 149の今がその時だ 7 150Сейчас 6 151现在是时候了 6 152给所有的好男 6 153来参加聚会。 6 154 1 155 finger 8 156 157# printf(%N.Ns) for utf8 strings 158try printfs1 {printf("[%5.2s][%-5.2s]\n"), $1, $1} 159abcd [ ab][ab ] 160现在abc [ 现在][现在 ] 161现ωabc [ 现ω][现ω ] 162ωabc [ ωa][ωa ] 163Сейчас [ Се][Се ] 164Сейxyz [ Се][Се ] 165 [ ][ ] 166 167# printf(%N.Ns) for utf8 strings 168try printfs2 {printf("[%5s][%-5s]\n"), $1, $1} 169abcd [ abcd][abcd ] 170现在ab [ 现在ab][现在ab ] 171a现在ab [a现在ab][a现在ab] 172a现在abc [a现在abc][a现在abc] 173现ωab [ 现ωab][现ωab ] 174ωabc [ ωabc][ωabc ] 175Сейчас [Сейчас][Сейчас] 176 [ ][ ] 177 178# printf(%N.Ns) for utf8 strings 179try printfs3 {printf("[%.2s][%-.2s]\n"), $1, $1} 180abcd [ab][ab] 181现在abc [现在][现在] 182现ωabc [现ω][现ω] 183ω [ω][ω] 184 [][] 185 186# printf(%c) for utf 187try printfc {printf("%c %c\n", $1, substr($1,2,1))} 188すべての善人のために す べ 189の今がその時だ の 今 190Сейчас С е 191现在是时候了 现 在 192 193 194!!!! 195