From 862987784304c913cb6e80b00ee71b4e6be48f7b Mon Sep 17 00:00:00 2001 From: Peter Drahos Date: Wed, 6 Mar 2013 15:54:40 +0100 Subject: [PATCH] [luadist-git] add slnunicode-1.1a-Windows-x86 --- dist.info | 24 ++++ lib/lua/unicode.dll | Bin 0 -> 36864 bytes share/slnunicode/test/unitest | 215 ++++++++++++++++++++++++++++++++++ 3 files changed, 239 insertions(+) create mode 100644 dist.info create mode 100644 lib/lua/unicode.dll create mode 100644 share/slnunicode/test/unitest diff --git a/dist.info b/dist.info new file mode 100644 index 0000000..c617528 --- /dev/null +++ b/dist.info @@ -0,0 +1,24 @@ +type = "x86" +arch = "Windows" +author = "Unknown (paul)" +depends = { +[[lua ~> 5.1]], +} + +desc = "A Unicode support library for Lua, developed for the Selene database project." +version = "1.1a" +maintainer = "Peter Drahoš" +files = { +Runtime = { +[[lib\lua\unicode.dll]], +} +, +Test = { +[[share\slnunicode\test\unitest]], +} +, +} + +url = "http://luaforge.net/projects/sln/" +name = "slnunicode" +license = "MIT/X11" diff --git a/lib/lua/unicode.dll b/lib/lua/unicode.dll new file mode 100644 index 0000000000000000000000000000000000000000..9784e711d52621d9d5d914aea4032a538c168d13 GIT binary patch literal 36864 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%0Aw0ndM( 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 127 on upper/lower +-- +-- ascii or latin1 can be used as locale-independent string replacement. +-- (There is a compile switch to do this automatically for ascii). +-- +-- UTF-8 operates on UTF-8 sequences as of RFC 3629: +-- 1 byte 0-7F, 2 byte 80-7FF, 3 byte 800-FFFF, 4 byte 1000-10FFFF +-- (not exclusing UTF-16 surrogate characters) +-- Any byte not part of such a sequence is treated as it's (Latin-1) value. +-- +-- Grapheme takes care of grapheme clusters, which are characters followed by +-- "grapheme extension" characters (Mn+Me) like combining diacritical marks. +-- +-- calls are: +-- len(str) +-- sub(str, start [,end=-1]) +-- byte(str, start [,end=-1]) +-- lower(str) +-- upper(str) +-- char(i [,j...]) +-- reverse(str) +-- +-- same as in string: rep, format, dump +-- TODO: use char count with %s in format? (sub does the job) +-- TODO: grapheme.byte: only first code of any cluster? +-- +-- find, gfind, gsub: done, but need thorough testing ...: +-- ascii does not match them on any %class (but on ., literals and ranges) +-- behaviour of %class with class not ASCII is undefined +-- frontier %f currently disabled -- should we? +-- +-- character classes are: +-- %a L* (Lu+Ll+Lt+Lm+Lo) +-- %c Cc +-- %d 0-9 +-- %l Ll +-- %n N* (Nd+Nl+No, new) +-- %p P* (Pc+Pd+Ps+Pe+Pi+Pf+Po) +-- %s Z* (Zs+Zl+Zp) plus the controls 9-13 (HT,LF,VT,FF,CR) +-- %u Lu (also Lt ?) +-- %w %a+%n+Pc (e.g. '_') +-- %x 0-9A-Za-z +-- %z the 0 byte +-- c.f. http://unicode.org/Public/UNIDATA/UCD.html#General_Category_Values +-- http://unicode.org/Public/UNIDATA/UnicodeData.txt +-- +-- NOTE: find positions are in bytes for all ctypes! +-- use ascii.sub to cut found ranges! +-- this is a) faster b) more reliable +-- +-- UTF-8 behaviour: match is by codes, code ranges are supported +-- +-- grapheme behaviour: any %class, '.' and range match includes +-- any following grapheme extensions. +-- Ranges apply to single code points only. +-- If a [] enumeration contains a grapheme cluster, +-- this matches only the exact same cluster. +-- However, a literal single 'o' standalone or in an [] enumeration +-- will match just that 'o', even if it has a extension in the string. +-- Consequently, grapheme match positions are not always cluster positions. +-- + +local unicode = require("unicode") +local utf8 = unicode.utf8 +unicode.string = string -- for tests unicode[ctype] +local sprintf = string.format +local function printf (fmt, ...) return print(sprintf(fmt, ...)) end + +local function check (test, ok, got) + if ok == got then return printf("ok %s = %s",test,ok) end + return printf("NOK %s = %s GOT '%s'",test, ok, got or "") +end +local function checka (test, ok, ...) + local arg = {...} + arg[1] = arg[1] or "" + return check(test, ok, table.concat(arg, ",")) +end + + +local function testlen (str,bytes,codes,chars) + codes = codes or bytes + chars = chars or codes + return check(sprintf("len '%s'", str), + sprintf("%d/%d/%d", bytes, codes, chars), +sprintf("%d/%d/%d", string.len(str), utf8.len(str), unicode.grapheme.len(str))) +end + +-- 176 = 00B0;DEGREE SIGN -- UTF-8: C2,B0 = \194\176 +-- 196 = 00C4;LATIN CAPITAL LETTER A WITH DIAERESIS +-- 214 = 00D6;LATIN CAPITAL LETTER O WITH DIAERESIS +-- 776 = 0308;COMBINING DIAERESIS -- UTF-8: CC,88 = \204\136 +testlen("A\tB",3) -- plain Latin-1 +testlen("\176\196\214",3) -- plain Latin-1 +testlen("\196\176\214",3,2) -- C4,B0 is valid seq 0130 I WITH DOT ABOVE +testlen("\192\178",2) -- C0,B2 is bad seq for 2 +testlen("°ÄÖ",6,3) -- simple Latin-1 chars in UTF-8 +testlen("\204\136A\204\136O\204\136",8,5,3) -- decomposed (with broken lead) + + +local function testsub (ctype,ok,str,start,e) + return check(sprintf("%s.sub('%s',%d,%d)", ctype, str, start, e), ok, + unicode[ctype].sub(str,start,e)) +end +testsub("ascii","BCD","ABCDE",2,4) +testsub("utf8","BCD","ABCDE",2,4) +testsub("latin1","Ä","°ÄÖ",3,4) +testsub("utf8","Ä","°ÄÖ",2,2) +testsub("utf8","ÄÖ","°ÄÖ",2,-1) +testsub("utf8","\204\136","A\204\136O\204\136",2,2) -- decomposed +testsub("grapheme","O\204\136","A\204\136O\204\136",2,2) -- decomposed + + +local function testbyte (ctype, ok, str, ...) + return checka(sprintf("%s.byte('%s',%s)",ctype,str,table.concat({...}, ",")), + ok, unicode[ctype].byte(str, ...)) +end +testbyte("string","194,176","Ä°Ö",3,4) -- the UTF-8 seq for ° +testbyte("ascii","194,176","Ä°Ö",3,4) +testbyte("utf8","176,214","Ä°Ö",2,3) -- code points for °,Ö +testbyte("utf8","65,776","\204\136A\204\136O\204\136",2,3) -- decomposed +testbyte("grapheme","65,776","\204\136A\204\136O\204\136",2) -- decomposed + + +local function testchar (ctype, ok, ...) + return check(sprintf("%s.char(%s)",ctype,table.concat({...}, ",")), + ok, unicode[ctype].char(...)) +end +testchar("ascii", "AB", 65,66) +testchar("ascii", "\176", 176) +testchar("utf8", "\194\176", 176) + + +local function testcase (ctype,str,up,lo) + check(sprintf("%s.lower('%s')", ctype, str), lo, unicode[ctype].lower(str)) + check(sprintf("%s.upper('%s')", ctype, str), up, unicode[ctype].upper(str)) +end +-- upper/lower also fixes plain Latin +testcase("utf8","Ab\196üo\204\136","ABÄÜO\204\136","abäüo\204\136") +testcase("ascii","Ab\196üo\204\136","AB\196üO\204\136","ab\196üo\204\136") +testcase("latin1","Ab\196","AB\196","ab\228") + + +local function testrev (ctype,ok,str) + return check(sprintf("%s.reverse('%s')",ctype,str), + ok, unicode[ctype].reverse(str)) +end +testrev("ascii","b\136\204oa\176\194ba","ab°ao\204\136b"); +testrev("utf8","b\204\136oa°ba","ab°ao\204\136b"); +testrev("grapheme","bo\204\136a°ba","ab°ao\204\136b"); + + + +local function testfind (ctype,ok,str,pat) + return checka(sprintf("%s.find('%s','%s')",ctype,str,pat), + ok, unicode[ctype].find(str, pat)) +end +testfind("ascii","1,1","e=mc2","%a") +testfind("ascii","3,4","e=mc2","%a%a") +testfind("ascii","5,5","e=mc2","%d") +testfind("ascii","","Ä","%a") +testfind("ascii","1,2","Ä","%A*") +testfind("latin1","1,1","Ä","%a") +testfind("utf8","1,2","Ä","%a") +testfind("utf8","1,1","o\204\136","%a*") +testfind("utf8","2,3","o\204\136","%A") +testfind("utf8","1,1","o\204\136",".") +testfind("grapheme","1,3","o\204\136","%a*") +testfind("grapheme","2,3","o\204\136","%A") -- didn't expect this? +testfind("grapheme","1,3","o\204\136",".") +testfind("utf8","4,5","ÜHÄPPY","[À-Ö]") +testfind("utf8","4,5","ÜHÄPPY","[Ä-]") +testfind("utf8","7,7","ÜHÄP-PY","[ä-]") +testfind("ascii","1,4","abcdef","%a*d") +testfind("utf8","1,10","äöüßü","%a*ü") +testfind("utf8","1,6","äöüß","%a*ü") +testfind("utf8","4,5,Ä","ÜHÄPPY","([À-Ö])") +testfind("utf8","1,5,ÜHÄ","ÜHÄ_PPY","([%w]+)") +testfind("utf8","1,9,ÜHÄ_PPY","ÜHÄ_PPY","([%w_]+)") + + +local function testgsub (ctype,ok,str,pat,repl) + return check(sprintf("%s.gsub('%s','%s','%s')",ctype,str,pat,repl), + ok, unicode[ctype].gsub(str,pat,repl)) +end +testgsub("ascii","hello hello world world","hello world", "(%w+)", "%1 %1") +testgsub("ascii","world hello Lua from", + "hello world from Lua", "(%w+)%s*(%w+)", "%2 %1") +testgsub("ascii","l helö wöfr rldöL müä", + "hellö wörld fröm Lüä", "(%w+)%s*(%w+)", "%2 %1") +testgsub("utf8","wörld hellö Lüä fröm", + "hellö wörld fröm Lüä", "(%w+)%s*(%w+)", "%2 %1") +testgsub("utf8","HÜppÄ","HÄppÜ","([À-Ö])(%l*)(%u)","%3%2%1") + + +fail = 0 +for i=0,65535 do if i ~= utf8.byte(utf8.char(i)) then fail=fail+1 end end +check("code-decode failures", 0, fail) + +--[[ print the table +for i=192,65535,64 do + local k = i/64 + io.write(sprintf("%04x\\%3d\\%3d ",i, 224+k/64, 128+math.mod(k,64))) + for j=i,i+63 do + io.write(utf8.char(j)) + end + io.write("\n") +end +]] +