mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-01 19:33:42 +02:00
206 lines
5.5 KiB
ObjectPascal
206 lines
5.5 KiB
ObjectPascal
{
|
|
$Id$
|
|
Copyright (c) 2000 by Florian Klaempfl
|
|
|
|
This unit contains basic functions for unicode support in the
|
|
compiler, this unit is mainly necessary to bootstrap widestring
|
|
support ...
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
****************************************************************************
|
|
}
|
|
unit widestr;
|
|
|
|
interface
|
|
|
|
{ uses
|
|
charset;
|
|
}
|
|
|
|
type
|
|
tcompilerwidechar = word;
|
|
{$ifdef delphi}
|
|
{ delphi doesn't allow pointer accessing as array }
|
|
tcompilerwidechararray = array[0..0] of tcompilerwidechar;
|
|
pcompilerwidechar = ^tcompilerwidechararray;
|
|
{$else}
|
|
pcompilerwidechar = ^tcompilerwidechar;
|
|
{$endif}
|
|
|
|
pcompilerwidestring = ^tcompilerwidestring;
|
|
tcompilerwidestring = record
|
|
data : pcompilerwidechar;
|
|
maxlen,len : longint;
|
|
end;
|
|
|
|
procedure initwidestring(var r : tcompilerwidestring);
|
|
procedure donewidestring(var r : tcompilerwidestring);
|
|
procedure setlengthwidestring(var r : tcompilerwidestring;l : longint);
|
|
function getlengthwidestring(const r : tcompilerwidestring) : longint;
|
|
procedure concatwidestringchar(var r : tcompilerwidestring;c : tcompilerwidechar);
|
|
procedure concatwidestringwidestring(const s1,s2 : tcompilerwidestring;
|
|
var r : tcompilerwidestring);
|
|
procedure copywidestring(const s : tcompilerwidestring;var d : tcompilerwidestring);
|
|
function asciichar2unicode(c : char) : tcompilerwidechar;
|
|
procedure ascii2unicode(const s : string;var r : tcompilerwidestring);
|
|
function getcharwidestring(const r : tcompilerwidestring;l : longint) : tcompilerwidechar;
|
|
function cpavailable(const s : string) : boolean;
|
|
|
|
implementation
|
|
|
|
{ uses
|
|
i8869_1,cp850,cp437; }
|
|
|
|
uses
|
|
globals;
|
|
|
|
procedure initwidestring(var r : tcompilerwidestring);
|
|
|
|
begin
|
|
r.data:=nil;
|
|
r.len:=0;
|
|
r.maxlen:=0;
|
|
end;
|
|
|
|
procedure donewidestring(var r : tcompilerwidestring);
|
|
|
|
begin
|
|
if assigned(r.data) then
|
|
freemem(r.data);
|
|
r.data:=nil;
|
|
r.maxlen:=0;
|
|
r.len:=0;
|
|
end;
|
|
|
|
function getcharwidestring(const r : tcompilerwidestring;l : longint) : tcompilerwidechar;
|
|
|
|
begin
|
|
getcharwidestring:=r.data[l];
|
|
end;
|
|
|
|
function getlengthwidestring(const r : tcompilerwidestring) : longint;
|
|
|
|
begin
|
|
getlengthwidestring:=r.len;
|
|
end;
|
|
|
|
procedure setlengthwidestring(var r : tcompilerwidestring;l : longint);
|
|
|
|
begin
|
|
if r.maxlen>=l then
|
|
exit;
|
|
if assigned(r.data) then
|
|
reallocmem(r.data,sizeof(tcompilerwidechar)*l)
|
|
else
|
|
getmem(r.data,sizeof(tcompilerwidechar)*l);
|
|
end;
|
|
|
|
procedure concatwidestringchar(var r : tcompilerwidestring;c : tcompilerwidechar);
|
|
|
|
begin
|
|
if r.len>=r.maxlen then
|
|
setlengthwidestring(r,r.len+16);
|
|
r.data[r.len]:=c;
|
|
inc(r.len);
|
|
end;
|
|
|
|
procedure concatwidestringwidestring(const s1,s2 : tcompilerwidestring;
|
|
var r : tcompilerwidestring);
|
|
|
|
begin
|
|
setlengthwidestring(r,s1.len+s2.len);
|
|
r.len:=s1.len+s2.len;
|
|
move(s1.data^,r.data^,s1.len);
|
|
move(s2.data^,r.data[s1.len],s2.len);
|
|
end;
|
|
|
|
function comparewidestringwidestring(const s1,s2 : tcompilerwidestring) : longint;
|
|
|
|
begin
|
|
{$ifdef fpc}{$warning todo}{$endif}
|
|
comparewidestringwidestring:=0;
|
|
end;
|
|
|
|
procedure copywidestring(const s : tcompilerwidestring;var d : tcompilerwidestring);
|
|
|
|
begin
|
|
setlengthwidestring(d,s.len);
|
|
d.len:=s.len;
|
|
move(s.data^,d.data^,s.len);
|
|
end;
|
|
|
|
function asciichar2unicode(c : char) : tcompilerwidechar;
|
|
{!!!!!!!!
|
|
var
|
|
m : punicodemap;
|
|
|
|
begin
|
|
m:=getmap(aktsourcecodepage);
|
|
asciichar2unicode:=getunicode(c,m);
|
|
end;
|
|
}
|
|
begin
|
|
{$ifdef fpc}{$warning todo}{$endif}
|
|
asciichar2unicode:=0;
|
|
end;
|
|
|
|
procedure ascii2unicode(const s : string;var r : tcompilerwidestring);
|
|
(*
|
|
var
|
|
m : punicodemap;
|
|
i : longint;
|
|
|
|
begin
|
|
m:=getmap(aktsourcecodepage);
|
|
{ should be a very good estimation :) }
|
|
setlengthwidestring(r,length(s));
|
|
// !!!! MBCS
|
|
for i:=1 to length(s) do
|
|
begin
|
|
end;
|
|
end;
|
|
*)
|
|
begin
|
|
end;
|
|
|
|
function cpavailable(const s : string) : boolean;
|
|
{!!!!!!
|
|
begin
|
|
cpavailable:=mappingavailable(s);
|
|
end;
|
|
}
|
|
|
|
begin
|
|
cpavailable:=false;
|
|
end;
|
|
|
|
end.
|
|
{
|
|
$Log$
|
|
Revision 1.3 2001-04-13 01:22:17 peter
|
|
* symtable change to classes
|
|
* range check generation and errors fixed, make cycle DEBUG=1 works
|
|
* memory leaks fixed
|
|
|
|
Revision 1.2 2001/04/02 21:20:35 peter
|
|
* resulttype rewrite
|
|
|
|
Revision 1.1 2000/11/29 00:30:43 florian
|
|
* unused units removed from uses clause
|
|
* some changes for widestrings
|
|
|
|
}
|