Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

948 lines
29 KiB

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Filename : PropArray.h
  4. // Purpose : properties definitions
  5. //
  6. // Project : WordBreakers
  7. // Component: English word breaker
  8. //
  9. // Author : yairh
  10. //
  11. // Log:
  12. //
  13. // Jan 06 2000 yairh creation
  14. // May 07 2000 dovh - const array generation:
  15. // split PropArray.h => PropArray.h + PropFlags.h
  16. // May 11 2000 dovh - Simplify GET_PROP to do double indexing always.
  17. //
  18. ////////////////////////////////////////////////////////////////////////////////
  19. #ifndef _PROP_ARRAY_H_
  20. #define _PROP_ARRAY_H_
  21. #include "PropFlags.h"
  22. ///////////////////////////////////////////////////////////////////////////////
  23. // Class CPropFlag
  24. ///////////////////////////////////////////////////////////////////////////////
  25. class CPropFlag
  26. {
  27. public:
  28. //
  29. // methods
  30. //
  31. CPropFlag();
  32. CPropFlag(ULONGLONG ul);
  33. void Clear();
  34. void Set(ULONGLONG ul);
  35. CPropFlag& operator= (const CPropFlag& f);
  36. CPropFlag& operator|= (const CPropFlag& f);
  37. public:
  38. //
  39. // members
  40. //
  41. ULONGLONG m_ulFlag;
  42. };
  43. inline CPropFlag::CPropFlag(): m_ulFlag(0)
  44. {
  45. }
  46. inline CPropFlag::CPropFlag(ULONGLONG ul): m_ulFlag(ul)
  47. {
  48. }
  49. inline void CPropFlag::Clear()
  50. {
  51. m_ulFlag = 0;
  52. }
  53. inline void CPropFlag::Set(ULONGLONG ul)
  54. {
  55. m_ulFlag |= ul;
  56. #ifdef DECLARE_BYTE_ARRAY
  57. if (ul & PROP_DEFAULT_BREAKER)
  58. {
  59. m_ulFlag |= PROP_RESERVED_BREAKER;
  60. }
  61. #endif // DECLARE_BYTE_ARRAY
  62. }
  63. inline CPropFlag& CPropFlag::operator= (const CPropFlag& f)
  64. {
  65. m_ulFlag = f.m_ulFlag;
  66. return *this;
  67. }
  68. inline CPropFlag& CPropFlag::operator|= (const CPropFlag& f)
  69. {
  70. m_ulFlag |= f.m_ulFlag;
  71. return *this;
  72. }
  73. ///////////////////////////////////////////////////////////////////////////////
  74. // Class CTokenState
  75. ///////////////////////////////////////////////////////////////////////////////
  76. class CPropArray
  77. {
  78. public:
  79. //
  80. // methods
  81. //
  82. CPropArray();
  83. ~CPropArray();
  84. CPropFlag& GetPropForUpdate(WCHAR wch);
  85. public:
  86. //
  87. // members
  88. //
  89. CPropFlag* m_apCodePage[1<<8];
  90. CPropFlag m_aDefaultCodePage[1<<8];
  91. };
  92. inline CPropArray::CPropArray()
  93. {
  94. for (WCHAR wch = 0; wch < (1<<8); wch++)
  95. {
  96. m_apCodePage[wch] = NULL;
  97. }
  98. //
  99. // White space characters
  100. //
  101. for(wch=0x0; wch <= 0x1F; wch++) // control 0x0 - 0x1F
  102. {
  103. GetPropForUpdate(wch).Set(PROP_WS);
  104. }
  105. for(wch=0x80; wch <= 0x9F; wch++) // control 0x80 - 0x9F
  106. {
  107. GetPropForUpdate(wch).Set(PROP_WS);
  108. }
  109. GetPropForUpdate(0x7F).Set(PROP_WS); // control
  110. GetPropForUpdate(0x0020).Set(PROP_WS); // space
  111. GetPropForUpdate(0x0022).Set(PROP_WS); // quotation mark
  112. GetPropForUpdate(0x00AB).Set(PROP_WS); // left angle double pointing quotation mark
  113. GetPropForUpdate(0x00BB).Set(PROP_WS); // right angle double pointing quotation mark
  114. GetPropForUpdate(0x201A).Set(PROP_WS); // Single low-9 quotation mark
  115. GetPropForUpdate(0x201B).Set(PROP_WS); // Single low-9 quotation mark
  116. GetPropForUpdate(0x201C).Set(PROP_WS); // Left double quotation mark
  117. GetPropForUpdate(0x201D).Set(PROP_WS); // Right double quotation mark
  118. GetPropForUpdate(0x201E).Set(PROP_WS); // Double low-9 quotation mark
  119. GetPropForUpdate(0x201F).Set(PROP_WS); // Double high-reversed-9 quotation mark
  120. GetPropForUpdate(0x2039).Set(PROP_WS); // single left pointing quotation mark
  121. GetPropForUpdate(0x203A).Set(PROP_WS); // single right pointing quotation mark
  122. GetPropForUpdate(0x301D).Set(PROP_WS); // Reverse double prime quotation mark
  123. GetPropForUpdate(0x301E).Set(PROP_WS); // Double prime quotation mark
  124. GetPropForUpdate(0x301F).Set(PROP_WS); // Low double prime quotation mark
  125. for(wch=0x2000; wch <= 0x200B; wch++) // space 0x2000 - 0x200B
  126. {
  127. GetPropForUpdate(wch).Set(PROP_WS);
  128. }
  129. GetPropForUpdate(0x3000).Set(PROP_WS); // space
  130. GetPropForUpdate(0xFF02).Set(PROP_WS); // Full width quotation mark
  131. // Geometrical shapes, arrows and other characters that can be ignored
  132. for(wch=0x2190; wch <= 0x21F3; wch++) // Arrows
  133. {
  134. GetPropForUpdate(wch).Set(PROP_WS);
  135. }
  136. for(wch=0x2500; wch <= 0x257F; wch++) // Box Drawing
  137. {
  138. GetPropForUpdate(wch).Set(PROP_WS);
  139. }
  140. for(wch=0x2580; wch <= 0x2595; wch++) // Block Elements
  141. {
  142. GetPropForUpdate(wch).Set(PROP_WS);
  143. }
  144. for(wch=0x25A0; wch <= 0x25F7; wch++) // Geometric Shapes
  145. {
  146. GetPropForUpdate(wch).Set(PROP_WS);
  147. }
  148. //
  149. // Exclmation mark
  150. //
  151. GetPropForUpdate(0x0021).Set(PROP_EXCLAMATION_MARK);
  152. GetPropForUpdate(0x00A1).Set(PROP_EXCLAMATION_MARK);
  153. GetPropForUpdate(0x01C3).Set(PROP_EXCLAMATION_MARK);
  154. GetPropForUpdate(0x203C).Set(PROP_EXCLAMATION_MARK);
  155. GetPropForUpdate(0x203D).Set(PROP_EXCLAMATION_MARK);
  156. GetPropForUpdate(0x2762).Set(PROP_EXCLAMATION_MARK);
  157. GetPropForUpdate(0xFF01).Set(PROP_EXCLAMATION_MARK); // Full width
  158. //
  159. // Number sign
  160. //
  161. GetPropForUpdate(0x0023).Set(PROP_POUND); // #
  162. GetPropForUpdate(0xFF03).Set(PROP_POUND); // Full width
  163. //
  164. // Dollar sign
  165. //
  166. GetPropForUpdate(0x0024).Set(PROP_DOLLAR); // $
  167. GetPropForUpdate(0xFF04).Set(PROP_DOLLAR); // Full width
  168. //
  169. // Percentage sign
  170. //
  171. GetPropForUpdate(0x0025).Set(PROP_PERCENTAGE);
  172. GetPropForUpdate(0x2030).Set(PROP_PERCENTAGE);
  173. GetPropForUpdate(0x2031).Set(PROP_PERCENTAGE);
  174. GetPropForUpdate(0xFF05).Set(PROP_PERCENTAGE); // Full width
  175. //
  176. // Ampersand
  177. //
  178. GetPropForUpdate(0x0026).Set(PROP_AND); // &
  179. //
  180. // Apostrophe
  181. //
  182. GetPropForUpdate(0x0027).Set(PROP_APOSTROPHE);
  183. GetPropForUpdate(0x2018).Set(PROP_APOSTROPHE);
  184. GetPropForUpdate(0x2019).Set(PROP_APOSTROPHE);
  185. GetPropForUpdate(0x2032).Set(PROP_APOSTROPHE);
  186. GetPropForUpdate(0xFF07).Set(PROP_APOSTROPHE); // Full width
  187. //
  188. // Parenthesis
  189. //
  190. GetPropForUpdate(0x0028).Set(PROP_LEFT_PAREN); // (
  191. GetPropForUpdate(0xFF08).Set(PROP_LEFT_PAREN); // Full width
  192. GetPropForUpdate(0x0029).Set(PROP_RIGHT_PAREN); // )
  193. GetPropForUpdate(0xFF09).Set(PROP_RIGHT_PAREN); // Full width
  194. //
  195. // Asterisk
  196. //
  197. GetPropForUpdate(0x002A).Set(PROP_ASTERISK); // *
  198. GetPropForUpdate(0x2217).Set(PROP_ASTERISK);
  199. GetPropForUpdate(0x2731).Set(PROP_ASTERISK);
  200. GetPropForUpdate(0xFF0A).Set(PROP_ASTERISK); // Full width
  201. //
  202. // Plus sign
  203. //
  204. GetPropForUpdate(0x002B).Set(PROP_PLUS); // +
  205. GetPropForUpdate(0xFF0B).Set(PROP_PLUS); // Full width
  206. //
  207. // Comma
  208. //
  209. GetPropForUpdate(0x002C).Set(PROP_COMMA);
  210. GetPropForUpdate(0x3001).Set(PROP_COMMA);
  211. GetPropForUpdate(0xFF0C).Set(PROP_COMMA); // Full width
  212. GetPropForUpdate(0xFF64).Set(PROP_COMMA); // Half width
  213. //
  214. // HYPEHN
  215. //
  216. GetPropForUpdate(0x002D).Set(PROP_DASH); // -
  217. GetPropForUpdate(0x00AD).Set(PROP_DASH); // soft hyphen
  218. GetPropForUpdate(0x2010).Set(PROP_DASH);
  219. GetPropForUpdate(0x2011).Set(PROP_DASH);
  220. GetPropForUpdate(0x2012).Set(PROP_DASH);
  221. GetPropForUpdate(0x2013).Set(PROP_DASH);
  222. GetPropForUpdate(0xFF0D).Set(PROP_DASH); // Full width
  223. //
  224. // MINUS
  225. //
  226. GetPropForUpdate(0x002D).Set(PROP_MINUS);
  227. GetPropForUpdate(0x2212).Set(PROP_MINUS);
  228. GetPropForUpdate(0xFF0D).Set(PROP_MINUS); // Full width
  229. //
  230. // Full stop period
  231. //
  232. GetPropForUpdate(0x002E).Set(PROP_PERIOD); // .
  233. GetPropForUpdate(0x3002).Set(PROP_PERIOD);
  234. GetPropForUpdate(0xFF0E).Set(PROP_PERIOD); // Full width
  235. //
  236. // SLASH
  237. //
  238. GetPropForUpdate(0x002F).Set(PROP_SLASH); // /
  239. GetPropForUpdate(0xFF0F).Set(PROP_SLASH); // Full width
  240. //
  241. // NUMBERS
  242. //
  243. for (wch = 0x0030; wch <= 0x0039 ; wch++) // 0 - 9
  244. {
  245. GetPropForUpdate(wch).Set(PROP_NUMBER);
  246. }
  247. for (wch = 0xFF10; wch <= 0xFF19 ; wch++) // 0 - 9 Full width
  248. {
  249. GetPropForUpdate(wch).Set(PROP_NUMBER);
  250. }
  251. //
  252. // HEX NUMBERS
  253. //
  254. for (wch = 0x0041; wch <= 0x0046 ; wch++) // A - F
  255. {
  256. GetPropForUpdate(wch).Set(PROP_ALPHA_XDIGIT);
  257. }
  258. for (wch = 0x0061; wch <= 0x0066 ; wch++) // a - f
  259. {
  260. GetPropForUpdate(wch).Set(PROP_ALPHA_XDIGIT);
  261. }
  262. for (wch = 0xFF21; wch <= 0xFF26 ; wch++) // A - F Full width
  263. {
  264. GetPropForUpdate(wch).Set(PROP_ALPHA_XDIGIT);
  265. }
  266. for (wch = 0xFF41; wch <= 0xFF46 ; wch++) // a - f Full width
  267. {
  268. GetPropForUpdate(wch).Set(PROP_ALPHA_XDIGIT);
  269. }
  270. //
  271. // Colon
  272. //
  273. GetPropForUpdate(0x003A).Set(PROP_COLON); // :
  274. GetPropForUpdate(0x2236).Set(PROP_COLON);
  275. GetPropForUpdate(0xFF1A).Set(PROP_COLON); // Full width :
  276. //
  277. // Semicolon
  278. //
  279. GetPropForUpdate(0x003B).Set(PROP_SEMI_COLON); // ;
  280. GetPropForUpdate(0xFF1B).Set(PROP_SEMI_COLON); // Full width ;
  281. //
  282. // Less then
  283. //
  284. GetPropForUpdate(0x003C).Set(PROP_LT); // <
  285. GetPropForUpdate(0xFF1C).Set(PROP_LT); // Full width <
  286. //
  287. // Equal sign
  288. //
  289. GetPropForUpdate(0x003D).Set(PROP_EQUAL); // =
  290. GetPropForUpdate(0x2260).Set(PROP_EQUAL); // not equal sign
  291. GetPropForUpdate(0x2261).Set(PROP_EQUAL); // identical to
  292. GetPropForUpdate(0xFF1D).Set(PROP_EQUAL); // Full width =
  293. //
  294. // Greater then
  295. //
  296. GetPropForUpdate(0x003E).Set(PROP_GT); // >
  297. GetPropForUpdate(0xFF1E).Set(PROP_GT); // Full width >
  298. //
  299. // Question mark
  300. //
  301. GetPropForUpdate(0x003F).Set(PROP_QUESTION_MARK); // ?
  302. GetPropForUpdate(0x00BF).Set(PROP_QUESTION_MARK); // inverted question mark
  303. GetPropForUpdate(0x037E).Set(PROP_QUESTION_MARK); // greek question mark
  304. GetPropForUpdate(0x203D).Set(PROP_QUESTION_MARK); // interrobang
  305. GetPropForUpdate(0x2048).Set(PROP_QUESTION_MARK); // question exclemation mark
  306. GetPropForUpdate(0x2049).Set(PROP_QUESTION_MARK); // exclamation question mark
  307. GetPropForUpdate(0xFF1F).Set(PROP_QUESTION_MARK); // Full width ?
  308. //
  309. // Commercial AT
  310. //
  311. GetPropForUpdate(0x0040).Set(PROP_AT); // @
  312. GetPropForUpdate(0xFF20).Set(PROP_AT); // Full width @
  313. //
  314. // Commersial signs
  315. //
  316. GetPropForUpdate(0x00A9).Set(PROP_COMMERSIAL_SIGN); // copy right sign
  317. GetPropForUpdate(0x00AE).Set(PROP_COMMERSIAL_SIGN); // registered sign
  318. GetPropForUpdate(0x2120).Set(PROP_COMMERSIAL_SIGN); // service mark
  319. GetPropForUpdate(0x2121).Set(PROP_COMMERSIAL_SIGN); // telephone sign
  320. GetPropForUpdate(0x2122).Set(PROP_COMMERSIAL_SIGN); // trade mark sign
  321. //
  322. // Letters
  323. //
  324. // upper case
  325. for (wch = 0x0041; wch <= 0x005A; wch++) // A - Z
  326. {
  327. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  328. }
  329. for (wch = 0x00C0; wch <= 0x00D6; wch++)
  330. {
  331. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  332. }
  333. for (wch = 0x00D8; wch <= 0x00DE; wch++)
  334. {
  335. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  336. }
  337. for (wch = 0xFF21; wch <= 0xFF3A; wch++) // Full width A - Z
  338. {
  339. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  340. }
  341. // Latin extended
  342. for (wch = 0x0100; wch <= 0x017D; wch+=2)
  343. {
  344. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  345. }
  346. GetPropForUpdate(0x0181).Set(PROP_UPPER_CASE);
  347. GetPropForUpdate(0x0182).Set(PROP_UPPER_CASE);
  348. GetPropForUpdate(0x0184).Set(PROP_UPPER_CASE);
  349. GetPropForUpdate(0x0186).Set(PROP_UPPER_CASE);
  350. GetPropForUpdate(0x0187).Set(PROP_UPPER_CASE);
  351. GetPropForUpdate(0x0189).Set(PROP_UPPER_CASE);
  352. GetPropForUpdate(0x018A).Set(PROP_UPPER_CASE);
  353. GetPropForUpdate(0x018B).Set(PROP_UPPER_CASE);
  354. GetPropForUpdate(0x018E).Set(PROP_UPPER_CASE);
  355. GetPropForUpdate(0x018F).Set(PROP_UPPER_CASE);
  356. GetPropForUpdate(0x0190).Set(PROP_UPPER_CASE);
  357. GetPropForUpdate(0x0191).Set(PROP_UPPER_CASE);
  358. GetPropForUpdate(0x0193).Set(PROP_UPPER_CASE);
  359. GetPropForUpdate(0x0194).Set(PROP_UPPER_CASE);
  360. GetPropForUpdate(0x0196).Set(PROP_UPPER_CASE);
  361. GetPropForUpdate(0x0197).Set(PROP_UPPER_CASE);
  362. GetPropForUpdate(0x0198).Set(PROP_UPPER_CASE);
  363. GetPropForUpdate(0x019C).Set(PROP_UPPER_CASE);
  364. GetPropForUpdate(0x019D).Set(PROP_UPPER_CASE);
  365. GetPropForUpdate(0x019F).Set(PROP_UPPER_CASE);
  366. GetPropForUpdate(0x01A0).Set(PROP_UPPER_CASE);
  367. GetPropForUpdate(0x01A2).Set(PROP_UPPER_CASE);
  368. GetPropForUpdate(0x01A4).Set(PROP_UPPER_CASE);
  369. GetPropForUpdate(0x01A6).Set(PROP_UPPER_CASE);
  370. GetPropForUpdate(0x01A7).Set(PROP_UPPER_CASE);
  371. GetPropForUpdate(0x01A9).Set(PROP_UPPER_CASE);
  372. GetPropForUpdate(0x01AA).Set(PROP_UPPER_CASE);
  373. GetPropForUpdate(0x01AC).Set(PROP_UPPER_CASE);
  374. GetPropForUpdate(0x01AE).Set(PROP_UPPER_CASE);
  375. GetPropForUpdate(0x01AF).Set(PROP_UPPER_CASE);
  376. GetPropForUpdate(0x01B1).Set(PROP_UPPER_CASE);
  377. GetPropForUpdate(0x01B2).Set(PROP_UPPER_CASE);
  378. GetPropForUpdate(0x01B3).Set(PROP_UPPER_CASE);
  379. GetPropForUpdate(0x01B5).Set(PROP_UPPER_CASE);
  380. GetPropForUpdate(0x01B7).Set(PROP_UPPER_CASE);
  381. GetPropForUpdate(0x01B8).Set(PROP_UPPER_CASE);
  382. GetPropForUpdate(0x01BC).Set(PROP_UPPER_CASE);
  383. GetPropForUpdate(0x01C4).Set(PROP_UPPER_CASE);
  384. GetPropForUpdate(0x01C5).Set(PROP_UPPER_CASE);
  385. GetPropForUpdate(0x01C7).Set(PROP_UPPER_CASE);
  386. GetPropForUpdate(0x01C8).Set(PROP_UPPER_CASE);
  387. GetPropForUpdate(0x01CA).Set(PROP_UPPER_CASE);
  388. GetPropForUpdate(0x01CB).Set(PROP_UPPER_CASE);
  389. for (wch = 0x01CD; wch <= 0x01DB; wch+=2)
  390. {
  391. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  392. }
  393. for (wch = 0x01DE; wch <= 0x01EE; wch+=2)
  394. {
  395. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  396. }
  397. GetPropForUpdate(0x01F1).Set(PROP_UPPER_CASE);
  398. GetPropForUpdate(0x01F2).Set(PROP_UPPER_CASE);
  399. GetPropForUpdate(0x01F4).Set(PROP_UPPER_CASE);
  400. GetPropForUpdate(0x01F6).Set(PROP_UPPER_CASE);
  401. GetPropForUpdate(0x01F7).Set(PROP_UPPER_CASE);
  402. GetPropForUpdate(0x01F8).Set(PROP_UPPER_CASE);
  403. GetPropForUpdate(0x01FA).Set(PROP_UPPER_CASE);
  404. GetPropForUpdate(0x01FC).Set(PROP_UPPER_CASE);
  405. GetPropForUpdate(0x01FE).Set(PROP_UPPER_CASE);
  406. for (wch = 0x0200; wch <= 0x0232; wch+=2)
  407. {
  408. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  409. }
  410. // Latin extended additional
  411. for (wch = 0x1E00; wch <= 0x1E94; wch+=2)
  412. {
  413. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  414. }
  415. for (wch = 0x1EA0; wch <= 0x1EF8; wch+=2)
  416. {
  417. GetPropForUpdate(wch).Set(PROP_UPPER_CASE);
  418. }
  419. // lower case
  420. for (wch = 0x0061; wch <= 0x007A; wch++) // a - z
  421. {
  422. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  423. }
  424. for (wch = 0x00DF; wch <= 0x00F6; wch++)
  425. {
  426. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  427. }
  428. for (wch = 0x00F8; wch <= 0x00FF; wch++)
  429. {
  430. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  431. }
  432. for (wch = 0xFF41; wch <= 0xFF5A; wch++) // Full width a - z
  433. {
  434. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  435. }
  436. // Latin extended
  437. for (wch = 0x0101; wch <= 0x017E; wch+=2)
  438. {
  439. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  440. }
  441. GetPropForUpdate(0x017F).Set(PROP_LOWER_CASE);
  442. GetPropForUpdate(0x0180).Set(PROP_LOWER_CASE);
  443. GetPropForUpdate(0x0183).Set(PROP_LOWER_CASE);
  444. GetPropForUpdate(0x0185).Set(PROP_LOWER_CASE);
  445. GetPropForUpdate(0x0188).Set(PROP_LOWER_CASE);
  446. GetPropForUpdate(0x018C).Set(PROP_LOWER_CASE);
  447. GetPropForUpdate(0x018D).Set(PROP_LOWER_CASE);
  448. GetPropForUpdate(0x0192).Set(PROP_LOWER_CASE);
  449. GetPropForUpdate(0x0195).Set(PROP_LOWER_CASE);
  450. GetPropForUpdate(0x0199).Set(PROP_LOWER_CASE);
  451. GetPropForUpdate(0x019A).Set(PROP_LOWER_CASE);
  452. GetPropForUpdate(0x019B).Set(PROP_LOWER_CASE);
  453. GetPropForUpdate(0x019E).Set(PROP_LOWER_CASE);
  454. GetPropForUpdate(0x01A1).Set(PROP_LOWER_CASE);
  455. GetPropForUpdate(0x01A3).Set(PROP_LOWER_CASE);
  456. GetPropForUpdate(0x01A5).Set(PROP_LOWER_CASE);
  457. GetPropForUpdate(0x01A8).Set(PROP_LOWER_CASE);
  458. GetPropForUpdate(0x01AB).Set(PROP_LOWER_CASE);
  459. GetPropForUpdate(0x01AD).Set(PROP_LOWER_CASE);
  460. GetPropForUpdate(0x01B0).Set(PROP_LOWER_CASE);
  461. GetPropForUpdate(0x01B4).Set(PROP_LOWER_CASE);
  462. GetPropForUpdate(0x01B6).Set(PROP_LOWER_CASE);
  463. GetPropForUpdate(0x01B9).Set(PROP_LOWER_CASE);
  464. GetPropForUpdate(0x01BA).Set(PROP_LOWER_CASE);
  465. GetPropForUpdate(0x01BB).Set(PROP_LOWER_CASE);
  466. GetPropForUpdate(0x01BD).Set(PROP_LOWER_CASE);
  467. GetPropForUpdate(0x01BE).Set(PROP_LOWER_CASE);
  468. GetPropForUpdate(0x01BF).Set(PROP_LOWER_CASE);
  469. GetPropForUpdate(0x01C6).Set(PROP_LOWER_CASE);
  470. GetPropForUpdate(0x01C9).Set(PROP_LOWER_CASE);
  471. GetPropForUpdate(0x01CC).Set(PROP_LOWER_CASE);
  472. for (wch = 0x01CE; wch <= 0x01DC; wch+=2)
  473. {
  474. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  475. }
  476. for (wch = 0x01DD; wch <= 0x01EF; wch+=2)
  477. {
  478. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  479. }
  480. GetPropForUpdate(0x01F0).Set(PROP_LOWER_CASE);
  481. GetPropForUpdate(0x01F3).Set(PROP_LOWER_CASE);
  482. GetPropForUpdate(0x01F5).Set(PROP_LOWER_CASE);
  483. GetPropForUpdate(0x01F9).Set(PROP_LOWER_CASE);
  484. GetPropForUpdate(0x01FB).Set(PROP_LOWER_CASE);
  485. GetPropForUpdate(0x01FD).Set(PROP_LOWER_CASE);
  486. GetPropForUpdate(0x01FF).Set(PROP_LOWER_CASE);
  487. GetPropForUpdate(0x01).Set(PROP_LOWER_CASE);
  488. for (wch = 0x0201; wch <= 0x0233; wch+=2)
  489. {
  490. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  491. }
  492. for (wch = 0x0250; wch <= 0x02AD; wch++)
  493. {
  494. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  495. }
  496. // Latin extended additional
  497. for (wch = 0x1E01; wch <= 0x1E95; wch+=2)
  498. {
  499. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  500. }
  501. for (wch = 0x1E96; wch <= 0x1E9B; wch++)
  502. {
  503. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  504. }
  505. for (wch = 0x1EA1; wch <= 0x1EF9; wch+=2)
  506. {
  507. GetPropForUpdate(wch).Set(PROP_LOWER_CASE);
  508. }
  509. // special letters
  510. GetPropForUpdate(L'w').Set(PROP_W);
  511. GetPropForUpdate(L'W').Set(PROP_W);
  512. //
  513. // Bracket
  514. //
  515. GetPropForUpdate(0x005B).Set(PROP_LEFT_BRAKCET); // [
  516. GetPropForUpdate(0xFF3B).Set(PROP_LEFT_BRAKCET); // Full width [
  517. GetPropForUpdate(0x2329).Set(PROP_LEFT_BRAKCET); // left pointing angle bracket
  518. GetPropForUpdate(0x3008).Set(PROP_LEFT_BRAKCET); // left angle bracket
  519. GetPropForUpdate(0x005D).Set(PROP_RIGHT_BRAKCET); // ]
  520. GetPropForUpdate(0xFF3D).Set(PROP_RIGHT_BRAKCET); // Full width ]
  521. GetPropForUpdate(0x232A).Set(PROP_RIGHT_BRAKCET); // right pointing angle bracket
  522. GetPropForUpdate(0x3009).Set(PROP_RIGHT_BRAKCET); // right angle bracket
  523. GetPropForUpdate(0x300A).Set(PROP_LEFT_BRAKCET);
  524. GetPropForUpdate(0x300B).Set(PROP_RIGHT_BRAKCET);
  525. GetPropForUpdate(0x300C).Set(PROP_LEFT_BRAKCET);
  526. GetPropForUpdate(0xFF62).Set(PROP_LEFT_BRAKCET);
  527. GetPropForUpdate(0x300D).Set(PROP_RIGHT_BRAKCET);
  528. GetPropForUpdate(0xFF63).Set(PROP_RIGHT_BRAKCET);
  529. GetPropForUpdate(0x300E).Set(PROP_LEFT_BRAKCET);
  530. GetPropForUpdate(0x300F).Set(PROP_RIGHT_BRAKCET);
  531. GetPropForUpdate(0x3010).Set(PROP_LEFT_BRAKCET);
  532. GetPropForUpdate(0x3011).Set(PROP_RIGHT_BRAKCET);
  533. GetPropForUpdate(0x3014).Set(PROP_LEFT_BRAKCET);
  534. GetPropForUpdate(0x3015).Set(PROP_RIGHT_BRAKCET);
  535. GetPropForUpdate(0x3016).Set(PROP_LEFT_BRAKCET);
  536. GetPropForUpdate(0x3017).Set(PROP_RIGHT_BRAKCET);
  537. GetPropForUpdate(0x3018).Set(PROP_LEFT_BRAKCET);
  538. GetPropForUpdate(0x3019).Set(PROP_RIGHT_BRAKCET);
  539. GetPropForUpdate(0x301A).Set(PROP_LEFT_BRAKCET);
  540. GetPropForUpdate(0x301B).Set(PROP_RIGHT_BRAKCET);
  541. GetPropForUpdate(0x007B).Set(PROP_LEFT_CURLY_BRACKET); // {
  542. GetPropForUpdate(0xFF5B).Set(PROP_LEFT_CURLY_BRACKET); // Full width {
  543. GetPropForUpdate(0x007D).Set(PROP_RIGHT_CURLY_BRACKET); // }
  544. GetPropForUpdate(0xFF5D).Set(PROP_RIGHT_CURLY_BRACKET); // Full width }
  545. //
  546. // Backslash
  547. //
  548. GetPropForUpdate(0x005C).Set(PROP_BACKSLASH); // \
  549. GetPropForUpdate(0xFF3C).Set(PROP_BACKSLASH); // Full width \
  550. //
  551. // Underscore
  552. //
  553. GetPropForUpdate(0x005F).Set(PROP_UNDERSCORE); // _
  554. GetPropForUpdate(0xFF3F).Set(PROP_UNDERSCORE); // Full width _
  555. //
  556. // Or
  557. //
  558. GetPropForUpdate(0x007C).Set(PROP_OR); // |
  559. GetPropForUpdate(0xFF5C).Set(PROP_OR); // Full width |
  560. //
  561. // Tilde
  562. //
  563. GetPropForUpdate(0x007E).Set(PROP_TILDE); // ~
  564. GetPropForUpdate(0xFF5E).Set(PROP_TILDE); // Full width ~
  565. GetPropForUpdate(0x223C).Set(PROP_TILDE);
  566. GetPropForUpdate(0xFF5E).Set(PROP_TILDE);
  567. //
  568. // NBS
  569. //
  570. GetPropForUpdate(0x00A0).Set(PROP_NBS); // NBS
  571. GetPropForUpdate(0x202F).Set(PROP_NBS); // narrow no break space
  572. GetPropForUpdate(0xFEFF).Set(PROP_NBS); // zero width no break space
  573. //
  574. // End of sentence
  575. //
  576. GetPropForUpdate(0x002E).Set(PROP_EOS); // .
  577. GetPropForUpdate(0xFF0E).Set(PROP_EOS); // Full width .
  578. GetPropForUpdate(0x3002).Set(PROP_EOS); // Ideographic full stop
  579. GetPropForUpdate(0xFF61).Set(PROP_EOS); // Half width ideographic full stop
  580. GetPropForUpdate(0x2024).Set(PROP_EOS); // One dot leader
  581. GetPropForUpdate(0x2025).Set(PROP_EOS); // Two dot leader
  582. GetPropForUpdate(0x2026).Set(PROP_EOS); // Three dot leader
  583. GetPropForUpdate(0x003F).Set(PROP_EOS); // ?
  584. GetPropForUpdate(0xFF1F).Set(PROP_EOS); // Full width ?
  585. GetPropForUpdate(0x00BF).Set(PROP_EOS); // inverted question mark
  586. GetPropForUpdate(0x037E).Set(PROP_EOS); // greek question mark
  587. GetPropForUpdate(0x203D).Set(PROP_EOS); // interrobang
  588. GetPropForUpdate(0x2048).Set(PROP_EOS); // question exclemation mark
  589. GetPropForUpdate(0x2049).Set(PROP_EOS); // exclamation question mark
  590. GetPropForUpdate(0x0021).Set(PROP_EOS);
  591. GetPropForUpdate(0xFF01).Set(PROP_EOS); // Full width
  592. GetPropForUpdate(0x00A1).Set(PROP_EOS);
  593. GetPropForUpdate(0x01C3).Set(PROP_EOS);
  594. GetPropForUpdate(0x203C).Set(PROP_EOS);
  595. GetPropForUpdate(0x203D).Set(PROP_EOS);
  596. GetPropForUpdate(0x2762).Set(PROP_EOS);
  597. GetPropForUpdate(0x003B).Set(PROP_EOS); // ;
  598. GetPropForUpdate(0xFF1B).Set(PROP_EOS); // Full width ;
  599. //
  600. // Currency
  601. //
  602. GetPropForUpdate(0x0024).Set(PROP_CURRENCY); // dollar
  603. GetPropForUpdate(0xFF04).Set(PROP_CURRENCY); // Full width dollar
  604. GetPropForUpdate(0x00A2).Set(PROP_CURRENCY); // cent
  605. GetPropForUpdate(0xFFE0).Set(PROP_CURRENCY); // Full width cent
  606. GetPropForUpdate(0x00A3).Set(PROP_CURRENCY); // pound
  607. GetPropForUpdate(0xFFE1).Set(PROP_CURRENCY); // Full width pound
  608. GetPropForUpdate(0x00A4).Set(PROP_CURRENCY); // General currency sign
  609. GetPropForUpdate(0x00A5).Set(PROP_CURRENCY); // yen
  610. GetPropForUpdate(0xFFE5).Set(PROP_CURRENCY); // Full width yen
  611. GetPropForUpdate(0x09F2).Set(PROP_CURRENCY); // Bengali Rupee Mark
  612. GetPropForUpdate(0x09F3).Set(PROP_CURRENCY); // Bengali Rupee Sign
  613. GetPropForUpdate(0x0E3F).Set(PROP_CURRENCY); // Baht (Thailand)
  614. GetPropForUpdate(0x20A0).Set(PROP_CURRENCY); // Euro
  615. GetPropForUpdate(0x20A1).Set(PROP_CURRENCY); // Colon (Costa Rica, El Salv.)
  616. GetPropForUpdate(0x20A2).Set(PROP_CURRENCY); // Cruzeiro (Brazil)
  617. GetPropForUpdate(0x20A3).Set(PROP_CURRENCY); // French Franc
  618. GetPropForUpdate(0x20A4).Set(PROP_CURRENCY); // Lira (Italy, Turkey)
  619. GetPropForUpdate(0x20A5).Set(PROP_CURRENCY); // Mill Sign (USA, 1/10 cent)
  620. GetPropForUpdate(0x20A6).Set(PROP_CURRENCY); // Naira Sign (Nigeria)
  621. GetPropForUpdate(0x20A7).Set(PROP_CURRENCY); // Peseta (Spain)
  622. GetPropForUpdate(0x20A8).Set(PROP_CURRENCY); // Rupee
  623. GetPropForUpdate(0x20A9).Set(PROP_CURRENCY); // Won (Korea)
  624. GetPropForUpdate(0xFFE6).Set(PROP_CURRENCY); // Full width Won (Korea)
  625. GetPropForUpdate(0x20AA).Set(PROP_CURRENCY); // New Sheqel (Israel)
  626. GetPropForUpdate(0x20AB).Set(PROP_CURRENCY); // Dong (Vietnam)
  627. GetPropForUpdate(0x20AC).Set(PROP_CURRENCY); // Euro sign
  628. GetPropForUpdate(0x20AD).Set(PROP_CURRENCY); // Kip sign
  629. GetPropForUpdate(0x20AE).Set(PROP_CURRENCY); // Tugrik sign
  630. GetPropForUpdate(0x20AF).Set(PROP_CURRENCY); // Drachma sign
  631. //
  632. // Breaker
  633. //
  634. GetPropForUpdate(0x005E).Set(PROP_BREAKER); // ^
  635. GetPropForUpdate(0xFF3E).Set(PROP_BREAKER); // Full width ^
  636. GetPropForUpdate(0x00A6).Set(PROP_BREAKER); // Broken vertical bar
  637. GetPropForUpdate(0xFFE4).Set(PROP_BREAKER); // Full width Broken vertical bar
  638. GetPropForUpdate(0x00A7).Set(PROP_BREAKER); // section sign
  639. GetPropForUpdate(0x00AB).Set(PROP_BREAKER); // Not sign
  640. GetPropForUpdate(0x00B1).Set(PROP_BREAKER); // Plus minus sign
  641. GetPropForUpdate(0x00B6).Set(PROP_BREAKER); // Pargraph sign
  642. GetPropForUpdate(0x00B7).Set(PROP_BREAKER); // Middle dot
  643. GetPropForUpdate(0x00D7).Set(PROP_BREAKER); // Multiplication sign
  644. GetPropForUpdate(0x00F7).Set(PROP_BREAKER); // Devision sign
  645. GetPropForUpdate(0x01C0).Set(PROP_BREAKER);
  646. GetPropForUpdate(0x01C1).Set(PROP_BREAKER);
  647. GetPropForUpdate(0x01C2).Set(PROP_BREAKER);
  648. GetPropForUpdate(0x200C).Set(PROP_BREAKER); // Formating character
  649. GetPropForUpdate(0x200D).Set(PROP_BREAKER); // Formating character
  650. GetPropForUpdate(0x200E).Set(PROP_BREAKER); // Formating character
  651. GetPropForUpdate(0x200F).Set(PROP_BREAKER); // Formating character
  652. GetPropForUpdate(0x2014).Set(PROP_BREAKER); // Em dash
  653. GetPropForUpdate(0x2015).Set(PROP_BREAKER); // Horizontal bar
  654. GetPropForUpdate(0x2016).Set(PROP_BREAKER); // Double vertical line
  655. for (wch = 0x2020; wch <= 0x2027; wch++)
  656. {
  657. GetPropForUpdate(wch).Set(PROP_BREAKER);
  658. }
  659. for (wch = 0x2028; wch <= 0x202E; wch++) // Formating characters
  660. {
  661. GetPropForUpdate(wch).Set(PROP_BREAKER);
  662. }
  663. for (wch = 0x2030; wch <= 0x2038; wch++) // General punctuation
  664. {
  665. GetPropForUpdate(wch).Set(PROP_BREAKER);
  666. }
  667. GetPropForUpdate(0x203B).Set(PROP_BREAKER);
  668. for (wch = 0x203F; wch <= 0x2046; wch++) // General punctuation
  669. {
  670. GetPropForUpdate(wch).Set(PROP_BREAKER);
  671. }
  672. for (wch = 0x204A; wch <= 0x206F; wch++) // General punctuation
  673. {
  674. GetPropForUpdate(wch).Set(PROP_BREAKER);
  675. }
  676. for (wch = 0x2190; wch <= 0x21F3; wch++) // Arrows
  677. {
  678. GetPropForUpdate(wch).Set(PROP_BREAKER);
  679. }
  680. for (wch = 0x2200; wch <= 0x22EF; wch++) // Mathematical operators
  681. {
  682. GetPropForUpdate(wch).Set(PROP_BREAKER);
  683. }
  684. for (wch = 0x2300; wch <= 0x239A; wch++) // Miscellaneous technical
  685. {
  686. GetPropForUpdate(wch).Set(PROP_BREAKER);
  687. }
  688. GetPropForUpdate(0x3003).Set(PROP_BREAKER); // Ditto mark
  689. GetPropForUpdate(0x3012).Set(PROP_BREAKER); // Postal mark
  690. GetPropForUpdate(0x3013).Set(PROP_BREAKER); // Geta mark
  691. GetPropForUpdate(0x301C).Set(PROP_BREAKER); // Wave dash
  692. GetPropForUpdate(0x3020).Set(PROP_BREAKER); // Postal mark face
  693. GetPropForUpdate(0xFFE2).Set(PROP_BREAKER); // Full width not sign
  694. //
  695. // Transperent (all charaters that can treated as non existing for breaking)
  696. //
  697. GetPropForUpdate(0x0060).Set(PROP_TRANSPERENT); // grave accent
  698. GetPropForUpdate(0xFF40).Set(PROP_TRANSPERENT); // Full width grave accent
  699. GetPropForUpdate(0x00A0).Set(PROP_TRANSPERENT); // NBS
  700. GetPropForUpdate(0x00AF).Set(PROP_TRANSPERENT); // Macron
  701. GetPropForUpdate(0xFFE3).Set(PROP_TRANSPERENT); // Full width Macron
  702. GetPropForUpdate(0x00B4).Set(PROP_TRANSPERENT); // Acute Accent
  703. GetPropForUpdate(0x00B8).Set(PROP_TRANSPERENT); // Cedilla Accent
  704. GetPropForUpdate(0x202F).Set(PROP_TRANSPERENT); // narrow no break space
  705. GetPropForUpdate(0xFEFF).Set(PROP_TRANSPERENT); // zero width no break space
  706. GetPropForUpdate(0x00A8).Set(PROP_TRANSPERENT); // Diaeresis
  707. for (wch = 0x02B0; wch <= 0x02EE; wch++) // Modifiers
  708. {
  709. GetPropForUpdate(wch).Set(PROP_TRANSPERENT);
  710. }
  711. for (wch = 0x0300; wch <= 0x0362; wch++) // Combining Diacritical Marks
  712. {
  713. GetPropForUpdate(wch).Set(PROP_TRANSPERENT);
  714. }
  715. GetPropForUpdate(0x2017).Set(PROP_TRANSPERENT); // Double low line
  716. GetPropForUpdate(0x203E).Set(PROP_TRANSPERENT); // Over line
  717. for (wch = 0x20D0; wch <= 0x20E3; wch++) // Combining Diacritical Marks for symbols
  718. {
  719. GetPropForUpdate(wch).Set(PROP_TRANSPERENT);
  720. }
  721. for (wch = 0x302A; wch <= 0x302F; wch++) // Diacritics
  722. {
  723. GetPropForUpdate(wch).Set(PROP_TRANSPERENT);
  724. }
  725. //
  726. // Complement m_apCodePage:
  727. //
  728. // Replace all NULL entries
  729. // m_apCodePage[i] == NULL by
  730. // the same code page: m_aDefaultCodePage ==
  731. // A row of default values (== zero)
  732. //
  733. for (USHORT usCodePage = 0; usCodePage < (1<<8); usCodePage++)
  734. {
  735. if ( !m_apCodePage[usCodePage] )
  736. {
  737. m_apCodePage[usCodePage] = m_aDefaultCodePage;
  738. }
  739. } // for
  740. }
  741. inline CPropArray::~CPropArray()
  742. {
  743. for (int i=0; i< (1<<8); i++)
  744. {
  745. if (m_apCodePage[i] != m_aDefaultCodePage)
  746. {
  747. delete m_apCodePage[i];
  748. }
  749. }
  750. }
  751. inline CPropFlag& CPropArray::GetPropForUpdate(WCHAR wch)
  752. {
  753. unsigned short usCodePage = wch >> 8;
  754. if (!m_apCodePage[usCodePage])
  755. {
  756. m_apCodePage[usCodePage] = new CPropFlag[1<<8];
  757. }
  758. return (m_apCodePage[usCodePage])[wch & 0xFF];
  759. }
  760. extern CAutoClassPointer<CPropArray> g_pPropArray;
  761. #ifdef DECLARE_ULONGLONG_ARRAY
  762. extern CPropFlag * g_PropFlagArray;
  763. #endif // DECLARE_ULONGLONG_ARRAY
  764. #endif // _PROP_ARRAY_H_