summaryrefslogtreecommitdiff
path: root/compiler/ccharset.pas
diff options
context:
space:
mode:
authorpaul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2>2011-09-17 13:19:59 +0000
committerpaul <paul@3ad0048d-3df7-0310-abae-a5850022a9f2>2011-09-17 13:19:59 +0000
commitcc33749a209676f38a4d32cd8838b4460e526cd5 (patch)
tree612b14f111eeb6536879d0c8d37234a13f348917 /compiler/ccharset.pas
parent5a5a6cac4f59b0c32417d93b6cd11857158753b7 (diff)
downloadfpc-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.pas43
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;