ccharset.pas 22 KB

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