#!/bin/sh echo T.utf: tests of utf functions awk=${awk-../a.out} $awk ' BEGIN { FS = "\t" awk = "../a.out" } NF == 0 || $1 ~ /^#/ { next } $1 ~ /try/ { # new test nt++ sub(/try [a-zA-Z_0-9]+ /, "") prog = $0 printf("try %3d %s\n", nt, prog) prog = sprintf("%s -F\"\\t\" '"'"'%s'"'"'", awk, prog) # print "prog is", prog nt2 = 0 while (getline > 0) { if (NF == 0) # blank line terminates a sequence break input = $1 for (i = 2; i < NF; i++) # input data input = input "\t" $i test = sprintf("./echo '"'"'%s'"'"' | %s >foo1; ", input, prog) if ($NF == "\"\"") output = ">foo2;" else output = sprintf("./echo '"'"'%s'"'"' >foo2; ", $NF) gsub(/\\t/, "\t", output) gsub(/\\n/, "\n", output) run = sprintf("diff foo1 foo2 || echo test %d.%d failed", nt, ++nt2) # print "input is", input # print "test is", test # print "output is", output # print "run is", run system(test output run) } tt += nt2 } END { print tt, "tests" } ' <<\!!!! # General format: # try program as rest of line # $1 $2 $3 output1 (\t for tab, \n for newline, # $1 $2 $3 output2 ("" for null) # ... terminated by blank line # try another program... try length { print length($1) } 0 a 1 の今がその時だ 7 Сейчас 6 现在是时候了 6 给所有的好男 6 来参加聚会。 6 😀 1 🖕 finger 8 Τωρα 4 για 3 να 2 עכשיו 5 לכל 3 לבוא 4 の今がその時だ 7 지금이 3 모든 2 파티에 3 Сейчас 6 для 3 прийти 6 try index { print index($1, $2) } abc a 1 abc b 2 abc x 0 现在是时候了 "" 0 现在是时候了 了 6 现在是时候了 在是 2 现在是时候了 x 0 现x在是时候了 x 2 🖕 fingerすべての善人のためにすべての善人のために f 3 🖕 finger🖕 r🖕 8 try substr { print substr($0, 2, 3) } abcdef bcd Τωρα ειναι η ωρα Τω ω 지금 이절호의 금 이 xпyрийти пyр try rematch { print $1 ~ $2 } abc a 1 abc x 0 すべての善人のために の 1 すべての善人のために の.*の 1 すべての善人のために の.*て 0 Τωρα ω+ 1 # replace first occurrence of $2 by $3 in $1 try sub { n = sub($2, $3, $1); print n, $1 } abcdef bc XYZ 1 aXYZdef abcdef xy XYZ 0 abcdef の今がその時だ の NO 1 NO今がその時だ 🖕 finger 🖕.*g FING 1 FINGer Сейчас . x 1 xейчас # replace all occurrences of $2 by $3 in $1 try gsub { n = gsub($2, $3, $1); print n, $1 } abcdef bc XYZ 1 aXYZdef abcdef xy XYZ 0 abcdef の今がその時だ の NO 2 NO今がそNO時だ 🖕 finger 🖕.*g FING 1 FINGer Сейчас . x 6 xxxxxx try match { print match($1, $2), RSTART, RLENGTH } abc [^a] 2 2 1 abc [^ab] 3 3 1 すべての善人のために [^す] 2 2 1 すべての善人のために [^ぁ-ゖ] 5 5 1 abc a 1 1 1 abc x 0 0 -1 すべての善人のために の 4 4 1 すべての善人のために の.*の 4 4 4 すべての善人のために の.*て 0 0 -1 Τωρα ω+ 2 2 1 Τωρα x+ 0 0 -1 Τωρα ω. 2 2 2 すべての善人のために [の] 4 4 1 すべての善人のために [ぁ-え] 0 0 -1 すべての善人のために [^ぁ-え] 1 1 1 Τωρα ειναι η [α-ω] 2 2 1 Τωρα ειναι η [α-ω]+ 2 2 3 xxxΤωρα ειναι η [Α-Ω] 4 4 1 για όλους τους καλούς ά α.*α 3 3 15 να έρθει στο πά [^ν] 2 2 1 # FS="" should split into unicode chars try emptyFS BEGIN {FS=""} {print NF} すべての善人のために 10 の今がその時だ 7 Сейчас 6 现在是时候了 6 给所有的好男 6 来参加聚会。 6 😀 1 🖕 finger 8 # printf(%N.Ns) for utf8 strings try printfs1 {printf("[%5.2s][%-5.2s]\n"), $1, $1} abcd [ ab][ab ] 现在abc [ 现在][现在 ] 现ωabc [ 现ω][现ω ] ωabc [ ωa][ωa ] Сейчас [ Се][Се ] Сейxyz [ Се][Се ] 😀 [ 😀][😀 ] # printf(%N.Ns) for utf8 strings try printfs2 {printf("[%5s][%-5s]\n"), $1, $1} abcd [ abcd][abcd ] 现在ab [ 现在ab][现在ab ] a现在ab [a现在ab][a现在ab] a现在abc [a现在abc][a现在abc] 现ωab [ 现ωab][现ωab ] ωabc [ ωabc][ωabc ] Сейчас [Сейчас][Сейчас] 😀 [ 😀][😀 ] # printf(%N.Ns) for utf8 strings try printfs3 {printf("[%.2s][%-.2s]\n"), $1, $1} abcd [ab][ab] 现在abc [现在][现在] 现ωabc [现ω][现ω] ω [ω][ω] 😀 [😀][😀] # printf(%c) for utf try printfc {printf("%c %c\n", $1, substr($1,2,1))} すべての善人のために す べ の今がその時だ の 今 Сейчас С е 现在是时候了 现 在 😀🖕 😀 🖕 !!!!