make encodings.nim case consistent

This commit is contained in:
Araq 2014-01-19 01:23:38 +01:00
commit d986a5adb5

View file

@ -1,7 +1,7 @@
# #
# #
# Nimrod's Runtime Library # Nimrod's Runtime Library
# (c) Copyright 2012 Andreas Rumpf # (c) Copyright 2014 Andreas Rumpf
# #
# See the file "copying.txt", included in this # See the file "copying.txt", included in this
# distribution, for details about the copyright. # distribution, for details about the copyright.
@ -28,7 +28,7 @@ type
## for encoding errors ## for encoding errors
when defined(windows): when defined(windows):
proc EqEncodingNames(a, b: string): bool = proc eqEncodingNames(a, b: string): bool =
var i = 0 var i = 0
var j = 0 var j = 0
while i < a.len and j < b.len: while i < a.len and j < b.len:
@ -208,19 +208,19 @@ when defined(windows):
when false: when false:
# not needed yet: # not needed yet:
type type
TCpInfo = object {.pure.} TCpInfo = object
MaxCharSize: int32 maxCharSize: int32
DefaultChar: array[0..1, char] defaultChar: array[0..1, char]
LeadByte: array[0..12-1, char] leadByte: array[0..12-1, char]
proc GetCPInfo(CodePage: TCodePage, lpCPInfo: var TCpInfo): int32 {. proc getCPInfo(codePage: TCodePage, lpCPInfo: var TCpInfo): int32 {.
stdcall, importc: "GetCPInfo", dynlib: "kernel32".} stdcall, importc: "GetCPInfo", dynlib: "kernel32".}
proc nameToCodePage(name: string): TCodePage = proc nameToCodePage(name: string): TCodePage =
var nameAsInt: int var nameAsInt: int
if parseInt(name, nameAsInt) == 0: nameAsInt = -1 if parseInt(name, nameAsInt) == 0: nameAsInt = -1
for no, na in items(winEncodings): for no, na in items(winEncodings):
if no == nameAsInt or EqEncodingNames(na, name): return TCodePage(no) if no == nameAsInt or eqEncodingNames(na, name): return TCodePage(no)
result = TCodePage(-1) result = TCodePage(-1)
proc codePageToName(c: TCodePage): string = proc codePageToName(c: TCodePage): string =
@ -229,10 +229,10 @@ when defined(windows):
return if na.len != 0: na else: $no return if na.len != 0: na else: $no
result = "" result = ""
proc GetACP(): TCodePage {.stdcall, importc: "GetACP", dynlib: "kernel32".} proc getACP(): TCodePage {.stdcall, importc: "GetACP", dynlib: "kernel32".}
proc MultiByteToWideChar( proc multiByteToWideChar(
CodePage: TCodePage, codePage: TCodePage,
dwFlags: int32, dwFlags: int32,
lpMultiByteStr: cstring, lpMultiByteStr: cstring,
cbMultiByte: cint, cbMultiByte: cint,
@ -240,8 +240,8 @@ when defined(windows):
cchWideChar: cint): cint {. cchWideChar: cint): cint {.
stdcall, importc: "MultiByteToWideChar", dynlib: "kernel32".} stdcall, importc: "MultiByteToWideChar", dynlib: "kernel32".}
proc WideCharToMultiByte( proc wideCharToMultiByte(
CodePage: TCodePage, codePage: TCodePage,
dwFlags: int32, dwFlags: int32,
lpWideCharStr: cstring, lpWideCharStr: cstring,
cchWideChar: cint, cchWideChar: cint,
@ -321,7 +321,6 @@ proc close*(c: PConverter) =
iconvClose(c) iconvClose(c)
when defined(windows): when defined(windows):
proc convert*(c: PConverter, s: string): string = proc convert*(c: PConverter, s: string): string =
## converts `s` to `destEncoding` that was given to the converter `c`. It ## converts `s` to `destEncoding` that was given to the converter `c`. It
## assumed that `s` is in `srcEncoding`. ## assumed that `s` is in `srcEncoding`.
@ -333,26 +332,26 @@ when defined(windows):
var cap = s.len + s.len shr 2 var cap = s.len + s.len shr 2
result = newStringOfCap(cap*2) result = newStringOfCap(cap*2)
# convert to utf-16 LE # convert to utf-16 LE
var m = MultiByteToWideChar(CodePage = c.src, dwFlags = 0'i32, var m = multiByteToWideChar(codePage = c.src, dwFlags = 0'i32,
lpMultiByteStr = cstring(s), lpMultiByteStr = cstring(s),
cbMultiByte = cint(s.len), cbMultiByte = cint(s.len),
lpWideCharStr = cstring(result), lpWideCharStr = cstring(result),
cchWideChar = cint(cap)) cchWideChar = cint(cap))
if m == 0: if m == 0:
# try again; ask for capacity: # try again; ask for capacity:
cap = MultiByteToWideChar(CodePage = c.src, dwFlags = 0'i32, cap = multiByteToWideChar(codePage = c.src, dwFlags = 0'i32,
lpMultiByteStr = cstring(s), lpMultiByteStr = cstring(s),
cbMultiByte = cint(s.len), cbMultiByte = cint(s.len),
lpWideCharStr = nil, lpWideCharStr = nil,
cchWideChar = cint(0)) cchWideChar = cint(0))
# and do the conversion properly: # and do the conversion properly:
result = newStringOfCap(cap*2) result = newStringOfCap(cap*2)
m = MultiByteToWideChar(CodePage = c.src, dwFlags = 0'i32, m = multiByteToWideChar(codePage = c.src, dwFlags = 0'i32,
lpMultiByteStr = cstring(s), lpMultiByteStr = cstring(s),
cbMultiByte = cint(s.len), cbMultiByte = cint(s.len),
lpWideCharStr = cstring(result), lpWideCharStr = cstring(result),
cchWideChar = cint(cap)) cchWideChar = cint(cap))
if m == 0: OSError() if m == 0: osError(osLastError())
setLen(result, m*2) setLen(result, m*2)
elif m <= cap: elif m <= cap:
setLen(result, m*2) setLen(result, m*2)
@ -364,8 +363,8 @@ when defined(windows):
# otherwise the fun starts again: # otherwise the fun starts again:
cap = s.len + s.len shr 2 cap = s.len + s.len shr 2
var res = newStringOfCap(cap) var res = newStringOfCap(cap)
m = WideCharToMultiByte( m = wideCharToMultiByte(
CodePage = c.dest, codePage = c.dest,
dwFlags = 0'i32, dwFlags = 0'i32,
lpWideCharStr = cstring(result), lpWideCharStr = cstring(result),
cchWideChar = cint(result.len div 2), cchWideChar = cint(result.len div 2),
@ -373,8 +372,8 @@ when defined(windows):
cbMultiByte = cap.cint) cbMultiByte = cap.cint)
if m == 0: if m == 0:
# try again; ask for capacity: # try again; ask for capacity:
cap = WideCharToMultiByte( cap = wideCharToMultiByte(
CodePage = c.dest, codePage = c.dest,
dwFlags = 0'i32, dwFlags = 0'i32,
lpWideCharStr = cstring(result), lpWideCharStr = cstring(result),
cchWideChar = cint(result.len div 2), cchWideChar = cint(result.len div 2),
@ -382,14 +381,14 @@ when defined(windows):
cbMultiByte = cint(0)) cbMultiByte = cint(0))
# and do the conversion properly: # and do the conversion properly:
res = newStringOfCap(cap) res = newStringOfCap(cap)
m = WideCharToMultiByte( m = wideCharToMultiByte(
CodePage = c.dest, codePage = c.dest,
dwFlags = 0'i32, dwFlags = 0'i32,
lpWideCharStr = cstring(result), lpWideCharStr = cstring(result),
cchWideChar = cint(result.len div 2), cchWideChar = cint(result.len div 2),
lpMultiByteStr = cstring(res), lpMultiByteStr = cstring(res),
cbMultiByte = cap.cint) cbMultiByte = cap.cint)
if m == 0: OSError() if m == 0: osError(osLastError())
setLen(res, m) setLen(res, m)
result = res result = res
elif m <= cap: elif m <= cap:
@ -399,15 +398,14 @@ when defined(windows):
assert(false) # cannot happen assert(false) # cannot happen
else: else:
proc convert*(c: PConverter, s: string): string = proc convert*(c: PConverter, s: string): string =
result = newString(s.len) result = newString(s.len)
var inLen = len(S) var inLen = len(s)
var outLen = len(result) var outLen = len(result)
var src = cstring(S) var src = cstring(s)
var dst = cstring(result) var dst = cstring(result)
var iconvres: int var iconvres: int
while InLen > 0: while inLen > 0:
iconvres = iconv(c, src, inLen, dst, outLen) iconvres = iconv(c, src, inLen, dst, outLen)
if iconvres == -1: if iconvres == -1:
var lerr = errno var lerr = errno
@ -425,11 +423,11 @@ else:
dst = cast[cstring](cast[int](cstring(result)) + offset) dst = cast[cstring](cast[int](cstring(result)) + offset)
outLen = len(result) - offset outLen = len(result) - offset
else: else:
OSError(lerr.TOSErrorCode) osError(lerr.TOSErrorCode)
# iconv has a buffer that needs flushing, specially if the last char is # iconv has a buffer that needs flushing, specially if the last char is
# not '\0' # not '\0'
discard iconv(c, nil, nil, dst, outlen) discard iconv(c, nil, nil, dst, outlen)
if iconvres == Cint(-1) and errno == E2BIG: if iconvres == cint(-1) and errno == E2BIG:
var offset = cast[int](dst) - cast[int](cstring(result)) var offset = cast[int](dst) - cast[int](cstring(result))
setLen(result, len(result)+inLen*2+5) setLen(result, len(result)+inLen*2+5)
# 5 is minimally one utf-8 char # 5 is minimally one utf-8 char
@ -450,7 +448,7 @@ proc convert*(s: string, destEncoding = "UTF-8",
finally: finally:
close(c) close(c)
when IsMainModule: when isMainModule:
let let
orig = "öäüß" orig = "öäüß"
cp1252 = convert(orig, "CP1252", "UTF-8") cp1252 = convert(orig, "CP1252", "UTF-8")