diff options
author | paul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2011-09-17 13:19:59 +0000 |
---|---|---|
committer | paul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2011-09-17 13:19:59 +0000 |
commit | cc33749a209676f38a4d32cd8838b4460e526cd5 (patch) | |
tree | 612b14f111eeb6536879d0c8d37234a13f348917 /compiler/ccharset.pas | |
parent | 5a5a6cac4f59b0c32417d93b6cd11857158753b7 (diff) | |
download | fpc-cc33749a209676f38a4d32cd8838b4460e526cd5.tar.gz |
merge r17434 from cpstrnew branch by michael:
* Patch from Inoussa to fix constant strings with codepage
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@19109 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/ccharset.pas')
-rw-r--r-- | compiler/ccharset.pas | 43 |
1 files changed, 38 insertions, 5 deletions
diff --git a/compiler/ccharset.pas b/compiler/ccharset.pas index 258a0359d2..7fcff607f7 100644 --- a/compiler/ccharset.pas +++ b/compiler/ccharset.pas @@ -41,7 +41,8 @@ unit ccharset; punicodemap = ^tunicodemap; tunicodemap = record - cpname : string[20]; + cpname : string[20]; + cp : word; map : punicodecharmapping; lastchar : longint; next : punicodemap; @@ -51,9 +52,10 @@ unit ccharset; tcp2unicode = class(tcsconvert) end; - function loadunicodemapping(const cpname,f : string) : punicodemap; + function loadunicodemapping(const cpname,f : string; cp :word) : punicodemap; procedure registermapping(p : punicodemap); - function getmap(const s : string) : punicodemap; + function getmap(const s : string) : punicodemap; + function getmap(cp : word) : punicodemap; function mappingavailable(const s : string) : boolean; function getunicode(c : char;p : punicodemap) : tunicodechar; function getascii(c : tunicodechar;p : punicodemap) : string; @@ -63,7 +65,7 @@ unit ccharset; var mappings : punicodemap; - function loadunicodemapping(const cpname,f : string) : punicodemap; + function loadunicodemapping(const cpname,f : string; cp :word) : punicodemap; var data : punicodecharmapping; @@ -158,6 +160,7 @@ unit ccharset; new(p); p^.lastchar:=lastchar; p^.cpname:=cpname; + p^.cp:=cp; p^.internalmap:=false; p^.next:=nil; p^.map:=data; @@ -199,7 +202,37 @@ unit ccharset; hp:=hp^.next; end; getmap:=nil; - end; + end; + + function getmap(cp : word) : punicodemap; + + var + hp : punicodemap; + + const + mapcache : word = 0; + mapcachep : punicodemap = nil; + + begin + if (mapcache=cp) and assigned(mapcachep) and (mapcachep^.cp=cp) then + begin + getmap:=mapcachep; + exit; + end; + hp:=mappings; + while assigned(hp) do + begin + if hp^.cp=cp then + begin + getmap:=hp; + mapcache:=cp; + mapcachep:=hp; + exit; + end; + hp:=hp^.next; + end; + getmap:=nil; + end; function mappingavailable(const s : string) : boolean; |