ccharset.pas 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2000 by Florian Klaempfl
  4. member of the Free Pascal development team.
  5. This unit implements several classes for charset conversions
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. {$mode objfpc}
  13. unit ccharset;
  14. {$i fpcdefs.inc}
  15. interface
  16. type
  17. tunicodechar = word;
  18. tunicodestring = ^tunicodechar;
  19. tcsconvert = class
  20. end;
  21. tunicodecharmappingflag = (umf_noinfo,umf_leadbyte,umf_undefined,
  22. umf_unused);
  23. punicodecharmapping = ^tunicodecharmapping;
  24. tunicodecharmapping = record
  25. unicode : tunicodechar;
  26. flag : tunicodecharmappingflag;
  27. reserved : byte;
  28. end;
  29. punicodemap = ^tunicodemap;
  30. tunicodemap = record
  31. cpname : string[20];
  32. cp : word;
  33. map : punicodecharmapping;
  34. lastchar : longint;
  35. next : punicodemap;
  36. internalmap : boolean;
  37. end;
  38. tcp2unicode = class(tcsconvert)
  39. end;
  40. const
  41. DefaultSystemCodePage = 437;
  42. function loadunicodemapping(const cpname,f : string; cp :word) : punicodemap;
  43. procedure registermapping(p : punicodemap);
  44. function getmap(const s : string) : punicodemap;
  45. function getmap(cp : word) : punicodemap;
  46. function mappingavailable(const s : string) : boolean;
  47. function mappingavailable(cp :word) : boolean;
  48. function getunicode(c : char;p : punicodemap) : tunicodechar;
  49. function getascii(c : tunicodechar;p : punicodemap) : string;
  50. implementation
  51. var
  52. mappings : punicodemap;
  53. function loadunicodemapping(const cpname,f : string; cp :word) : punicodemap;
  54. var
  55. data : punicodecharmapping;
  56. datasize : longint;
  57. t : text;
  58. s,hs : string;
  59. scanpos,charpos,unicodevalue : longint;
  60. code : word;
  61. flag : tunicodecharmappingflag;
  62. p : punicodemap;
  63. lastchar : longint;
  64. begin
  65. lastchar:=-1;
  66. loadunicodemapping:=nil;
  67. datasize:=256;
  68. getmem(data,sizeof(tunicodecharmapping)*datasize);
  69. assign(t,f);
  70. {$I-}
  71. reset(t);
  72. {$I+}
  73. if ioresult<>0 then
  74. begin
  75. freemem(data,sizeof(tunicodecharmapping)*datasize);
  76. exit;
  77. end;
  78. while not(eof(t)) do
  79. begin
  80. readln(t,s);
  81. if (s[1]='0') and (s[2]='x') then
  82. begin
  83. flag:=umf_unused;
  84. scanpos:=3;
  85. hs:='$';
  86. while s[scanpos] in ['0'..'9','A'..'F','a'..'f'] do
  87. begin
  88. hs:=hs+s[scanpos];
  89. inc(scanpos);
  90. end;
  91. val(hs,charpos,code);
  92. if code<>0 then
  93. begin
  94. freemem(data,sizeof(tunicodecharmapping)*datasize);
  95. close(t);
  96. exit;
  97. end;
  98. while not(s[scanpos] in ['0','#']) do
  99. inc(scanpos);
  100. if s[scanpos]='#' then
  101. begin
  102. { special char }
  103. unicodevalue:=$ffff;
  104. hs:=copy(s,scanpos,length(s)-scanpos+1);
  105. if hs='#DBCS LEAD BYTE' then
  106. flag:=umf_leadbyte;
  107. end
  108. else
  109. begin
  110. { C hex prefix }
  111. inc(scanpos,2);
  112. hs:='$';
  113. while s[scanpos] in ['0'..'9','A'..'F','a'..'f'] do
  114. begin
  115. hs:=hs+s[scanpos];
  116. inc(scanpos);
  117. end;
  118. val(hs,unicodevalue,code);
  119. if code<>0 then
  120. begin
  121. freemem(data,sizeof(tunicodecharmapping)*datasize);
  122. close(t);
  123. exit;
  124. end;
  125. if charpos>datasize then
  126. begin
  127. { allocate 1024 bytes more because }
  128. { if we need more than 256 entries it's }
  129. { probably a mbcs with a lot of }
  130. { entries }
  131. datasize:=charpos+1024;
  132. reallocmem(data,sizeof(tunicodecharmapping)*datasize);
  133. end;
  134. flag:=umf_noinfo;
  135. end;
  136. data[charpos].flag:=flag;
  137. data[charpos].unicode:=unicodevalue;
  138. if charpos>lastchar then
  139. lastchar:=charpos;
  140. end;
  141. end;
  142. close(t);
  143. new(p);
  144. p^.lastchar:=lastchar;
  145. p^.cpname:=cpname;
  146. p^.cp:=cp;
  147. p^.internalmap:=false;
  148. p^.next:=nil;
  149. p^.map:=data;
  150. loadunicodemapping:=p;
  151. end;
  152. procedure registermapping(p : punicodemap);
  153. begin
  154. p^.next:=mappings;
  155. mappings:=p;
  156. end;
  157. function getmap(const s : string) : punicodemap;
  158. var
  159. hp : punicodemap;
  160. const
  161. mapcache : string = '';
  162. mapcachep : punicodemap = nil;
  163. begin
  164. if (mapcache=s) and assigned(mapcachep) and (mapcachep^.cpname=s) then
  165. begin
  166. getmap:=mapcachep;
  167. exit;
  168. end;
  169. hp:=mappings;
  170. while assigned(hp) do
  171. begin
  172. if hp^.cpname=s then
  173. begin
  174. getmap:=hp;
  175. mapcache:=s;
  176. mapcachep:=hp;
  177. exit;
  178. end;
  179. hp:=hp^.next;
  180. end;
  181. getmap:=nil;
  182. end;
  183. function getmap(cp : word) : punicodemap;
  184. var
  185. hp : punicodemap;
  186. const
  187. mapcache : word = 0;
  188. mapcachep : punicodemap = nil;
  189. begin
  190. if (mapcache=cp) and assigned(mapcachep) and (mapcachep^.cp=cp) then
  191. begin
  192. getmap:=mapcachep;
  193. exit;
  194. end;
  195. hp:=mappings;
  196. while assigned(hp) do
  197. begin
  198. if hp^.cp=cp then
  199. begin
  200. getmap:=hp;
  201. mapcache:=cp;
  202. mapcachep:=hp;
  203. exit;
  204. end;
  205. hp:=hp^.next;
  206. end;
  207. getmap:=nil;
  208. end;
  209. function mappingavailable(const s : string) : boolean;
  210. begin
  211. mappingavailable:=getmap(s)<>nil;
  212. end;
  213. function mappingavailable(cp : word) : boolean;
  214. begin
  215. mappingavailable:=getmap(cp)<>nil;
  216. end;
  217. function getunicode(c : char;p : punicodemap) : tunicodechar;
  218. begin
  219. if ord(c)<=p^.lastchar then
  220. getunicode:=p^.map[ord(c)].unicode
  221. else
  222. getunicode:=0;
  223. end;
  224. function getascii(c : tunicodechar;p : punicodemap) : string;
  225. var
  226. i : longint;
  227. begin
  228. { at least map to '?' }
  229. getascii:=#63;
  230. for i:=0 to p^.lastchar do
  231. if p^.map[i].unicode=c then
  232. begin
  233. if i<256 then
  234. getascii:=chr(i)
  235. else
  236. getascii:=chr(i div 256)+chr(i mod 256);
  237. exit;
  238. end;
  239. end;
  240. const
  241. map : array[0..255] of tunicodecharmapping = (
  242. (unicode : 0; flag : umf_noinfo; reserved: 0),
  243. (unicode : 1; flag : umf_noinfo; reserved: 0),
  244. (unicode : 2; flag : umf_noinfo; reserved: 0),
  245. (unicode : 3; flag : umf_noinfo; reserved: 0),
  246. (unicode : 4; flag : umf_noinfo; reserved: 0),
  247. (unicode : 5; flag : umf_noinfo; reserved: 0),
  248. (unicode : 6; flag : umf_noinfo; reserved: 0),
  249. (unicode : 7; flag : umf_noinfo; reserved: 0),
  250. (unicode : 8; flag : umf_noinfo; reserved: 0),
  251. (unicode : 9; flag : umf_noinfo; reserved: 0),
  252. (unicode : 10; flag : umf_noinfo; reserved: 0),
  253. (unicode : 11; flag : umf_noinfo; reserved: 0),
  254. (unicode : 12; flag : umf_noinfo; reserved: 0),
  255. (unicode : 13; flag : umf_noinfo; reserved: 0),
  256. (unicode : 14; flag : umf_noinfo; reserved: 0),
  257. (unicode : 15; flag : umf_noinfo; reserved: 0),
  258. (unicode : 16; flag : umf_noinfo; reserved: 0),
  259. (unicode : 17; flag : umf_noinfo; reserved: 0),
  260. (unicode : 18; flag : umf_noinfo; reserved: 0),
  261. (unicode : 19; flag : umf_noinfo; reserved: 0),
  262. (unicode : 20; flag : umf_noinfo; reserved: 0),
  263. (unicode : 21; flag : umf_noinfo; reserved: 0),
  264. (unicode : 22; flag : umf_noinfo; reserved: 0),
  265. (unicode : 23; flag : umf_noinfo; reserved: 0),
  266. (unicode : 24; flag : umf_noinfo; reserved: 0),
  267. (unicode : 25; flag : umf_noinfo; reserved: 0),
  268. (unicode : 26; flag : umf_noinfo; reserved: 0),
  269. (unicode : 27; flag : umf_noinfo; reserved: 0),
  270. (unicode : 28; flag : umf_noinfo; reserved: 0),
  271. (unicode : 29; flag : umf_noinfo; reserved: 0),
  272. (unicode : 30; flag : umf_noinfo; reserved: 0),
  273. (unicode : 31; flag : umf_noinfo; reserved: 0),
  274. (unicode : 32; flag : umf_noinfo; reserved: 0),
  275. (unicode : 33; flag : umf_noinfo; reserved: 0),
  276. (unicode : 34; flag : umf_noinfo; reserved: 0),
  277. (unicode : 35; flag : umf_noinfo; reserved: 0),
  278. (unicode : 36; flag : umf_noinfo; reserved: 0),
  279. (unicode : 37; flag : umf_noinfo; reserved: 0),
  280. (unicode : 38; flag : umf_noinfo; reserved: 0),
  281. (unicode : 39; flag : umf_noinfo; reserved: 0),
  282. (unicode : 40; flag : umf_noinfo; reserved: 0),
  283. (unicode : 41; flag : umf_noinfo; reserved: 0),
  284. (unicode : 42; flag : umf_noinfo; reserved: 0),
  285. (unicode : 43; flag : umf_noinfo; reserved: 0),
  286. (unicode : 44; flag : umf_noinfo; reserved: 0),
  287. (unicode : 45; flag : umf_noinfo; reserved: 0),
  288. (unicode : 46; flag : umf_noinfo; reserved: 0),
  289. (unicode : 47; flag : umf_noinfo; reserved: 0),
  290. (unicode : 48; flag : umf_noinfo; reserved: 0),
  291. (unicode : 49; flag : umf_noinfo; reserved: 0),
  292. (unicode : 50; flag : umf_noinfo; reserved: 0),
  293. (unicode : 51; flag : umf_noinfo; reserved: 0),
  294. (unicode : 52; flag : umf_noinfo; reserved: 0),
  295. (unicode : 53; flag : umf_noinfo; reserved: 0),
  296. (unicode : 54; flag : umf_noinfo; reserved: 0),
  297. (unicode : 55; flag : umf_noinfo; reserved: 0),
  298. (unicode : 56; flag : umf_noinfo; reserved: 0),
  299. (unicode : 57; flag : umf_noinfo; reserved: 0),
  300. (unicode : 58; flag : umf_noinfo; reserved: 0),
  301. (unicode : 59; flag : umf_noinfo; reserved: 0),
  302. (unicode : 60; flag : umf_noinfo; reserved: 0),
  303. (unicode : 61; flag : umf_noinfo; reserved: 0),
  304. (unicode : 62; flag : umf_noinfo; reserved: 0),
  305. (unicode : 63; flag : umf_noinfo; reserved: 0),
  306. (unicode : 64; flag : umf_noinfo; reserved: 0),
  307. (unicode : 65; flag : umf_noinfo; reserved: 0),
  308. (unicode : 66; flag : umf_noinfo; reserved: 0),
  309. (unicode : 67; flag : umf_noinfo; reserved: 0),
  310. (unicode : 68; flag : umf_noinfo; reserved: 0),
  311. (unicode : 69; flag : umf_noinfo; reserved: 0),
  312. (unicode : 70; flag : umf_noinfo; reserved: 0),
  313. (unicode : 71; flag : umf_noinfo; reserved: 0),
  314. (unicode : 72; flag : umf_noinfo; reserved: 0),
  315. (unicode : 73; flag : umf_noinfo; reserved: 0),
  316. (unicode : 74; flag : umf_noinfo; reserved: 0),
  317. (unicode : 75; flag : umf_noinfo; reserved: 0),
  318. (unicode : 76; flag : umf_noinfo; reserved: 0),
  319. (unicode : 77; flag : umf_noinfo; reserved: 0),
  320. (unicode : 78; flag : umf_noinfo; reserved: 0),
  321. (unicode : 79; flag : umf_noinfo; reserved: 0),
  322. (unicode : 80; flag : umf_noinfo; reserved: 0),
  323. (unicode : 81; flag : umf_noinfo; reserved: 0),
  324. (unicode : 82; flag : umf_noinfo; reserved: 0),
  325. (unicode : 83; flag : umf_noinfo; reserved: 0),
  326. (unicode : 84; flag : umf_noinfo; reserved: 0),
  327. (unicode : 85; flag : umf_noinfo; reserved: 0),
  328. (unicode : 86; flag : umf_noinfo; reserved: 0),
  329. (unicode : 87; flag : umf_noinfo; reserved: 0),
  330. (unicode : 88; flag : umf_noinfo; reserved: 0),
  331. (unicode : 89; flag : umf_noinfo; reserved: 0),
  332. (unicode : 90; flag : umf_noinfo; reserved: 0),
  333. (unicode : 91; flag : umf_noinfo; reserved: 0),
  334. (unicode : 92; flag : umf_noinfo; reserved: 0),
  335. (unicode : 93; flag : umf_noinfo; reserved: 0),
  336. (unicode : 94; flag : umf_noinfo; reserved: 0),
  337. (unicode : 95; flag : umf_noinfo; reserved: 0),
  338. (unicode : 96; flag : umf_noinfo; reserved: 0),
  339. (unicode : 97; flag : umf_noinfo; reserved: 0),
  340. (unicode : 98; flag : umf_noinfo; reserved: 0),
  341. (unicode : 99; flag : umf_noinfo; reserved: 0),
  342. (unicode : 100; flag : umf_noinfo; reserved: 0),
  343. (unicode : 101; flag : umf_noinfo; reserved: 0),
  344. (unicode : 102; flag : umf_noinfo; reserved: 0),
  345. (unicode : 103; flag : umf_noinfo; reserved: 0),
  346. (unicode : 104; flag : umf_noinfo; reserved: 0),
  347. (unicode : 105; flag : umf_noinfo; reserved: 0),
  348. (unicode : 106; flag : umf_noinfo; reserved: 0),
  349. (unicode : 107; flag : umf_noinfo; reserved: 0),
  350. (unicode : 108; flag : umf_noinfo; reserved: 0),
  351. (unicode : 109; flag : umf_noinfo; reserved: 0),
  352. (unicode : 110; flag : umf_noinfo; reserved: 0),
  353. (unicode : 111; flag : umf_noinfo; reserved: 0),
  354. (unicode : 112; flag : umf_noinfo; reserved: 0),
  355. (unicode : 113; flag : umf_noinfo; reserved: 0),
  356. (unicode : 114; flag : umf_noinfo; reserved: 0),
  357. (unicode : 115; flag : umf_noinfo; reserved: 0),
  358. (unicode : 116; flag : umf_noinfo; reserved: 0),
  359. (unicode : 117; flag : umf_noinfo; reserved: 0),
  360. (unicode : 118; flag : umf_noinfo; reserved: 0),
  361. (unicode : 119; flag : umf_noinfo; reserved: 0),
  362. (unicode : 120; flag : umf_noinfo; reserved: 0),
  363. (unicode : 121; flag : umf_noinfo; reserved: 0),
  364. (unicode : 122; flag : umf_noinfo; reserved: 0),
  365. (unicode : 123; flag : umf_noinfo; reserved: 0),
  366. (unicode : 124; flag : umf_noinfo; reserved: 0),
  367. (unicode : 125; flag : umf_noinfo; reserved: 0),
  368. (unicode : 126; flag : umf_noinfo; reserved: 0),
  369. (unicode : 127; flag : umf_noinfo; reserved: 0),
  370. (unicode : 128; flag : umf_noinfo; reserved: 0),
  371. (unicode : 129; flag : umf_noinfo; reserved: 0),
  372. (unicode : 130; flag : umf_noinfo; reserved: 0),
  373. (unicode : 131; flag : umf_noinfo; reserved: 0),
  374. (unicode : 132; flag : umf_noinfo; reserved: 0),
  375. (unicode : 133; flag : umf_noinfo; reserved: 0),
  376. (unicode : 134; flag : umf_noinfo; reserved: 0),
  377. (unicode : 135; flag : umf_noinfo; reserved: 0),
  378. (unicode : 136; flag : umf_noinfo; reserved: 0),
  379. (unicode : 137; flag : umf_noinfo; reserved: 0),
  380. (unicode : 138; flag : umf_noinfo; reserved: 0),
  381. (unicode : 139; flag : umf_noinfo; reserved: 0),
  382. (unicode : 140; flag : umf_noinfo; reserved: 0),
  383. (unicode : 141; flag : umf_noinfo; reserved: 0),
  384. (unicode : 142; flag : umf_noinfo; reserved: 0),
  385. (unicode : 143; flag : umf_noinfo; reserved: 0),
  386. (unicode : 144; flag : umf_noinfo; reserved: 0),
  387. (unicode : 145; flag : umf_noinfo; reserved: 0),
  388. (unicode : 146; flag : umf_noinfo; reserved: 0),
  389. (unicode : 147; flag : umf_noinfo; reserved: 0),
  390. (unicode : 148; flag : umf_noinfo; reserved: 0),
  391. (unicode : 149; flag : umf_noinfo; reserved: 0),
  392. (unicode : 150; flag : umf_noinfo; reserved: 0),
  393. (unicode : 151; flag : umf_noinfo; reserved: 0),
  394. (unicode : 152; flag : umf_noinfo; reserved: 0),
  395. (unicode : 153; flag : umf_noinfo; reserved: 0),
  396. (unicode : 154; flag : umf_noinfo; reserved: 0),
  397. (unicode : 155; flag : umf_noinfo; reserved: 0),
  398. (unicode : 156; flag : umf_noinfo; reserved: 0),
  399. (unicode : 157; flag : umf_noinfo; reserved: 0),
  400. (unicode : 158; flag : umf_noinfo; reserved: 0),
  401. (unicode : 159; flag : umf_noinfo; reserved: 0),
  402. (unicode : 160; flag : umf_noinfo; reserved: 0),
  403. (unicode : 161; flag : umf_noinfo; reserved: 0),
  404. (unicode : 162; flag : umf_noinfo; reserved: 0),
  405. (unicode : 163; flag : umf_noinfo; reserved: 0),
  406. (unicode : 164; flag : umf_noinfo; reserved: 0),
  407. (unicode : 165; flag : umf_noinfo; reserved: 0),
  408. (unicode : 166; flag : umf_noinfo; reserved: 0),
  409. (unicode : 167; flag : umf_noinfo; reserved: 0),
  410. (unicode : 168; flag : umf_noinfo; reserved: 0),
  411. (unicode : 169; flag : umf_noinfo; reserved: 0),
  412. (unicode : 170; flag : umf_noinfo; reserved: 0),
  413. (unicode : 171; flag : umf_noinfo; reserved: 0),
  414. (unicode : 172; flag : umf_noinfo; reserved: 0),
  415. (unicode : 173; flag : umf_noinfo; reserved: 0),
  416. (unicode : 174; flag : umf_noinfo; reserved: 0),
  417. (unicode : 175; flag : umf_noinfo; reserved: 0),
  418. (unicode : 176; flag : umf_noinfo; reserved: 0),
  419. (unicode : 177; flag : umf_noinfo; reserved: 0),
  420. (unicode : 178; flag : umf_noinfo; reserved: 0),
  421. (unicode : 179; flag : umf_noinfo; reserved: 0),
  422. (unicode : 180; flag : umf_noinfo; reserved: 0),
  423. (unicode : 181; flag : umf_noinfo; reserved: 0),
  424. (unicode : 182; flag : umf_noinfo; reserved: 0),
  425. (unicode : 183; flag : umf_noinfo; reserved: 0),
  426. (unicode : 184; flag : umf_noinfo; reserved: 0),
  427. (unicode : 185; flag : umf_noinfo; reserved: 0),
  428. (unicode : 186; flag : umf_noinfo; reserved: 0),
  429. (unicode : 187; flag : umf_noinfo; reserved: 0),
  430. (unicode : 188; flag : umf_noinfo; reserved: 0),
  431. (unicode : 189; flag : umf_noinfo; reserved: 0),
  432. (unicode : 190; flag : umf_noinfo; reserved: 0),
  433. (unicode : 191; flag : umf_noinfo; reserved: 0),
  434. (unicode : 192; flag : umf_noinfo; reserved: 0),
  435. (unicode : 193; flag : umf_noinfo; reserved: 0),
  436. (unicode : 194; flag : umf_noinfo; reserved: 0),
  437. (unicode : 195; flag : umf_noinfo; reserved: 0),
  438. (unicode : 196; flag : umf_noinfo; reserved: 0),
  439. (unicode : 197; flag : umf_noinfo; reserved: 0),
  440. (unicode : 198; flag : umf_noinfo; reserved: 0),
  441. (unicode : 199; flag : umf_noinfo; reserved: 0),
  442. (unicode : 200; flag : umf_noinfo; reserved: 0),
  443. (unicode : 201; flag : umf_noinfo; reserved: 0),
  444. (unicode : 202; flag : umf_noinfo; reserved: 0),
  445. (unicode : 203; flag : umf_noinfo; reserved: 0),
  446. (unicode : 204; flag : umf_noinfo; reserved: 0),
  447. (unicode : 205; flag : umf_noinfo; reserved: 0),
  448. (unicode : 206; flag : umf_noinfo; reserved: 0),
  449. (unicode : 207; flag : umf_noinfo; reserved: 0),
  450. (unicode : 208; flag : umf_noinfo; reserved: 0),
  451. (unicode : 209; flag : umf_noinfo; reserved: 0),
  452. (unicode : 210; flag : umf_noinfo; reserved: 0),
  453. (unicode : 211; flag : umf_noinfo; reserved: 0),
  454. (unicode : 212; flag : umf_noinfo; reserved: 0),
  455. (unicode : 213; flag : umf_noinfo; reserved: 0),
  456. (unicode : 214; flag : umf_noinfo; reserved: 0),
  457. (unicode : 215; flag : umf_noinfo; reserved: 0),
  458. (unicode : 216; flag : umf_noinfo; reserved: 0),
  459. (unicode : 217; flag : umf_noinfo; reserved: 0),
  460. (unicode : 218; flag : umf_noinfo; reserved: 0),
  461. (unicode : 219; flag : umf_noinfo; reserved: 0),
  462. (unicode : 220; flag : umf_noinfo; reserved: 0),
  463. (unicode : 221; flag : umf_noinfo; reserved: 0),
  464. (unicode : 222; flag : umf_noinfo; reserved: 0),
  465. (unicode : 223; flag : umf_noinfo; reserved: 0),
  466. (unicode : 224; flag : umf_noinfo; reserved: 0),
  467. (unicode : 225; flag : umf_noinfo; reserved: 0),
  468. (unicode : 226; flag : umf_noinfo; reserved: 0),
  469. (unicode : 227; flag : umf_noinfo; reserved: 0),
  470. (unicode : 228; flag : umf_noinfo; reserved: 0),
  471. (unicode : 229; flag : umf_noinfo; reserved: 0),
  472. (unicode : 230; flag : umf_noinfo; reserved: 0),
  473. (unicode : 231; flag : umf_noinfo; reserved: 0),
  474. (unicode : 232; flag : umf_noinfo; reserved: 0),
  475. (unicode : 233; flag : umf_noinfo; reserved: 0),
  476. (unicode : 234; flag : umf_noinfo; reserved: 0),
  477. (unicode : 235; flag : umf_noinfo; reserved: 0),
  478. (unicode : 236; flag : umf_noinfo; reserved: 0),
  479. (unicode : 237; flag : umf_noinfo; reserved: 0),
  480. (unicode : 238; flag : umf_noinfo; reserved: 0),
  481. (unicode : 239; flag : umf_noinfo; reserved: 0),
  482. (unicode : 240; flag : umf_noinfo; reserved: 0),
  483. (unicode : 241; flag : umf_noinfo; reserved: 0),
  484. (unicode : 242; flag : umf_noinfo; reserved: 0),
  485. (unicode : 243; flag : umf_noinfo; reserved: 0),
  486. (unicode : 244; flag : umf_noinfo; reserved: 0),
  487. (unicode : 245; flag : umf_noinfo; reserved: 0),
  488. (unicode : 246; flag : umf_noinfo; reserved: 0),
  489. (unicode : 247; flag : umf_noinfo; reserved: 0),
  490. (unicode : 248; flag : umf_noinfo; reserved: 0),
  491. (unicode : 249; flag : umf_noinfo; reserved: 0),
  492. (unicode : 250; flag : umf_noinfo; reserved: 0),
  493. (unicode : 251; flag : umf_noinfo; reserved: 0),
  494. (unicode : 252; flag : umf_noinfo; reserved: 0),
  495. (unicode : 253; flag : umf_noinfo; reserved: 0),
  496. (unicode : 254; flag : umf_noinfo; reserved: 0),
  497. (unicode : 255; flag : umf_noinfo; reserved: 0)
  498. );
  499. unicodemap : tunicodemap = (
  500. cpname : '8859-1';
  501. cp : 28591;
  502. map : @map;
  503. lastchar : 255;
  504. next : nil;
  505. internalmap : true
  506. );
  507. var
  508. hp : punicodemap;
  509. initialization
  510. mappings:=nil;
  511. registermapping(@unicodemap)
  512. finalization
  513. while assigned(mappings) do
  514. begin
  515. hp:=mappings^.next;
  516. if not(mappings^.internalmap) then
  517. begin
  518. freemem(mappings^.map);
  519. dispose(mappings);
  520. end;
  521. mappings:=hp;
  522. end;
  523. end.