Преглед изворни кода

+ source code page support

florian пре 23 година
родитељ
комит
4f7b35be5b

+ 266 - 0
compiler/charset.pas

@@ -0,0 +1,266 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2000 by Florian Klaempfl
+    member of the Free Pascal development team.
+
+    This unit implements several classes for charset conversions
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+{$mode objfpc}
+unit charset;
+
+  interface
+
+    type
+       tunicodechar = word;
+       tunicodestring = ^tunicodechar;
+
+       tcsconvert = class
+         // !!!!!!1constructor create;
+       end;
+
+       tunicodecharmappingflag = (umf_noinfo,umf_leadbyte,umf_undefined,
+         umf_unused);
+
+       punicodecharmapping = ^tunicodecharmapping;
+       tunicodecharmapping = record
+          unicode : tunicodechar;
+          flag : tunicodecharmappingflag;
+          reserved : byte;
+       end;
+
+       punicodemap = ^tunicodemap;
+       tunicodemap = record
+          cpname : string[20];
+          map : punicodecharmapping;
+          lastchar : longint;
+          next : punicodemap;
+          internalmap : boolean;
+       end;
+
+       tcp2unicode = class(tcsconvert)
+       end;
+
+    function loadunicodemapping(const cpname,f : string) : punicodemap;
+    procedure registermapping(p : punicodemap);
+    function getmap(const s : string) : punicodemap;
+    function mappingavailable(const s : string) : boolean;
+    function getunicode(c : char;p : punicodemap) : tunicodechar;
+    function getascii(c : tunicodechar;p : punicodemap) : string;
+
+  implementation
+
+    var
+       mappings : punicodemap;
+
+    function loadunicodemapping(const cpname,f : string) : punicodemap;
+
+      var
+         data : punicodecharmapping;
+         datasize : longint;
+         t : text;
+         s,hs : string;
+         scanpos,charpos,unicodevalue : longint;
+         code : word;
+         flag : tunicodecharmappingflag;
+         p : punicodemap;
+         lastchar : longint;
+
+      begin
+         lastchar:=-1;
+         loadunicodemapping:=nil;
+         datasize:=256;
+         getmem(data,sizeof(tunicodecharmapping)*datasize);
+         assign(t,f);
+         {$I-}
+         reset(t);
+         {$I+}
+         if ioresult<>0 then
+           begin
+              freemem(data,sizeof(tunicodecharmapping)*datasize);
+              exit;
+           end;
+         while not(eof(t)) do
+           begin
+              readln(t,s);
+              if (s[1]='0') and (s[2]='x') then
+                begin
+                   flag:=umf_unused;
+                   scanpos:=3;
+                   hs:='$';
+                   while s[scanpos] in ['0'..'9','A'..'F','a'..'f'] do
+                     begin
+                        hs:=hs+s[scanpos];
+                        inc(scanpos);
+                     end;
+                   val(hs,charpos,code);
+                   if code<>0 then
+                     begin
+                        freemem(data,sizeof(tunicodecharmapping)*datasize);
+                        close(t);
+                        exit;
+                     end;
+                   while not(s[scanpos] in ['0','#']) do
+                     inc(scanpos);
+                   if s[scanpos]='#' then
+                     begin
+                        { special char }
+                        unicodevalue:=$ffff;
+                        hs:=copy(s,scanpos,length(s)-scanpos+1);
+                        if hs='#DBCS LEAD BYTE' then
+                          flag:=umf_leadbyte;
+                     end
+                   else
+                     begin
+                        { C hex prefix }
+                        inc(scanpos,2);
+                        hs:='$';
+                        while s[scanpos] in ['0'..'9','A'..'F','a'..'f'] do
+                          begin
+                             hs:=hs+s[scanpos];
+                             inc(scanpos);
+                          end;
+                        val(hs,unicodevalue,code);
+                        if code<>0 then
+                          begin
+                             freemem(data,sizeof(tunicodecharmapping)*datasize);
+                             close(t);
+                             exit;
+                          end;
+                        if charpos>datasize then
+                          begin
+                             { allocate 1024 bytes more because         }
+                             { if we need more than 256 entries it's    }
+                             { probably a mbcs with a lot of            }
+                             { entries                                  }
+                             datasize:=charpos+1024;
+                             reallocmem(data,sizeof(tunicodecharmapping)*datasize);
+                          end;
+                        flag:=umf_noinfo;
+                     end;
+                   data[charpos].flag:=flag;
+                   data[charpos].unicode:=unicodevalue;
+                   if charpos>lastchar then
+                     lastchar:=charpos;
+                end;
+           end;
+         close(t);
+         new(p);
+         p^.lastchar:=lastchar;
+         p^.cpname:=cpname;
+         p^.internalmap:=false;
+         p^.next:=nil;
+         p^.map:=data;
+         loadunicodemapping:=p;
+      end;
+
+    procedure registermapping(p : punicodemap);
+
+      begin
+         p^.next:=mappings;
+         mappings:=p;
+      end;
+
+    function getmap(const s : string) : punicodemap;
+
+      var
+         hp : punicodemap;
+
+      const
+         mapcache : string = '';
+         mapcachep : punicodemap = nil;
+
+      begin
+         if (mapcache=s) and (mapcachep^.cpname=s) then
+           begin
+              getmap:=mapcachep;
+              exit;
+           end;
+         hp:=mappings;
+         while assigned(hp) do
+           begin
+              if hp^.cpname=s then
+                begin
+                   getmap:=hp;
+                   mapcache:=s;
+                   mapcachep:=hp;
+                   exit;
+                end;
+              hp:=hp^.next;
+           end;
+         getmap:=nil;
+      end;
+
+    function mappingavailable(const s : string) : boolean;
+
+      begin
+         mappingavailable:=getmap(s)<>nil;
+      end;
+
+    function getunicode(c : char;p : punicodemap) : tunicodechar;
+
+      begin
+         if ord(c)<=p^.lastchar then
+           getunicode:=p^.map[ord(c)].unicode
+         else
+           getunicode:=0;
+      end;
+
+    function getascii(c : tunicodechar;p : punicodemap) : string;
+
+      var
+         i : longint;
+
+      begin
+         { at least map to space }
+         getascii:=#32;
+         for i:=0 to p^.lastchar do
+           if p^.map[i].unicode=c then
+             begin
+                if i<256 then
+                  getascii:=chr(i)
+                else
+                  getascii:=chr(i div 256)+chr(i mod 256);
+                exit;
+             end;
+      end;
+
+  var
+     hp : punicodemap;
+
+initialization
+  mappings:=nil;
+finalization
+  while assigned(mappings) do
+    begin
+       hp:=mappings^.next;
+       if not(mappings^.internalmap) then
+         begin
+            freemem(mappings^.map);
+            dispose(mappings);
+         end;
+       mappings:=hp;
+    end;
+end.
+{
+  $Log$
+  Revision 1.1  2002-07-20 17:11:48  florian
+    + source code page support
+
+  Revision 1.2  2000/10/21 18:20:17  florian
+    * a lot of small changes:
+       - setlength is internal
+       - win32 graph unit extended
+       ....
+
+  Revision 1.1  2000/08/17 07:29:39  florian
+    + initial revision
+}

+ 0 - 0
compiler/cp337.pas → compiler/cp437.pas


+ 281 - 0
compiler/cp850.pas

@@ -0,0 +1,281 @@
+{ This is an automatically created file, so don't edit it }
+unit cp850;
+
+  interface
+
+  implementation
+
+  uses
+     charset;
+
+  const
+     map : array[0..255] of tunicodecharmapping = (
+       (unicode : 0; flag : umf_noinfo),
+       (unicode : 1; flag : umf_noinfo),
+       (unicode : 2; flag : umf_noinfo),
+       (unicode : 3; flag : umf_noinfo),
+       (unicode : 4; flag : umf_noinfo),
+       (unicode : 5; flag : umf_noinfo),
+       (unicode : 6; flag : umf_noinfo),
+       (unicode : 7; flag : umf_noinfo),
+       (unicode : 8; flag : umf_noinfo),
+       (unicode : 9; flag : umf_noinfo),
+       (unicode : 10; flag : umf_noinfo),
+       (unicode : 11; flag : umf_noinfo),
+       (unicode : 12; flag : umf_noinfo),
+       (unicode : 13; flag : umf_noinfo),
+       (unicode : 14; flag : umf_noinfo),
+       (unicode : 15; flag : umf_noinfo),
+       (unicode : 16; flag : umf_noinfo),
+       (unicode : 17; flag : umf_noinfo),
+       (unicode : 18; flag : umf_noinfo),
+       (unicode : 19; flag : umf_noinfo),
+       (unicode : 20; flag : umf_noinfo),
+       (unicode : 21; flag : umf_noinfo),
+       (unicode : 22; flag : umf_noinfo),
+       (unicode : 23; flag : umf_noinfo),
+       (unicode : 24; flag : umf_noinfo),
+       (unicode : 25; flag : umf_noinfo),
+       (unicode : 26; flag : umf_noinfo),
+       (unicode : 27; flag : umf_noinfo),
+       (unicode : 28; flag : umf_noinfo),
+       (unicode : 29; flag : umf_noinfo),
+       (unicode : 30; flag : umf_noinfo),
+       (unicode : 31; flag : umf_noinfo),
+       (unicode : 32; flag : umf_noinfo),
+       (unicode : 33; flag : umf_noinfo),
+       (unicode : 34; flag : umf_noinfo),
+       (unicode : 35; flag : umf_noinfo),
+       (unicode : 36; flag : umf_noinfo),
+       (unicode : 37; flag : umf_noinfo),
+       (unicode : 38; flag : umf_noinfo),
+       (unicode : 39; flag : umf_noinfo),
+       (unicode : 40; flag : umf_noinfo),
+       (unicode : 41; flag : umf_noinfo),
+       (unicode : 42; flag : umf_noinfo),
+       (unicode : 43; flag : umf_noinfo),
+       (unicode : 44; flag : umf_noinfo),
+       (unicode : 45; flag : umf_noinfo),
+       (unicode : 46; flag : umf_noinfo),
+       (unicode : 47; flag : umf_noinfo),
+       (unicode : 48; flag : umf_noinfo),
+       (unicode : 49; flag : umf_noinfo),
+       (unicode : 50; flag : umf_noinfo),
+       (unicode : 51; flag : umf_noinfo),
+       (unicode : 52; flag : umf_noinfo),
+       (unicode : 53; flag : umf_noinfo),
+       (unicode : 54; flag : umf_noinfo),
+       (unicode : 55; flag : umf_noinfo),
+       (unicode : 56; flag : umf_noinfo),
+       (unicode : 57; flag : umf_noinfo),
+       (unicode : 58; flag : umf_noinfo),
+       (unicode : 59; flag : umf_noinfo),
+       (unicode : 60; flag : umf_noinfo),
+       (unicode : 61; flag : umf_noinfo),
+       (unicode : 62; flag : umf_noinfo),
+       (unicode : 63; flag : umf_noinfo),
+       (unicode : 64; flag : umf_noinfo),
+       (unicode : 65; flag : umf_noinfo),
+       (unicode : 66; flag : umf_noinfo),
+       (unicode : 67; flag : umf_noinfo),
+       (unicode : 68; flag : umf_noinfo),
+       (unicode : 69; flag : umf_noinfo),
+       (unicode : 70; flag : umf_noinfo),
+       (unicode : 71; flag : umf_noinfo),
+       (unicode : 72; flag : umf_noinfo),
+       (unicode : 73; flag : umf_noinfo),
+       (unicode : 74; flag : umf_noinfo),
+       (unicode : 75; flag : umf_noinfo),
+       (unicode : 76; flag : umf_noinfo),
+       (unicode : 77; flag : umf_noinfo),
+       (unicode : 78; flag : umf_noinfo),
+       (unicode : 79; flag : umf_noinfo),
+       (unicode : 80; flag : umf_noinfo),
+       (unicode : 81; flag : umf_noinfo),
+       (unicode : 82; flag : umf_noinfo),
+       (unicode : 83; flag : umf_noinfo),
+       (unicode : 84; flag : umf_noinfo),
+       (unicode : 85; flag : umf_noinfo),
+       (unicode : 86; flag : umf_noinfo),
+       (unicode : 87; flag : umf_noinfo),
+       (unicode : 88; flag : umf_noinfo),
+       (unicode : 89; flag : umf_noinfo),
+       (unicode : 90; flag : umf_noinfo),
+       (unicode : 91; flag : umf_noinfo),
+       (unicode : 92; flag : umf_noinfo),
+       (unicode : 93; flag : umf_noinfo),
+       (unicode : 94; flag : umf_noinfo),
+       (unicode : 95; flag : umf_noinfo),
+       (unicode : 96; flag : umf_noinfo),
+       (unicode : 97; flag : umf_noinfo),
+       (unicode : 98; flag : umf_noinfo),
+       (unicode : 99; flag : umf_noinfo),
+       (unicode : 100; flag : umf_noinfo),
+       (unicode : 101; flag : umf_noinfo),
+       (unicode : 102; flag : umf_noinfo),
+       (unicode : 103; flag : umf_noinfo),
+       (unicode : 104; flag : umf_noinfo),
+       (unicode : 105; flag : umf_noinfo),
+       (unicode : 106; flag : umf_noinfo),
+       (unicode : 107; flag : umf_noinfo),
+       (unicode : 108; flag : umf_noinfo),
+       (unicode : 109; flag : umf_noinfo),
+       (unicode : 110; flag : umf_noinfo),
+       (unicode : 111; flag : umf_noinfo),
+       (unicode : 112; flag : umf_noinfo),
+       (unicode : 113; flag : umf_noinfo),
+       (unicode : 114; flag : umf_noinfo),
+       (unicode : 115; flag : umf_noinfo),
+       (unicode : 116; flag : umf_noinfo),
+       (unicode : 117; flag : umf_noinfo),
+       (unicode : 118; flag : umf_noinfo),
+       (unicode : 119; flag : umf_noinfo),
+       (unicode : 120; flag : umf_noinfo),
+       (unicode : 121; flag : umf_noinfo),
+       (unicode : 122; flag : umf_noinfo),
+       (unicode : 123; flag : umf_noinfo),
+       (unicode : 124; flag : umf_noinfo),
+       (unicode : 125; flag : umf_noinfo),
+       (unicode : 126; flag : umf_noinfo),
+       (unicode : 127; flag : umf_noinfo),
+       (unicode : 199; flag : umf_noinfo),
+       (unicode : 252; flag : umf_noinfo),
+       (unicode : 233; flag : umf_noinfo),
+       (unicode : 226; flag : umf_noinfo),
+       (unicode : 228; flag : umf_noinfo),
+       (unicode : 224; flag : umf_noinfo),
+       (unicode : 229; flag : umf_noinfo),
+       (unicode : 231; flag : umf_noinfo),
+       (unicode : 234; flag : umf_noinfo),
+       (unicode : 235; flag : umf_noinfo),
+       (unicode : 232; flag : umf_noinfo),
+       (unicode : 239; flag : umf_noinfo),
+       (unicode : 238; flag : umf_noinfo),
+       (unicode : 236; flag : umf_noinfo),
+       (unicode : 196; flag : umf_noinfo),
+       (unicode : 197; flag : umf_noinfo),
+       (unicode : 201; flag : umf_noinfo),
+       (unicode : 230; flag : umf_noinfo),
+       (unicode : 198; flag : umf_noinfo),
+       (unicode : 244; flag : umf_noinfo),
+       (unicode : 246; flag : umf_noinfo),
+       (unicode : 242; flag : umf_noinfo),
+       (unicode : 251; flag : umf_noinfo),
+       (unicode : 249; flag : umf_noinfo),
+       (unicode : 255; flag : umf_noinfo),
+       (unicode : 214; flag : umf_noinfo),
+       (unicode : 220; flag : umf_noinfo),
+       (unicode : 248; flag : umf_noinfo),
+       (unicode : 163; flag : umf_noinfo),
+       (unicode : 216; flag : umf_noinfo),
+       (unicode : 215; flag : umf_noinfo),
+       (unicode : 402; flag : umf_noinfo),
+       (unicode : 225; flag : umf_noinfo),
+       (unicode : 237; flag : umf_noinfo),
+       (unicode : 243; flag : umf_noinfo),
+       (unicode : 250; flag : umf_noinfo),
+       (unicode : 241; flag : umf_noinfo),
+       (unicode : 209; flag : umf_noinfo),
+       (unicode : 170; flag : umf_noinfo),
+       (unicode : 186; flag : umf_noinfo),
+       (unicode : 191; flag : umf_noinfo),
+       (unicode : 174; flag : umf_noinfo),
+       (unicode : 172; flag : umf_noinfo),
+       (unicode : 189; flag : umf_noinfo),
+       (unicode : 188; flag : umf_noinfo),
+       (unicode : 161; flag : umf_noinfo),
+       (unicode : 171; flag : umf_noinfo),
+       (unicode : 187; flag : umf_noinfo),
+       (unicode : 9617; flag : umf_noinfo),
+       (unicode : 9618; flag : umf_noinfo),
+       (unicode : 9619; flag : umf_noinfo),
+       (unicode : 9474; flag : umf_noinfo),
+       (unicode : 9508; flag : umf_noinfo),
+       (unicode : 193; flag : umf_noinfo),
+       (unicode : 194; flag : umf_noinfo),
+       (unicode : 192; flag : umf_noinfo),
+       (unicode : 169; flag : umf_noinfo),
+       (unicode : 9571; flag : umf_noinfo),
+       (unicode : 9553; flag : umf_noinfo),
+       (unicode : 9559; flag : umf_noinfo),
+       (unicode : 9565; flag : umf_noinfo),
+       (unicode : 162; flag : umf_noinfo),
+       (unicode : 165; flag : umf_noinfo),
+       (unicode : 9488; flag : umf_noinfo),
+       (unicode : 9492; flag : umf_noinfo),
+       (unicode : 9524; flag : umf_noinfo),
+       (unicode : 9516; flag : umf_noinfo),
+       (unicode : 9500; flag : umf_noinfo),
+       (unicode : 9472; flag : umf_noinfo),
+       (unicode : 9532; flag : umf_noinfo),
+       (unicode : 227; flag : umf_noinfo),
+       (unicode : 195; flag : umf_noinfo),
+       (unicode : 9562; flag : umf_noinfo),
+       (unicode : 9556; flag : umf_noinfo),
+       (unicode : 9577; flag : umf_noinfo),
+       (unicode : 9574; flag : umf_noinfo),
+       (unicode : 9568; flag : umf_noinfo),
+       (unicode : 9552; flag : umf_noinfo),
+       (unicode : 9580; flag : umf_noinfo),
+       (unicode : 164; flag : umf_noinfo),
+       (unicode : 240; flag : umf_noinfo),
+       (unicode : 208; flag : umf_noinfo),
+       (unicode : 202; flag : umf_noinfo),
+       (unicode : 203; flag : umf_noinfo),
+       (unicode : 200; flag : umf_noinfo),
+       (unicode : 305; flag : umf_noinfo),
+       (unicode : 205; flag : umf_noinfo),
+       (unicode : 206; flag : umf_noinfo),
+       (unicode : 207; flag : umf_noinfo),
+       (unicode : 9496; flag : umf_noinfo),
+       (unicode : 9484; flag : umf_noinfo),
+       (unicode : 9608; flag : umf_noinfo),
+       (unicode : 9604; flag : umf_noinfo),
+       (unicode : 166; flag : umf_noinfo),
+       (unicode : 204; flag : umf_noinfo),
+       (unicode : 9600; flag : umf_noinfo),
+       (unicode : 211; flag : umf_noinfo),
+       (unicode : 223; flag : umf_noinfo),
+       (unicode : 212; flag : umf_noinfo),
+       (unicode : 210; flag : umf_noinfo),
+       (unicode : 245; flag : umf_noinfo),
+       (unicode : 213; flag : umf_noinfo),
+       (unicode : 181; flag : umf_noinfo),
+       (unicode : 254; flag : umf_noinfo),
+       (unicode : 222; flag : umf_noinfo),
+       (unicode : 218; flag : umf_noinfo),
+       (unicode : 219; flag : umf_noinfo),
+       (unicode : 217; flag : umf_noinfo),
+       (unicode : 253; flag : umf_noinfo),
+       (unicode : 221; flag : umf_noinfo),
+       (unicode : 175; flag : umf_noinfo),
+       (unicode : 180; flag : umf_noinfo),
+       (unicode : 173; flag : umf_noinfo),
+       (unicode : 177; flag : umf_noinfo),
+       (unicode : 8215; flag : umf_noinfo),
+       (unicode : 190; flag : umf_noinfo),
+       (unicode : 182; flag : umf_noinfo),
+       (unicode : 167; flag : umf_noinfo),
+       (unicode : 247; flag : umf_noinfo),
+       (unicode : 184; flag : umf_noinfo),
+       (unicode : 176; flag : umf_noinfo),
+       (unicode : 168; flag : umf_noinfo),
+       (unicode : 183; flag : umf_noinfo),
+       (unicode : 185; flag : umf_noinfo),
+       (unicode : 179; flag : umf_noinfo),
+       (unicode : 178; flag : umf_noinfo),
+       (unicode : 9632; flag : umf_noinfo),
+       (unicode : 160; flag : umf_noinfo)
+     );
+
+     unicodemap : tunicodemap = (
+       cpname : 'cp850';
+       map : @map;
+       lastchar : 255;
+       next : nil;
+       internalmap : true
+     );
+
+  begin
+     registermapping(@unicodemap)
+  end.

+ 281 - 0
compiler/cp8859_1.pas

@@ -0,0 +1,281 @@
+{ This is an automatically created file, so don't edit it }
+unit cp8859_1;
+
+  interface
+
+  implementation
+
+  uses
+     charset;
+
+  const
+     map : array[0..255] of tunicodecharmapping = (
+       (unicode : 0; flag : umf_noinfo),
+       (unicode : 1; flag : umf_noinfo),
+       (unicode : 2; flag : umf_noinfo),
+       (unicode : 3; flag : umf_noinfo),
+       (unicode : 4; flag : umf_noinfo),
+       (unicode : 5; flag : umf_noinfo),
+       (unicode : 6; flag : umf_noinfo),
+       (unicode : 7; flag : umf_noinfo),
+       (unicode : 8; flag : umf_noinfo),
+       (unicode : 9; flag : umf_noinfo),
+       (unicode : 10; flag : umf_noinfo),
+       (unicode : 11; flag : umf_noinfo),
+       (unicode : 12; flag : umf_noinfo),
+       (unicode : 13; flag : umf_noinfo),
+       (unicode : 14; flag : umf_noinfo),
+       (unicode : 15; flag : umf_noinfo),
+       (unicode : 16; flag : umf_noinfo),
+       (unicode : 17; flag : umf_noinfo),
+       (unicode : 18; flag : umf_noinfo),
+       (unicode : 19; flag : umf_noinfo),
+       (unicode : 20; flag : umf_noinfo),
+       (unicode : 21; flag : umf_noinfo),
+       (unicode : 22; flag : umf_noinfo),
+       (unicode : 23; flag : umf_noinfo),
+       (unicode : 24; flag : umf_noinfo),
+       (unicode : 25; flag : umf_noinfo),
+       (unicode : 26; flag : umf_noinfo),
+       (unicode : 27; flag : umf_noinfo),
+       (unicode : 28; flag : umf_noinfo),
+       (unicode : 29; flag : umf_noinfo),
+       (unicode : 30; flag : umf_noinfo),
+       (unicode : 31; flag : umf_noinfo),
+       (unicode : 32; flag : umf_noinfo),
+       (unicode : 33; flag : umf_noinfo),
+       (unicode : 34; flag : umf_noinfo),
+       (unicode : 35; flag : umf_noinfo),
+       (unicode : 36; flag : umf_noinfo),
+       (unicode : 37; flag : umf_noinfo),
+       (unicode : 38; flag : umf_noinfo),
+       (unicode : 39; flag : umf_noinfo),
+       (unicode : 40; flag : umf_noinfo),
+       (unicode : 41; flag : umf_noinfo),
+       (unicode : 42; flag : umf_noinfo),
+       (unicode : 43; flag : umf_noinfo),
+       (unicode : 44; flag : umf_noinfo),
+       (unicode : 45; flag : umf_noinfo),
+       (unicode : 46; flag : umf_noinfo),
+       (unicode : 47; flag : umf_noinfo),
+       (unicode : 48; flag : umf_noinfo),
+       (unicode : 49; flag : umf_noinfo),
+       (unicode : 50; flag : umf_noinfo),
+       (unicode : 51; flag : umf_noinfo),
+       (unicode : 52; flag : umf_noinfo),
+       (unicode : 53; flag : umf_noinfo),
+       (unicode : 54; flag : umf_noinfo),
+       (unicode : 55; flag : umf_noinfo),
+       (unicode : 56; flag : umf_noinfo),
+       (unicode : 57; flag : umf_noinfo),
+       (unicode : 58; flag : umf_noinfo),
+       (unicode : 59; flag : umf_noinfo),
+       (unicode : 60; flag : umf_noinfo),
+       (unicode : 61; flag : umf_noinfo),
+       (unicode : 62; flag : umf_noinfo),
+       (unicode : 63; flag : umf_noinfo),
+       (unicode : 64; flag : umf_noinfo),
+       (unicode : 65; flag : umf_noinfo),
+       (unicode : 66; flag : umf_noinfo),
+       (unicode : 67; flag : umf_noinfo),
+       (unicode : 68; flag : umf_noinfo),
+       (unicode : 69; flag : umf_noinfo),
+       (unicode : 70; flag : umf_noinfo),
+       (unicode : 71; flag : umf_noinfo),
+       (unicode : 72; flag : umf_noinfo),
+       (unicode : 73; flag : umf_noinfo),
+       (unicode : 74; flag : umf_noinfo),
+       (unicode : 75; flag : umf_noinfo),
+       (unicode : 76; flag : umf_noinfo),
+       (unicode : 77; flag : umf_noinfo),
+       (unicode : 78; flag : umf_noinfo),
+       (unicode : 79; flag : umf_noinfo),
+       (unicode : 80; flag : umf_noinfo),
+       (unicode : 81; flag : umf_noinfo),
+       (unicode : 82; flag : umf_noinfo),
+       (unicode : 83; flag : umf_noinfo),
+       (unicode : 84; flag : umf_noinfo),
+       (unicode : 85; flag : umf_noinfo),
+       (unicode : 86; flag : umf_noinfo),
+       (unicode : 87; flag : umf_noinfo),
+       (unicode : 88; flag : umf_noinfo),
+       (unicode : 89; flag : umf_noinfo),
+       (unicode : 90; flag : umf_noinfo),
+       (unicode : 91; flag : umf_noinfo),
+       (unicode : 92; flag : umf_noinfo),
+       (unicode : 93; flag : umf_noinfo),
+       (unicode : 94; flag : umf_noinfo),
+       (unicode : 95; flag : umf_noinfo),
+       (unicode : 96; flag : umf_noinfo),
+       (unicode : 97; flag : umf_noinfo),
+       (unicode : 98; flag : umf_noinfo),
+       (unicode : 99; flag : umf_noinfo),
+       (unicode : 100; flag : umf_noinfo),
+       (unicode : 101; flag : umf_noinfo),
+       (unicode : 102; flag : umf_noinfo),
+       (unicode : 103; flag : umf_noinfo),
+       (unicode : 104; flag : umf_noinfo),
+       (unicode : 105; flag : umf_noinfo),
+       (unicode : 106; flag : umf_noinfo),
+       (unicode : 107; flag : umf_noinfo),
+       (unicode : 108; flag : umf_noinfo),
+       (unicode : 109; flag : umf_noinfo),
+       (unicode : 110; flag : umf_noinfo),
+       (unicode : 111; flag : umf_noinfo),
+       (unicode : 112; flag : umf_noinfo),
+       (unicode : 113; flag : umf_noinfo),
+       (unicode : 114; flag : umf_noinfo),
+       (unicode : 115; flag : umf_noinfo),
+       (unicode : 116; flag : umf_noinfo),
+       (unicode : 117; flag : umf_noinfo),
+       (unicode : 118; flag : umf_noinfo),
+       (unicode : 119; flag : umf_noinfo),
+       (unicode : 120; flag : umf_noinfo),
+       (unicode : 121; flag : umf_noinfo),
+       (unicode : 122; flag : umf_noinfo),
+       (unicode : 123; flag : umf_noinfo),
+       (unicode : 124; flag : umf_noinfo),
+       (unicode : 125; flag : umf_noinfo),
+       (unicode : 126; flag : umf_noinfo),
+       (unicode : 127; flag : umf_noinfo),
+       (unicode : 128; flag : umf_noinfo),
+       (unicode : 129; flag : umf_noinfo),
+       (unicode : 130; flag : umf_noinfo),
+       (unicode : 131; flag : umf_noinfo),
+       (unicode : 132; flag : umf_noinfo),
+       (unicode : 133; flag : umf_noinfo),
+       (unicode : 134; flag : umf_noinfo),
+       (unicode : 135; flag : umf_noinfo),
+       (unicode : 136; flag : umf_noinfo),
+       (unicode : 137; flag : umf_noinfo),
+       (unicode : 138; flag : umf_noinfo),
+       (unicode : 139; flag : umf_noinfo),
+       (unicode : 140; flag : umf_noinfo),
+       (unicode : 141; flag : umf_noinfo),
+       (unicode : 142; flag : umf_noinfo),
+       (unicode : 143; flag : umf_noinfo),
+       (unicode : 144; flag : umf_noinfo),
+       (unicode : 145; flag : umf_noinfo),
+       (unicode : 146; flag : umf_noinfo),
+       (unicode : 147; flag : umf_noinfo),
+       (unicode : 148; flag : umf_noinfo),
+       (unicode : 149; flag : umf_noinfo),
+       (unicode : 150; flag : umf_noinfo),
+       (unicode : 151; flag : umf_noinfo),
+       (unicode : 152; flag : umf_noinfo),
+       (unicode : 153; flag : umf_noinfo),
+       (unicode : 154; flag : umf_noinfo),
+       (unicode : 155; flag : umf_noinfo),
+       (unicode : 156; flag : umf_noinfo),
+       (unicode : 157; flag : umf_noinfo),
+       (unicode : 158; flag : umf_noinfo),
+       (unicode : 159; flag : umf_noinfo),
+       (unicode : 160; flag : umf_noinfo),
+       (unicode : 161; flag : umf_noinfo),
+       (unicode : 162; flag : umf_noinfo),
+       (unicode : 163; flag : umf_noinfo),
+       (unicode : 164; flag : umf_noinfo),
+       (unicode : 165; flag : umf_noinfo),
+       (unicode : 166; flag : umf_noinfo),
+       (unicode : 167; flag : umf_noinfo),
+       (unicode : 168; flag : umf_noinfo),
+       (unicode : 169; flag : umf_noinfo),
+       (unicode : 170; flag : umf_noinfo),
+       (unicode : 171; flag : umf_noinfo),
+       (unicode : 172; flag : umf_noinfo),
+       (unicode : 173; flag : umf_noinfo),
+       (unicode : 174; flag : umf_noinfo),
+       (unicode : 175; flag : umf_noinfo),
+       (unicode : 176; flag : umf_noinfo),
+       (unicode : 177; flag : umf_noinfo),
+       (unicode : 178; flag : umf_noinfo),
+       (unicode : 179; flag : umf_noinfo),
+       (unicode : 180; flag : umf_noinfo),
+       (unicode : 181; flag : umf_noinfo),
+       (unicode : 182; flag : umf_noinfo),
+       (unicode : 183; flag : umf_noinfo),
+       (unicode : 184; flag : umf_noinfo),
+       (unicode : 185; flag : umf_noinfo),
+       (unicode : 186; flag : umf_noinfo),
+       (unicode : 187; flag : umf_noinfo),
+       (unicode : 188; flag : umf_noinfo),
+       (unicode : 189; flag : umf_noinfo),
+       (unicode : 190; flag : umf_noinfo),
+       (unicode : 191; flag : umf_noinfo),
+       (unicode : 192; flag : umf_noinfo),
+       (unicode : 193; flag : umf_noinfo),
+       (unicode : 194; flag : umf_noinfo),
+       (unicode : 195; flag : umf_noinfo),
+       (unicode : 196; flag : umf_noinfo),
+       (unicode : 197; flag : umf_noinfo),
+       (unicode : 198; flag : umf_noinfo),
+       (unicode : 199; flag : umf_noinfo),
+       (unicode : 200; flag : umf_noinfo),
+       (unicode : 201; flag : umf_noinfo),
+       (unicode : 202; flag : umf_noinfo),
+       (unicode : 203; flag : umf_noinfo),
+       (unicode : 204; flag : umf_noinfo),
+       (unicode : 205; flag : umf_noinfo),
+       (unicode : 206; flag : umf_noinfo),
+       (unicode : 207; flag : umf_noinfo),
+       (unicode : 208; flag : umf_noinfo),
+       (unicode : 209; flag : umf_noinfo),
+       (unicode : 210; flag : umf_noinfo),
+       (unicode : 211; flag : umf_noinfo),
+       (unicode : 212; flag : umf_noinfo),
+       (unicode : 213; flag : umf_noinfo),
+       (unicode : 214; flag : umf_noinfo),
+       (unicode : 215; flag : umf_noinfo),
+       (unicode : 216; flag : umf_noinfo),
+       (unicode : 217; flag : umf_noinfo),
+       (unicode : 218; flag : umf_noinfo),
+       (unicode : 219; flag : umf_noinfo),
+       (unicode : 220; flag : umf_noinfo),
+       (unicode : 221; flag : umf_noinfo),
+       (unicode : 222; flag : umf_noinfo),
+       (unicode : 223; flag : umf_noinfo),
+       (unicode : 224; flag : umf_noinfo),
+       (unicode : 225; flag : umf_noinfo),
+       (unicode : 226; flag : umf_noinfo),
+       (unicode : 227; flag : umf_noinfo),
+       (unicode : 228; flag : umf_noinfo),
+       (unicode : 229; flag : umf_noinfo),
+       (unicode : 230; flag : umf_noinfo),
+       (unicode : 231; flag : umf_noinfo),
+       (unicode : 232; flag : umf_noinfo),
+       (unicode : 233; flag : umf_noinfo),
+       (unicode : 234; flag : umf_noinfo),
+       (unicode : 235; flag : umf_noinfo),
+       (unicode : 236; flag : umf_noinfo),
+       (unicode : 237; flag : umf_noinfo),
+       (unicode : 238; flag : umf_noinfo),
+       (unicode : 239; flag : umf_noinfo),
+       (unicode : 240; flag : umf_noinfo),
+       (unicode : 241; flag : umf_noinfo),
+       (unicode : 242; flag : umf_noinfo),
+       (unicode : 243; flag : umf_noinfo),
+       (unicode : 244; flag : umf_noinfo),
+       (unicode : 245; flag : umf_noinfo),
+       (unicode : 246; flag : umf_noinfo),
+       (unicode : 247; flag : umf_noinfo),
+       (unicode : 248; flag : umf_noinfo),
+       (unicode : 249; flag : umf_noinfo),
+       (unicode : 250; flag : umf_noinfo),
+       (unicode : 251; flag : umf_noinfo),
+       (unicode : 252; flag : umf_noinfo),
+       (unicode : 253; flag : umf_noinfo),
+       (unicode : 254; flag : umf_noinfo),
+       (unicode : 255; flag : umf_noinfo)
+     );
+
+     unicodemap : tunicodemap = (
+       cpname : '8859-1';
+       map : @map;
+       lastchar : 255;
+       next : nil;
+       internalmap : true
+     );
+
+  begin
+     registermapping(@unicodemap)
+  end.

+ 12 - 5
compiler/globals.pas

@@ -88,11 +88,12 @@ interface
          function  FindFile(const f : string;var foundfile:string):boolean;
          function  FindFile(const f : string;var foundfile:string):boolean;
        end;
        end;
 
 
+       tcodepagestring = string[20];
 
 
-   {# the ordinal type used when evaluating constant integer expressions }
-   TConstExprInt = int64;
-   { ... the same unsigned }
-   TConstExprUInt = {$ifdef fpc}qword{$else}int64{$endif};
+       { the ordinal type used when evaluating constant integer expressions }
+       TConstExprInt = int64;
+       { ... the same unsigned }
+       TConstExprUInt = {$ifdef fpc}qword{$else}int64{$endif};
 
 
     var
     var
        { specified inputfile }
        { specified inputfile }
@@ -171,6 +172,7 @@ interface
        initinterfacetype  : tinterfacetypes;
        initinterfacetype  : tinterfacetypes;
        initoutputformat   : tasm;
        initoutputformat   : tasm;
        initdefproccall    : tproccalloption;
        initdefproccall    : tproccalloption;
+       initsourcecodepage : tcodepagestring;
 
 
      { current state values }
      { current state values }
        aktglobalswitches  : tglobalswitches;
        aktglobalswitches  : tglobalswitches;
@@ -191,6 +193,7 @@ interface
        aktinterfacetype   : tinterfacetypes;
        aktinterfacetype   : tinterfacetypes;
        aktoutputformat    : tasm;
        aktoutputformat    : tasm;
        aktdefproccall     : tproccalloption;
        aktdefproccall     : tproccalloption;
+       aktsourcecodepage : tcodepagestring;
 
 
      { Memory sizes }
      { Memory sizes }
        heapsize,
        heapsize,
@@ -1419,6 +1422,7 @@ implementation
         initmodeswitches:=fpcmodeswitches;
         initmodeswitches:=fpcmodeswitches;
         initlocalswitches:=[cs_check_io,cs_typed_const_writable];
         initlocalswitches:=[cs_check_io,cs_typed_const_writable];
         initmoduleswitches:=[cs_extsyntax,cs_browser];
         initmoduleswitches:=[cs_extsyntax,cs_browser];
+        initsourcecodepage:='8859-1';
         initglobalswitches:=[cs_check_unit_name,cs_link_static{$ifdef INTERNALLINKER},cs_link_internal,cs_link_map{$endif}];
         initglobalswitches:=[cs_check_unit_name,cs_link_static{$ifdef INTERNALLINKER},cs_link_internal,cs_link_map{$endif}];
         initoutputformat:=target_asm.id;
         initoutputformat:=target_asm.id;
         fillchar(initalignment,sizeof(talignmentinfo),0);
         fillchar(initalignment,sizeof(talignmentinfo),0);
@@ -1469,7 +1473,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.60  2002-07-01 18:46:22  peter
+  Revision 1.61  2002-07-20 17:12:42  florian
+    + source code page support
+
+  Revision 1.60  2002/07/01 18:46:22  peter
     * internal linker
     * internal linker
     * reorganized aasm layer
     * reorganized aasm layer
 
 

+ 1 - 0
compiler/msg/errore.msg

@@ -1849,6 +1849,7 @@ option_using_env=11027_T_Reading options from environment $1
 option_handling_option=11028_D_Handling option "$1"
 option_handling_option=11028_D_Handling option "$1"
 % Debug info that an option is found and will be handled
 % Debug info that an option is found and will be handled
 option_help_press_enter=11029__*** press enter ***
 option_help_press_enter=11029__*** press enter ***
+option_code_page_not_available=11030_E_Unknown code page
 %\end{description}
 %\end{description}
 # EndOfTeX
 # EndOfTeX
 
 

+ 3 - 2
compiler/msgidx.inc

@@ -603,13 +603,14 @@ const
   option_using_env=11027;
   option_using_env=11027;
   option_handling_option=11028;
   option_handling_option=11028;
   option_help_press_enter=11029;
   option_help_press_enter=11029;
+  option_code_page_not_available=11030;
   option_logo=11023;
   option_logo=11023;
   option_info=11024;
   option_info=11024;
   option_help_pages=11025;
   option_help_pages=11025;
 
 
-  MsgTxtSize = 34091;
+  MsgTxtSize = 34117;
 
 
   MsgIdxMax : array[1..20] of longint=(
   MsgIdxMax : array[1..20] of longint=(
     17,62,184,42,41,41,98,17,35,42,
     17,62,184,42,41,41,98,17,35,42,
-    30,1,1,1,1,1,1,1,1,1
+    31,1,1,1,1,1,1,1,1,1
   );
   );

+ 46 - 45
compiler/msgtxt.inc

@@ -657,7 +657,8 @@ const msgtxt : array[0..000142,1..240] of char=(
   '11027_T_Reading options from environment $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11028_D_Handling option "$1"'#000+
   '11028_D_Handling option "$1"'#000+
   '11029__*** press enter ***'#000+
   '11029__*** press enter ***'#000+
-  '11023_Free Pascal Compiler version $FPCVER [$FP','CDATE] for $FPCTARGET'+
+  '11030_E_Unknown code page'#000+
+  '11023_Free Pascal Com','piler version $FPCVER [$FPCDATE] for $FPCTARGET'+
   #010+
   #010+
   'Copyright (c) 1993-2002 by Florian Klaempfl'#000+
   'Copyright (c) 1993-2002 by Florian Klaempfl'#000+
   '11024_Free Pascal Compiler version $FPCVER'#010+
   '11024_Free Pascal Compiler version $FPCVER'#010+
@@ -668,54 +669,54 @@ const msgtxt : array[0..000142,1..240] of char=(
   'Supported targets:'#010+
   'Supported targets:'#010+
   '  $OSTARGETS'#010+
   '  $OSTARGETS'#010+
   #010+
   #010+
-  'This program comes under the GNU General P','ublic Licence'#010+
+  'This program com','es under the GNU General Public Licence'#010+
   'For more information read COPYING.FPC'#010+
   'For more information read COPYING.FPC'#010+
   #010+
   #010+
   'Report bugs,suggestions etc to:'#010+
   'Report bugs,suggestions etc to:'#010+
   '                 [email protected]'#000+
   '                 [email protected]'#000+
   '11025_**0*_put + after a boolean switch option to enable it, - to disa'+
   '11025_**0*_put + after a boolean switch option to enable it, - to disa'+
   'ble it'#010+
   'ble it'#010+
-  '**1a_the compiler doesn'#039't delete the ge','nerated assembler file'#010+
+  '**1a_the comp','iler doesn'#039't delete the generated assembler file'#010+
   '**2al_list sourcecode lines in assembler file'#010+
   '**2al_list sourcecode lines in assembler file'#010+
   '**2ar_list register allocation/release info in assembler file'#010+
   '**2ar_list register allocation/release info in assembler file'#010+
   '**2at_list temp allocation/release info in assembler file'#010+
   '**2at_list temp allocation/release info in assembler file'#010+
-  '**1b_generate browser info'#010+
-  '**2bl_generate local sym','bol info'#010+
+  '**1b_generate browser inf','o'#010+
+  '**2bl_generate local symbol info'#010+
   '**1B_build all modules'#010+
   '**1B_build all modules'#010+
   '**1C<x>_code generation options:'#010+
   '**1C<x>_code generation options:'#010+
   '**2CD_create also dynamic library (not supported)'#010+
   '**2CD_create also dynamic library (not supported)'#010+
   '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
   '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
   '**2Ci_IO-checking'#010+
   '**2Ci_IO-checking'#010+
   '**2Cn_omit linking stage'#010+
   '**2Cn_omit linking stage'#010+
-  '**2Co_check overflow of intege','r operations'#010+
+  '**2C','o_check overflow of integer operations'#010+
   '**2Cr_range checking'#010+
   '**2Cr_range checking'#010+
   '**2CR_verify object method call validity'#010+
   '**2CR_verify object method call validity'#010+
   '**2Cs<n>_set stack size to <n>'#010+
   '**2Cs<n>_set stack size to <n>'#010+
   '**2Ct_stack checking'#010+
   '**2Ct_stack checking'#010+
   '**2CX_create also smartlinked library'#010+
   '**2CX_create also smartlinked library'#010+
   '**1d<x>_defines the symbol <x>'#010+
   '**1d<x>_defines the symbol <x>'#010+
-  '*O1D_generate a DEF file'#010+
-  '*O2Dd<x>_set descri','ption to <x>'#010+
+  '*O1D_generate a DE','F file'#010+
+  '*O2Dd<x>_set description to <x>'#010+
   '*O2Dw_PM application'#010+
   '*O2Dw_PM application'#010+
   '**1e<x>_set path to executable'#010+
   '**1e<x>_set path to executable'#010+
   '**1E_same as -Cn'#010+
   '**1E_same as -Cn'#010+
   '**1F<x>_set file names and paths:'#010+
   '**1F<x>_set file names and paths:'#010+
   '**2FD<x>_sets the directory where to search for compiler utilities'#010+
   '**2FD<x>_sets the directory where to search for compiler utilities'#010+
-  '**2Fe<x>_redirect error output to <x>'#010+
-  '**2FE<x>_set exe/un','it output path to <x>'#010+
+  '**2Fe<x>_redirect error output ','to <x>'#010+
+  '**2FE<x>_set exe/unit output path to <x>'#010+
   '**2Fi<x>_adds <x> to include path'#010+
   '**2Fi<x>_adds <x> to include path'#010+
   '**2Fl<x>_adds <x> to library path'#010+
   '**2Fl<x>_adds <x> to library path'#010+
   '*L2FL<x>_uses <x> as dynamic linker'#010+
   '*L2FL<x>_uses <x> as dynamic linker'#010+
   '**2Fo<x>_adds <x> to object path'#010+
   '**2Fo<x>_adds <x> to object path'#010+
   '**2Fr<x>_load error message file <x>'#010+
   '**2Fr<x>_load error message file <x>'#010+
-  '**2Fu<x>_adds <x> to unit path'#010+
-  '**2FU<x>_set ','unit output path to <x>, overrides -FE'#010+
+  '**2Fu<x>_adds <x> ','to unit path'#010+
+  '**2FU<x>_set unit output path to <x>, overrides -FE'#010+
   '*g1g_generate debugger information:'#010+
   '*g1g_generate debugger information:'#010+
   '*g2gg_use gsym'#010+
   '*g2gg_use gsym'#010+
   '*g2gd_use dbx'#010+
   '*g2gd_use dbx'#010+
   '*g2gh_use heap trace unit (for memory leak debugging)'#010+
   '*g2gh_use heap trace unit (for memory leak debugging)'#010+
-  '*g2gl_use line info unit to show more info for backtraces'#010+
-  '*g2gc_generate checks fo','r pointers'#010+
+  '*g2gl_use line info unit to show more info for backtrace','s'#010+
+  '*g2gc_generate checks for pointers'#010+
   '**1i_information'#010+
   '**1i_information'#010+
   '**2iD_return compiler date'#010+
   '**2iD_return compiler date'#010+
   '**2iV_return compiler version'#010+
   '**2iV_return compiler version'#010+
@@ -723,108 +724,108 @@ const msgtxt : array[0..000142,1..240] of char=(
   '**2iSP_return compiler processor'#010+
   '**2iSP_return compiler processor'#010+
   '**2iTO_return target OS'#010+
   '**2iTO_return target OS'#010+
   '**2iTP_return target processor'#010+
   '**2iTP_return target processor'#010+
-  '**1I<x>_adds <x> to include path'#010+
-  '**1k<x>_','Pass <x> to the linker'#010+
+  '**1I<x>_adds <x','> to include path'#010+
+  '**1k<x>_Pass <x> to the linker'#010+
   '**1l_write logo'#010+
   '**1l_write logo'#010+
   '**1n_don'#039't read the default config file'#010+
   '**1n_don'#039't read the default config file'#010+
   '**1o<x>_change the name of the executable produced to <x>'#010+
   '**1o<x>_change the name of the executable produced to <x>'#010+
   '**1pg_generate profile code for gprof (defines FPC_PROFILE)'#010+
   '**1pg_generate profile code for gprof (defines FPC_PROFILE)'#010+
-  '*L1P_use pipes instead of creating temporar','y assembler files'#010+
+  '*L1P_use pipes in','stead of creating temporary assembler files'#010+
   '**1S<x>_syntax options:'#010+
   '**1S<x>_syntax options:'#010+
   '**2S2_switch some Delphi 2 extensions on'#010+
   '**2S2_switch some Delphi 2 extensions on'#010+
   '**2Sc_supports operators like C (*=,+=,/= and -=)'#010+
   '**2Sc_supports operators like C (*=,+=,/= and -=)'#010+
   '**2Sa_include assertion code.'#010+
   '**2Sa_include assertion code.'#010+
   '**2Sd_tries to be Delphi compatible'#010+
   '**2Sd_tries to be Delphi compatible'#010+
-  '**2Se<x>_compiler stops after the <x> err','ors (default is 1)'#010+
+  '**2Se<x>_compil','er stops after the <x> errors (default is 1)'#010+
   '**2Sg_allow LABEL and GOTO'#010+
   '**2Sg_allow LABEL and GOTO'#010+
   '**2Sh_Use ansistrings'#010+
   '**2Sh_Use ansistrings'#010+
   '**2Si_support C++ styled INLINE'#010+
   '**2Si_support C++ styled INLINE'#010+
   '**2Sm_support macros like C (global)'#010+
   '**2Sm_support macros like C (global)'#010+
   '**2So_tries to be TP/BP 7.0 compatible'#010+
   '**2So_tries to be TP/BP 7.0 compatible'#010+
   '**2Sp_tries to be gpc compatible'#010+
   '**2Sp_tries to be gpc compatible'#010+
-  '**2Ss_constructor name must be ','init (destructor must be done)'#010+
+  '**2Ss','_constructor name must be init (destructor must be done)'#010+
   '**2St_allow static keyword in objects'#010+
   '**2St_allow static keyword in objects'#010+
   '**1s_don'#039't call assembler and linker (only with -a)'#010+
   '**1s_don'#039't call assembler and linker (only with -a)'#010+
   '**2st_Generate script to link on target'#010+
   '**2st_Generate script to link on target'#010+
   '**2sh_Generate script to link on host'#010+
   '**2sh_Generate script to link on host'#010+
-  '**1u<x>_undefines the symbol <x>'#010+
-  '**1U_uni','t options:'#010+
+  '**1u<x>_undefin','es the symbol <x>'#010+
+  '**1U_unit options:'#010+
   '**2Un_don'#039't check the unit name'#010+
   '**2Un_don'#039't check the unit name'#010+
   '**2Ur_generate release unit files'#010+
   '**2Ur_generate release unit files'#010+
   '**2Us_compile a system unit'#010+
   '**2Us_compile a system unit'#010+
   '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
   '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
-  '**2*_e : Show errors (default)       d : Show debug info'#010+
-  '**2*_w : Sh','ow warnings               u : Show unit info'#010+
+  '**2*_e : Show errors (default)       d : S','how debug info'#010+
+  '**2*_w : Show warnings               u : Show unit info'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
   '**2*_h : Show hints                  m : Show defined macros'#010+
   '**2*_h : Show hints                  m : Show defined macros'#010+
-  '**2*_i : Show general info           p : Show compiled procedures'#010+
-  '**2*_','l : Show linenumbers            c : Show conditionals'#010+
+  '**2*_i : Show general info           p : Show',' compiled procedures'#010+
+  '**2*_l : Show linenumbers            c : Show conditionals'#010+
   '**2*_a : Show everything             0 : Show nothing (except errors)'#010+
   '**2*_a : Show everything             0 : Show nothing (except errors)'#010+
   '**2*_b : Show all procedure          r : Rhide/GCC compatibility mode'#010+
   '**2*_b : Show all procedure          r : Rhide/GCC compatibility mode'#010+
-  '**2*_    declarations if an error    x : Execu','table info (Win32 only'+
+  '**2*_    declaration','s if an error    x : Executable info (Win32 only'+
   ')'#010+
   ')'#010+
   '**2*_    occurs'#010+
   '**2*_    occurs'#010+
   '**1X_executable options:'#010+
   '**1X_executable options:'#010+
   '*L2Xc_link with the c library'#010+
   '*L2Xc_link with the c library'#010+
   '**2Xs_strip all symbols from executable'#010+
   '**2Xs_strip all symbols from executable'#010+
   '**2XD_try to link dynamic          (defines FPC_LINK_DYNAMIC)'#010+
   '**2XD_try to link dynamic          (defines FPC_LINK_DYNAMIC)'#010+
-  '**2XS_try to link static (default) (defines',' FPC_LINK_STATIC)'#010+
+  '**2XS_try to link',' static (default) (defines FPC_LINK_STATIC)'#010+
   '**2XX_try to link smart            (defines FPC_LINK_SMART)'#010+
   '**2XX_try to link smart            (defines FPC_LINK_SMART)'#010+
   '**0*_Processor specific options:'#010+
   '**0*_Processor specific options:'#010+
   '3*1A<x>_output format:'#010+
   '3*1A<x>_output format:'#010+
   '3*2Aas_assemble using GNU AS'#010+
   '3*2Aas_assemble using GNU AS'#010+
-  '3*2Aasaout_assemble using GNU AS for aout (Go32v1)'#010+
-  '3*2Anasmcoff_coff (Go32v2)',' file using Nasm'#010+
+  '3*2Aasaout_assemble using GNU AS for aout (Go32v1)'#010,
+  '3*2Anasmcoff_coff (Go32v2) file using Nasm'#010+
   '3*2Anasmelf_elf32 (Linux) file using Nasm'#010+
   '3*2Anasmelf_elf32 (Linux) file using Nasm'#010+
   '3*2Anasmobj_obj file using Nasm'#010+
   '3*2Anasmobj_obj file using Nasm'#010+
   '3*2Amasm_obj file using Masm (Microsoft)'#010+
   '3*2Amasm_obj file using Masm (Microsoft)'#010+
   '3*2Atasm_obj file using Tasm (Borland)'#010+
   '3*2Atasm_obj file using Tasm (Borland)'#010+
-  '3*2Acoff_coff (Go32v2) using internal writer'#010+
-  '3*2Apecoff_pecoff (Win32',') using internal writer'#010+
+  '3*2Acoff_coff (Go32v2) using internal write','r'#010+
+  '3*2Apecoff_pecoff (Win32) using internal writer'#010+
   '3*1R<x>_assembler reading style:'#010+
   '3*1R<x>_assembler reading style:'#010+
   '3*2Ratt_read AT&T style assembler'#010+
   '3*2Ratt_read AT&T style assembler'#010+
   '3*2Rintel_read Intel style assembler'#010+
   '3*2Rintel_read Intel style assembler'#010+
   '3*2Rdirect_copy assembler text directly to assembler file'#010+
   '3*2Rdirect_copy assembler text directly to assembler file'#010+
   '3*1O<x>_optimizations:'#010+
   '3*1O<x>_optimizations:'#010+
-  '3*2Og_generate smaller code'#010+
-  '3*2','OG_generate faster code (default)'#010+
+  '3*2Og','_generate smaller code'#010+
+  '3*2OG_generate faster code (default)'#010+
   '3*2Or_keep certain variables in registers'#010+
   '3*2Or_keep certain variables in registers'#010+
   '3*2Ou_enable uncertain optimizations (see docs)'#010+
   '3*2Ou_enable uncertain optimizations (see docs)'#010+
   '3*2O1_level 1 optimizations (quick optimizations)'#010+
   '3*2O1_level 1 optimizations (quick optimizations)'#010+
-  '3*2O2_level 2 optimizations (-O1 + slower optimizations)'#010+
-  '3*2O3_lev','el 3 optimizations (-O2 repeatedly, max 5 times)'#010+
+  '3*2O2_level 2 optimizations (-O1 + slowe','r optimizations)'#010+
+  '3*2O3_level 3 optimizations (-O2 repeatedly, max 5 times)'#010+
   '3*2Op<x>_target processor:'#010+
   '3*2Op<x>_target processor:'#010+
   '3*3Op1_set target processor to 386/486'#010+
   '3*3Op1_set target processor to 386/486'#010+
   '3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#010+
   '3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#010+
-  '3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#010+
-  '3*1T<x>_Target o','perating system:'#010+
+  '3*3Op3_set target processor to PPro/PII/c6x8','6/K6 (tm)'#010+
+  '3*1T<x>_Target operating system:'#010+
   '3*2TGO32V2_version 2 of DJ Delorie DOS extender'#010+
   '3*2TGO32V2_version 2 of DJ Delorie DOS extender'#010+
   '3*2TWDOSX DOS 32 Bit Extender'#010+
   '3*2TWDOSX DOS 32 Bit Extender'#010+
   '3*2TLINUX_Linux'#010+
   '3*2TLINUX_Linux'#010+
   '3*2Tnetware_Novell Netware Module (experimental)'#010+
   '3*2Tnetware_Novell Netware Module (experimental)'#010+
   '3*2TOS2_OS/2 2.x'#010+
   '3*2TOS2_OS/2 2.x'#010+
   '3*2TSUNOS_SunOS/Solaris'#010+
   '3*2TSUNOS_SunOS/Solaris'#010+
-  '3*2TWin32_Windows 32 Bit'#010+
-  '3*1W<x>_Win32 ','target options'#010+
+  '3*2TWin32_Win','dows 32 Bit'#010+
+  '3*1W<x>_Win32 target options'#010+
   '3*2WB<x>_Set Image base to Hexadecimal <x> value'#010+
   '3*2WB<x>_Set Image base to Hexadecimal <x> value'#010+
   '3*2WC_Specify console type application'#010+
   '3*2WC_Specify console type application'#010+
   '3*2WD_Use DEFFILE to export functions of DLL or EXE'#010+
   '3*2WD_Use DEFFILE to export functions of DLL or EXE'#010+
   '3*2WF_Specify full-screen type application (OS/2 only)'#010+
   '3*2WF_Specify full-screen type application (OS/2 only)'#010+
-  '3*2WG_Specify graphic type app','lication'#010+
+  '3*2W','G_Specify graphic type application'#010+
   '3*2WN_Do not generate relocation code (necessary for debugging)'#010+
   '3*2WN_Do not generate relocation code (necessary for debugging)'#010+
   '3*2WR_Generate relocation code'#010+
   '3*2WR_Generate relocation code'#010+
   '6*1A<x>_output format'#010+
   '6*1A<x>_output format'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Agas_GNU Motorola assembler'#010+
   '6*2Agas_GNU Motorola assembler'#010+
-  '6*2Amit_MIT Syntax (old GAS)'#010+
-  '6*2Amot_Standard Motor','ola assembler'#010+
+  '6*2Amit_MIT Syntax (old G','AS)'#010+
+  '6*2Amot_Standard Motorola assembler'#010+
   '6*1O_optimizations:'#010+
   '6*1O_optimizations:'#010+
   '6*2Oa_turn on the optimizer'#010+
   '6*2Oa_turn on the optimizer'#010+
   '6*2Og_generate smaller code'#010+
   '6*2Og_generate smaller code'#010+
   '6*2OG_generate faster code (default)'#010+
   '6*2OG_generate faster code (default)'#010+
   '6*2Ox_optimize maximum (still BUGGY!!!)'#010+
   '6*2Ox_optimize maximum (still BUGGY!!!)'#010+
   '6*2O2_set target processor to a MC68020+'#010+
   '6*2O2_set target processor to a MC68020+'#010+
-  '6*1R<x>_assembler reading style:',#010+
+  '6*1R<x','>_assembler reading style:'#010+
   '6*2RMOT_read motorola style assembler'#010+
   '6*2RMOT_read motorola style assembler'#010+
   '6*1T<x>_Target operating system:'#010+
   '6*1T<x>_Target operating system:'#010+
   '6*2TAMIGA_Commodore Amiga'#010+
   '6*2TAMIGA_Commodore Amiga'#010+
@@ -833,6 +834,6 @@ const msgtxt : array[0..000142,1..240] of char=(
   '6*2TLINUX_Linux-68k'#010+
   '6*2TLINUX_Linux-68k'#010+
   '6*2TPALMOS_PalmOS'#010+
   '6*2TPALMOS_PalmOS'#010+
   '**1*_'#010+
   '**1*_'#010+
-  '**1?_shows this help'#010+
-  '**1h_shows this help witho','ut waiting'#000
+  '**1?_shows this help'#010,
+  '**1h_shows this help without waiting'#000
 );
 );

+ 8 - 2
compiler/ncnv.pas

@@ -1191,7 +1191,10 @@ implementation
           end;
           end;
 
 
         { ordinal contants can be directly converted }
         { ordinal contants can be directly converted }
-        if (left.nodetype=ordconstn) and is_ordinal(resulttype.def)  then
+        if (left.nodetype=ordconstn) and is_ordinal(resulttype.def) and
+        { but not char to char because it is a widechar to char or via versa }
+        { which needs extra code to do the code page transistion             }
+          not(convtype=tc_char_2_char) then
           begin
           begin
              { replace the resulttype and recheck the range }
              { replace the resulttype and recheck the range }
              left.resulttype:=resulttype;
              left.resulttype:=resulttype;
@@ -1755,7 +1758,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.60  2002-07-20 11:57:54  florian
+  Revision 1.61  2002-07-20 17:16:02  florian
+    + source code page support
+
+  Revision 1.60  2002/07/20 11:57:54  florian
     * types.pas renamed to defbase.pas because D6 contains a types
     * types.pas renamed to defbase.pas because D6 contains a types
       unit so this would conflicts if D6 programms are compiled
       unit so this would conflicts if D6 programms are compiled
     + Willamette/SSE2 instructions to assembler added
     + Willamette/SSE2 instructions to assembler added

+ 12 - 2
compiler/options.pas

@@ -69,6 +69,7 @@ procedure read_arguments(cmd:string);
 implementation
 implementation
 
 
 uses
 uses
+  widestr,
 {$ifdef Delphi}
 {$ifdef Delphi}
   dmisc,
   dmisc,
 {$else Delphi}
 {$else Delphi}
@@ -558,6 +559,12 @@ begin
                       Delete(more,1,1);
                       Delete(more,1,1);
                       DefaultReplacements(More);
                       DefaultReplacements(More);
                       case c of
                       case c of
+                       'c' : begin
+                                if not(cpavailable(more)) then
+                                  Message1(option_code_page_not_available,more)
+                                else
+                                  initsourcecodepage:=more;
+                             end;
                        'D' : utilsdirectory:=FixPath(More,true);
                        'D' : utilsdirectory:=FixPath(More,true);
                        'e' : SetRedirectFile(More);
                        'e' : SetRedirectFile(More);
                        'E' : OutputExeDir:=FixPath(More,true);
                        'E' : OutputExeDir:=FixPath(More,true);
@@ -1670,7 +1677,10 @@ finalization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.76  2002-07-04 20:43:01  florian
+  Revision 1.77  2002-07-20 17:16:03  florian
+    + source code page support
+
+  Revision 1.76  2002/07/04 20:43:01  florian
     * first x86-64 patches
     * first x86-64 patches
 
 
   Revision 1.75  2002/07/01 18:46:24  peter
   Revision 1.75  2002/07/01 18:46:24  peter
@@ -1734,4 +1744,4 @@ end.
   Revision 1.65  2002/04/04 18:39:45  carl
   Revision 1.65  2002/04/04 18:39:45  carl
   + added wdosx support (patch from Pavel)
   + added wdosx support (patch from Pavel)
 
 
-}
+}

+ 9 - 1
compiler/parser.pas

@@ -82,6 +82,8 @@ implementation
          { global switches }
          { global switches }
          aktglobalswitches:=initglobalswitches;
          aktglobalswitches:=initglobalswitches;
 
 
+         aktsourcecodepage:=initsourcecodepage;
+
          { initialize scanner }
          { initialize scanner }
          InitScanner;
          InitScanner;
          InitScannerDirectives;
          InitScannerDirectives;
@@ -277,6 +279,7 @@ implementation
          oldaktmodeswitches : tmodeswitches;
          oldaktmodeswitches : tmodeswitches;
          old_compiled_module : tmodule;
          old_compiled_module : tmodule;
          oldaktdefproccall : tproccalloption;
          oldaktdefproccall : tproccalloption;
+         oldsourcecodepage : tcodepagestring;
 {        will only be increased once we start parsing blocks in the }
 {        will only be increased once we start parsing blocks in the }
 {         implementation, so doesn't need to be saved/restored (JM) }
 {         implementation, so doesn't need to be saved/restored (JM) }
 {          oldexceptblockcounter  : integer;                        }
 {          oldexceptblockcounter  : integer;                        }
@@ -315,6 +318,7 @@ implementation
          old_block_type:=block_type;
          old_block_type:=block_type;
          oldtokenpos:=akttokenpos;
          oldtokenpos:=akttokenpos;
          oldcurrent_scanner:=current_scanner;
          oldcurrent_scanner:=current_scanner;
+         oldsourcecodepage:=aktsourcecodepage;
        { save cg }
        { save cg }
          oldnextlabelnr:=nextlabelnr;
          oldnextlabelnr:=nextlabelnr;
          oldparse_only:=parse_only;
          oldparse_only:=parse_only;
@@ -542,6 +546,7 @@ implementation
               aktprocsym:=oldaktprocsym;
               aktprocsym:=oldaktprocsym;
               aktprocdef:=oldaktprocdef;
               aktprocdef:=oldaktprocdef;
               move(oldoverloaded_operators,overloaded_operators,sizeof(toverloaded_operators));
               move(oldoverloaded_operators,overloaded_operators,sizeof(toverloaded_operators));
+              aktsourcecodepage:=oldsourcecodepage;
               aktlocalswitches:=oldaktlocalswitches;
               aktlocalswitches:=oldaktlocalswitches;
               aktmoduleswitches:=oldaktmoduleswitches;
               aktmoduleswitches:=oldaktmoduleswitches;
               aktalignment:=oldaktalignment;
               aktalignment:=oldaktalignment;
@@ -630,7 +635,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.34  2002-07-01 18:46:24  peter
+  Revision 1.35  2002-07-20 17:16:03  florian
+    + source code page support
+
+  Revision 1.34  2002/07/01 18:46:24  peter
     * internal linker
     * internal linker
     * reorganized aasm layer
     * reorganized aasm layer
 
 

+ 24 - 2
compiler/scandir.pas

@@ -33,7 +33,7 @@ implementation
 
 
     uses
     uses
       cutils,
       cutils,
-      globtype,globals,systems,
+      globtype,globals,systems,widestr,
       verbose,comphook,
       verbose,comphook,
       scanner,switches,
       scanner,switches,
       fmodule;
       fmodule;
@@ -839,6 +839,24 @@ implementation
       begin
       begin
       end;
       end;
 
 
+    procedure dir_codepage;
+      var
+         s : string;
+      begin
+        if not current_module.in_global then
+          Message(scan_w_switch_is_global)
+        else
+          begin
+             current_scanner.skipspace;
+             s:=current_scanner.readcomment;
+             if not(cpavailable(s)) then
+               Message1(option_code_page_not_available,s)
+             else
+               aktsourcecodepage:=s;
+          end;
+      end;
+
+
 {****************************************************************************
 {****************************************************************************
                          Initialize Directives
                          Initialize Directives
 ****************************************************************************}
 ****************************************************************************}
@@ -855,6 +873,7 @@ implementation
         AddDirective('ASSERTIONS',{$ifdef FPCPROCVAR}@{$endif}dir_assertions);
         AddDirective('ASSERTIONS',{$ifdef FPCPROCVAR}@{$endif}dir_assertions);
         AddDirective('BOOLEVAL',{$ifdef FPCPROCVAR}@{$endif}dir_booleval);
         AddDirective('BOOLEVAL',{$ifdef FPCPROCVAR}@{$endif}dir_booleval);
         AddDirective('CALLING',{$ifdef FPCPROCVAR}@{$endif}dir_calling);
         AddDirective('CALLING',{$ifdef FPCPROCVAR}@{$endif}dir_calling);
+        AddDirective('CODEPAGE',{$ifdef FPCPROCVAR}@{$endif}dir_codepage);
         AddDirective('COPYRIGHT',{$ifdef FPCPROCVAR}@{$endif}dir_copyright);
         AddDirective('COPYRIGHT',{$ifdef FPCPROCVAR}@{$endif}dir_copyright);
         AddDirective('D',{$ifdef FPCPROCVAR}@{$endif}dir_description);
         AddDirective('D',{$ifdef FPCPROCVAR}@{$endif}dir_description);
         AddDirective('DEBUGINFO',{$ifdef FPCPROCVAR}@{$endif}dir_debuginfo);
         AddDirective('DEBUGINFO',{$ifdef FPCPROCVAR}@{$endif}dir_debuginfo);
@@ -929,7 +948,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.16  2002-07-16 15:37:58  florian
+  Revision 1.17  2002-07-20 17:16:03  florian
+    + source code page support
+
+  Revision 1.16  2002/07/16 15:37:58  florian
     + Directive $EXTERNALSYM added, it is ignored for now
     + Directive $EXTERNALSYM added, it is ignored for now
 
 
   Revision 1.15  2002/05/18 13:34:17  peter
   Revision 1.15  2002/05/18 13:34:17  peter

+ 47 - 71
compiler/widestr.pas

@@ -26,9 +26,9 @@ unit widestr;
 
 
   interface
   interface
 
 
-{    uses
+    uses
        charset;
        charset;
-}
+
 
 
     type
     type
        tcompilerwidechar = word;
        tcompilerwidechar = word;
@@ -44,32 +44,31 @@ unit widestr;
        pcompilerwidestring = ^_tcompilerwidestring;
        pcompilerwidestring = ^_tcompilerwidestring;
        _tcompilerwidestring = record
        _tcompilerwidestring = record
           data : pcompilerwidechar;
           data : pcompilerwidechar;
-          maxlen,len : longint;
+          maxlen,len : StrLenInt;
        end;
        end;
 
 
     procedure initwidestring(var r : pcompilerwidestring);
     procedure initwidestring(var r : pcompilerwidestring);
     procedure donewidestring(var r : pcompilerwidestring);
     procedure donewidestring(var r : pcompilerwidestring);
-    procedure setlengthwidestring(r : pcompilerwidestring;l : longint);
-    function getlengthwidestring(r : pcompilerwidestring) : longint;
+    procedure setlengthwidestring(r : pcompilerwidestring;l : StrLenInt);
+    function getlengthwidestring(r : pcompilerwidestring) : StrLenInt;
     procedure concatwidestringchar(r : pcompilerwidestring;c : tcompilerwidechar);
     procedure concatwidestringchar(r : pcompilerwidestring;c : tcompilerwidechar);
     procedure concatwidestrings(s1,s2 : pcompilerwidestring);
     procedure concatwidestrings(s1,s2 : pcompilerwidestring);
-    function comparewidestrings(s1,s2 : pcompilerwidestring) : longint;
+    function comparewidestrings(s1,s2 : pcompilerwidestring) : StrLenInt;
     procedure copywidestring(s,d : pcompilerwidestring);
     procedure copywidestring(s,d : pcompilerwidestring);
     function asciichar2unicode(c : char) : tcompilerwidechar;
     function asciichar2unicode(c : char) : tcompilerwidechar;
     function unicode2asciichar(c : tcompilerwidechar) : char;
     function unicode2asciichar(c : tcompilerwidechar) : char;
-    procedure ascii2unicode(p:pchar; l:longint;r : pcompilerwidestring);
-    procedure unicode2ascii(r : pcompilerwidestring;p:pchar);
-    function getcharwidestring(r : pcompilerwidestring;l : longint) : tcompilerwidechar;
+    procedure ascii2unicode(p : pchar;l : StrLenInt;r : pcompilerwidestring);
+    procedure unicode2ascii(r : pcompilerwidestring;p : pchar);
+    function getcharwidestring(r : pcompilerwidestring;l : StrLenInt) : tcompilerwidechar;
     function cpavailable(const s : string) : boolean;
     function cpavailable(const s : string) : boolean;
 
 
   implementation
   implementation
 
 
-{    uses
-       i8869_1,cp850,cp437; }
-
     uses
     uses
+       cp8859_1,cp850,cp437,
        globals;
        globals;
 
 
+
     procedure initwidestring(var r : pcompilerwidestring);
     procedure initwidestring(var r : pcompilerwidestring);
 
 
       begin
       begin
@@ -88,19 +87,19 @@ unit widestr;
          r:=nil;
          r:=nil;
       end;
       end;
 
 
-    function getcharwidestring(r : pcompilerwidestring;l : longint) : tcompilerwidechar;
+    function getcharwidestring(r : pcompilerwidestring;l : StrLenInt) : tcompilerwidechar;
 
 
       begin
       begin
          getcharwidestring:=r^.data[l];
          getcharwidestring:=r^.data[l];
       end;
       end;
 
 
-    function getlengthwidestring(r : pcompilerwidestring) : longint;
+    function getlengthwidestring(r : pcompilerwidestring) : StrLenInt;
 
 
       begin
       begin
          getlengthwidestring:=r^.len;
          getlengthwidestring:=r^.len;
       end;
       end;
 
 
-    procedure setlengthwidestring(r : pcompilerwidestring;l : longint);
+    procedure setlengthwidestring(r : pcompilerwidestring;l : StrLenInt);
 
 
       begin
       begin
          if r^.maxlen>=l then
          if r^.maxlen>=l then
@@ -127,13 +126,6 @@ unit widestr;
          move(s2^.data^,s1^.data[s1^.len],s2^.len*sizeof(tcompilerwidechar));
          move(s2^.data^,s1^.data[s1^.len],s2^.len*sizeof(tcompilerwidechar));
       end;
       end;
 
 
-    function comparewidestringwidestring(s1,s2 : pcompilerwidestring) : longint;
-
-      begin
-        {$ifdef fpc}{$warning todo}{$endif}
-        comparewidestringwidestring:=0;
-      end;
-
     procedure copywidestring(s,d : pcompilerwidestring);
     procedure copywidestring(s,d : pcompilerwidestring);
 
 
       begin
       begin
@@ -142,27 +134,32 @@ unit widestr;
          move(s^.data^,d^.data^,s^.len*sizeof(tcompilerwidechar));
          move(s^.data^,d^.data^,s^.len*sizeof(tcompilerwidechar));
       end;
       end;
 
 
-    function comparewidestrings(s1,s2 : pcompilerwidestring) : longint;
-
+    function comparewidestrings(s1,s2 : pcompilerwidestring) : StrLenInt;
+      var
+         maxi,temp : StrLenInt;
       begin
       begin
-         {!!!!!! FIXME }
-         comparewidestrings:=0;
+         if pointer(s1)=pointer(s2) then
+           begin
+              comparewidestrings:=0;
+              exit;
+           end;
+         maxi:=s1^.len;
+         temp:=s2^.len;
+         if maxi>temp then
+           maxi:=Temp;
+         temp:=compareword(s1^.data^,s2^.data^,maxi);
+         if temp=0 then
+           temp:=s1^.len-s2^.len;
+         comparewidestrings:=temp;
       end;
       end;
 
 
     function asciichar2unicode(c : char) : tcompilerwidechar;
     function asciichar2unicode(c : char) : tcompilerwidechar;
-{!!!!!!!!
       var
       var
          m : punicodemap;
          m : punicodemap;
-
       begin
       begin
          m:=getmap(aktsourcecodepage);
          m:=getmap(aktsourcecodepage);
          asciichar2unicode:=getunicode(c,m);
          asciichar2unicode:=getunicode(c,m);
       end;
       end;
-}
-      begin
-        {$ifdef fpc}{$warning todo}{$endif}
-        asciichar2unicode:=0;
-      end;
 
 
     function unicode2asciichar(c : tcompilerwidechar) : char;
     function unicode2asciichar(c : tcompilerwidechar) : char;
 
 
@@ -171,42 +168,25 @@ unit widestr;
         unicode2asciichar:=#0;
         unicode2asciichar:=#0;
       end;
       end;
 
 
-    procedure ascii2unicode(p:pchar; l:longint;r : pcompilerwidestring);
-(*
+    procedure ascii2unicode(p : pchar;l : StrLenInt;r : pcompilerwidestring);
       var
       var
-         m : punicodemap;
-         i : longint;
-
+         source : pchar;
+         dest   : tcompilerwidecharptr;
+         i      : StrLenInt;
+         m      : punicodemap;
       begin
       begin
          m:=getmap(aktsourcecodepage);
          m:=getmap(aktsourcecodepage);
-         { should be a very good estimation :) }
-         setlengthwidestring(r,length(s));
-         // !!!! MBCS
-         for i:=1 to length(s) do
+         setlengthwidestring(r,l);
+         source:=p;
+         r^.len:=l;
+         dest:=tcompilerwidecharptr(r^.data);
+         for i:=1 to l do
            begin
            begin
+              dest^:=getunicode(source^,m);
+              inc(dest);
+              inc(source);
            end;
            end;
       end;
       end;
-*)
-      var
-        source : pchar;
-        dest   : tcompilerwidecharptr;
-        i      : longint;
-      begin
-        setlengthwidestring(r,l);
-        source:=p;
-        r^.len:=l;
-        dest:=tcompilerwidecharptr(r^.data);
-        for i:=1 to l do
-         begin
-           if byte(source^)<128 then
-            dest^:=tcompilerwidechar(byte(source^))
-           else
-            dest^:=32;
-           inc(dest);
-           inc(source);
-         end;
-      end;
-
 
 
     procedure unicode2ascii(r : pcompilerwidestring;p:pchar);
     procedure unicode2ascii(r : pcompilerwidestring;p:pchar);
 (*
 (*
@@ -244,20 +224,17 @@ unit widestr;
 
 
 
 
     function cpavailable(const s : string) : boolean;
     function cpavailable(const s : string) : boolean;
-{!!!!!!
       begin
       begin
           cpavailable:=mappingavailable(s);
           cpavailable:=mappingavailable(s);
       end;
       end;
-}
-
-      begin
-        cpavailable:=false;
-      end;
 
 
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.10  2002-05-18 13:34:21  peter
+  Revision 1.11  2002-07-20 17:16:03  florian
+    + source code page support
+
+  Revision 1.10  2002/05/18 13:34:21  peter
     * readded missing revisions
     * readded missing revisions
 
 
   Revision 1.9  2002/05/16 19:46:47  carl
   Revision 1.9  2002/05/16 19:46:47  carl
@@ -265,5 +242,4 @@ end.
   + try to fix temp allocation (still in ifdef)
   + try to fix temp allocation (still in ifdef)
   + generic constructor calls
   + generic constructor calls
   + start of tassembler / tmodulebase class cleanup
   + start of tassembler / tmodulebase class cleanup
-
 }
 }