diff options
author | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2016-01-22 11:12:34 +0200 |
---|---|---|
committer | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2016-01-22 11:24:00 +0200 |
commit | c3d09aeeac35d64b3b707b16d53a2945bb5ce348 (patch) | |
tree | 85b8959b756c664bc1da493bcafd6d7ff92af65c /lib | |
parent | 732479b797422adaadf6891b8d8c32230f548692 (diff) | |
download | Nim-c3d09aeeac35d64b3b707b16d53a2945bb5ce348.tar.gz |
Fixed unicode strings in JS
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system/jssys.nim | 45 |
1 files changed, 38 insertions, 7 deletions
diff --git a/lib/system/jssys.nim b/lib/system/jssys.nim index 3df460952..6eadae17a 100644 --- a/lib/system/jssys.nim +++ b/lib/system/jssys.nim @@ -165,15 +165,46 @@ proc SetConstr() {.varargs, asmNoStackFrame, compilerproc.} = return result; """ +proc makeNimstrLit(c: cstring): string {.asmNoStackFrame, compilerproc.} = + {.emit: """ + var ln = `c`.length; + var result = new Array(ln + 1); + var i = 0; + for (; i < ln; ++i) { + result[i] = `c`.charCodeAt(i); + } + result[i] = 0; // terminating zero + return result; + """.} + proc cstrToNimstr(c: cstring): string {.asmNoStackFrame, compilerproc.} = - asm """ - var result = []; - for (var i = 0; i < `c`.length; ++i) { - result[i] = `c`.charCodeAt(i); + {.emit: """ + var ln = `c`.length; + var result = new Array(ln); + var r = 0; + for (var i = 0; i < ln; ++i) { + var ch = `c`.charCodeAt(i); + + if (ch < 128) { + result[r] = ch; } - result[result.length] = 0; // terminating zero - return result; - """ + else if((ch > 127) && (ch < 2048)) { + result[r] = (ch >> 6) | 192; + ++r; + result[r] = (ch & 63) | 128; + } + else { + result[r] = (ch >> 12) | 224; + ++r; + result[r] = ((ch >> 6) & 63) | 128; + ++r; + result[r] = (ch & 63) | 128; + } + ++r; + } + result[r] = 0; // terminating zero + return result; + """.} proc toJSStr(s: string): cstring {.asmNoStackFrame, compilerproc.} = asm """ |