Syntax.cpp 31 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114
  1. #include "stdafx.h"
  2. #include "syntax.h"
  3. CString g_strInString; //定义一个字符串值除了包含字符数字、下划线_外,还包含什么字符常量, C++还会包含#, 如#include
  4. TCHAR *g_BeginCommentExStr[2];//当前语言的多行注释规则:引起多行注释的字符串
  5. TCHAR *g_EndCommentExStr[2]; //当前语言的多行注释规则:结束多行注释的字符串
  6. TCHAR *g_LineCommentStr[2]; //当前语言的单行注释规则, 以行末为中止
  7. TCHAR *g_BeginStringStr[1]; //当前语言的字符规则, 引起字符串变量的字符串
  8. TCHAR *g_EndStringStr[1]; //当前语言的字符规则, 结束字符串变量的字符串
  9. TCHAR *g_BeginCharStr[1]; //当前语言的字符规则, 结束字符型常量的字符串
  10. TCHAR *g_EndCharStr[1]; //当前语言的字符规则, 结束字符型常量的字符串
  11. BOOL g_bControl; //控制字符,如C++中的\",因为控制字符\的存在其表示的是一个引号
  12. BOOL g_bCase; //在进行关键字比较时是否区分大小写
  13. int g_nstrInStringCount;
  14. int g_nBeginCommentExStrCount;
  15. int g_nEndCommentExStrCount;
  16. int g_nLineCommentStrCount;
  17. int g_nBeginStringStrCount;
  18. int g_nEndStringStrCount;
  19. int g_nBeginCharStrCount;
  20. int g_nEndCharStrCount;
  21. int g_nCurLanguage;
  22. void SetCurLanguage(int nLanguage)
  23. {
  24. g_nCurLanguage = nLanguage;
  25. }
  26. BOOL IsSynWord(CStringArray &m_strArrayKeyWords, CString &strReadyToTest)
  27. {
  28. int val;
  29. int low=0,hig=m_strArrayKeyWords.GetSize()-1;
  30. int mid=(low+hig)/2;
  31. while(low<=hig) {
  32. CString str = m_strArrayKeyWords[mid];
  33. if(g_bCase)
  34. val=strReadyToTest.Compare(m_strArrayKeyWords[mid]);
  35. else
  36. val=strReadyToTest.CompareNoCase(m_strArrayKeyWords[mid]);
  37. if(val>0)
  38. low=mid+1;
  39. else if(val<0)
  40. hig=mid-1;
  41. else
  42. return TRUE;
  43. mid=(low+hig)/2;
  44. }
  45. return FALSE;
  46. }
  47. BOOL IsNumber(CString &strReadyToTest)
  48. {
  49. int nLength = strReadyToTest.GetLength();
  50. //*
  51. switch (g_nCurLanguage)
  52. {
  53. case _BASIC:
  54. {
  55. if (nLength > 2 && strReadyToTest[0] == _T('&') &&
  56. (strReadyToTest[1] == _T('O') || strReadyToTest[1] == _T('H')))
  57. {
  58. for (int I = 2; I < nLength; I++)
  59. {
  60. if (_istdigit(strReadyToTest[I]) ||(strReadyToTest[I] >= _T('A') &&
  61. strReadyToTest[I] <= _T('F')) ||(strReadyToTest[I] >= _T('a') &&
  62. strReadyToTest[I] <= _T('f')))
  63. continue;
  64. return FALSE;
  65. }
  66. return TRUE;
  67. }
  68. }
  69. break;
  70. default:
  71. break;
  72. } // switch
  73. if (!_istdigit(strReadyToTest[0]))
  74. return FALSE;
  75. for (int I = 1; I < nLength; I++)
  76. {
  77. if (!_istdigit(strReadyToTest[I]) && strReadyToTest[I] != _T('+') &&
  78. strReadyToTest[I] != _T('-') && strReadyToTest[I] != _T('.') &&
  79. strReadyToTest[I] != _T('e') && strReadyToTest[I] != _T('E'))
  80. return FALSE;
  81. }
  82. //*/
  83. return TRUE;
  84. }
  85. //装入关键字列表及语法解析规则
  86. void LoadSynWord(CStringArray &m_strArrayKeyWords, int nLanguage)
  87. {
  88. LoadParseRule(nLanguage);
  89. CString strAllSynWord;
  90. m_strArrayKeyWords.RemoveAll();
  91. CWinApp *app = AfxGetApp();
  92. switch ( nLanguage ) {
  93. case _BASIC:
  94. strAllSynWord = _T(" Alias,And,Any,As,Base,Boolean,Byref,Byte,Byval,Call,Case,Close,Compare,Const,Currency,Data,Date,Declare,Defbool,Defbyte,Defcur,Defdate,Defdbl,Defdec,Defint,Deflng,Defobj,Defsng,Defstr,Defvar,Dim,Do,Double,Each,Else,Elseif,End,Enum,Eqv,Erase,Error,Event,Exit,Explicit,False,For,Function,Get,Global,Gosub,Goto,If,IIf,Imp,Implements,In,Integer,Is,Let,Lib,Line,Lock,Long,Loop,Lset,New,Next,Not,Object,On,Open,Option,Optional,Or,Preserve,Print,Private,Property,Public,Put,Raiseevent,Redim,Resume,Return,Rset,Select,Set,Single,Static,Stop,String,Sub,Then,To,True,Type,Ubound,Unload,Unlock,Var,Variant,Wend,While,With,Write,Xor,#if,#End,#else,Abs,Array,Asc,Atn,CBool,CByte,CCur,CDate,CDbl,Chr,CInt,CLng,Cos,CreateObject,CSng,CStr,Date,DateAdd,DateDiff,DatePart,DateSerial,DateValue,Day,Exp,Filter,Fix,FormatCurrency,FormatDateTime,FormatNumber,FormatPercent,GetObject,Hex,Hour,InputBox,InStr,InStrRev,Int,IsArray,IsDate,IsEmpty,IsNull,IsNumeric,IsObject,Join,LBound,LCase,Left,Len,LoadPicture,Log,LTrim,Mid,Minute,Month,MonthName,MsgBox,Now,Oct,Replace,RGB,Right,Rnd,Round,RTrim,ScriptEngine,ScriptEngineBuildVersion,ScriptEngineMajorVersion,ScriptEngineMinorVersion,Second,Sgn,Sin,Space,Split,Sqr,StrComp,StrReverse,String,Tan,Time,TimeSerial,TimeValue,Trim,TypeName,UBound,UCase,VarType,Weekday,WeekdayName,Year,SelectYK,ExecuteYK,MannulSetYX,MannulSetYC,IsMainServer,SelectYT,ExecuteYT,CancelMansetYX,CancelMansetYC,Sleeps,");
  95. strAllSynWord = app->GetProfileString(_T("Keywords"), _T("_BASIC"), strAllSynWord);
  96. break;
  97. default: //is NONE
  98. return;
  99. }
  100. if(!g_bCase) {
  101. strAllSynWord.MakeLower();
  102. }
  103. CString strTemp;
  104. int nPosPrior = 0;
  105. int nPos;
  106. nPos = strAllSynWord.Find(_T(","), nPosPrior);
  107. while(nPos!=-1)
  108. {
  109. strTemp = strAllSynWord.Mid(nPosPrior+1 , nPos - nPosPrior - 1);
  110. m_strArrayKeyWords.Add(strTemp);
  111. nPosPrior = nPos;
  112. nPos = strAllSynWord.Find(_T(","), nPosPrior + 1);
  113. }
  114. SortSynWordArray(m_strArrayKeyWords);
  115. }
  116. void SortSynWordArray(CStringArray &m_strArrayKeyWords)
  117. {
  118. int i,j,x, count = m_strArrayKeyWords.GetSize();
  119. CString strtmp;
  120. for(i=1;i<count;i++)
  121. {
  122. for(x=0;x<i;x++)
  123. {
  124. if(m_strArrayKeyWords.GetAt(i).Compare(m_strArrayKeyWords.GetAt(x))<=0)
  125. break;
  126. }
  127. strtmp=m_strArrayKeyWords.GetAt(i);
  128. for(j=i;j>x;j--)
  129. m_strArrayKeyWords.SetAt(j, m_strArrayKeyWords.GetAt(j-1));
  130. m_strArrayKeyWords.SetAt(x, strtmp);
  131. }
  132. }
  133. /*///////////////////////////////////////////////////////////////////////////////////////////////
  134. ParseLine(m_strArrayKeyWords, dwCookie, strLine, ColorInfo, nActualItems) );
  135. 功能:根据所给定的语言解析一行字符串,返回用颜色指示的字符串块,以及解析后的当前行的解析结果,
  136. 指示解析后当前行处于什么状态,是处于字符串中、注释中、多行注释中还是正常状态。
  137. 入口参数:
  138. m_strArrayKeyWords: 关键字列表
  139. dwCookie: 传入前一行的解析结果,如果前一行是多行注释的开始或者前一行是一软回车时有用
  140. strLine: 被解析的一行字符串
  141. ColorInfo: 解析后的颜色值,指定是关键字、字符串、注释还是正常的字符颜色
  142. nActualItems strLine被解析后的块数
  143. /////////////////////////////////////////////////////////////////////////////////////////////////*/
  144. DWORD ParseLine(CStringArray &m_strArrayKeyWords,
  145. DWORD dwCookie,
  146. CString &strLine,
  147. COLORINFO *ColorInfo,
  148. int &nActualItems)
  149. {
  150. //*
  151. if(g_nCurLanguage ==_HTML || g_nCurLanguage ==_XML) {
  152. int dwCookieTmp = ParseLineForHtml(m_strArrayKeyWords, dwCookie, strLine, ColorInfo, nActualItems);
  153. return dwCookieTmp;
  154. }
  155. //*/
  156. int nLength = strLine.GetLength();
  157. int nIdentBegin = -1;
  158. int i;
  159. BOOL bMatch;
  160. BOOL bInString; //定义一个字符串的界限
  161. BOOL bRedefineBlock = TRUE;
  162. BOOL bDecIndex = FALSE;
  163. BOOL bIsInTheControlChar = FALSE; //指示是否在\的控制中, strControl为空时无效, 初始化时必须为FALSE, 原因见结束定义字符串的处理代码
  164. if(nLength == 0)
  165. return dwCookie;
  166. for (int I = 0; ; I++)
  167. {
  168. if (bRedefineBlock) //如果开始定义颜色块向下做
  169. {
  170. int nPos = I;
  171. if (bDecIndex)
  172. nPos--;
  173. if (dwCookie & (COOKIE_COMMENT | COOKIE_EXT_COMMENT))
  174. {
  175. DEFINE_BLOCK(nPos, COLORINDEX_COMMENT);
  176. }
  177. else {
  178. if (dwCookie & COOKIE_STRING)
  179. {
  180. DEFINE_BLOCK(nPos, COLORINDEX_STRING);
  181. }
  182. else
  183. {
  184. DEFINE_BLOCK(nPos, COLORINDEX_NORMAL);
  185. }
  186. }
  187. bRedefineBlock = FALSE;
  188. bDecIndex = FALSE;
  189. }
  190. if (I >= nLength)
  191. goto Out;
  192. //遇到双字节字体如中文直接跳过
  193. if(IsDBCSLeadByte(strLine[I])) //检查是不是中文字符
  194. {
  195. I += 2;
  196. if (I >= nLength)
  197. goto Out;
  198. else
  199. goto cmpnextchar; //继续处理strLine的下一个字符
  200. }
  201. //////////////////////////////
  202. if (dwCookie & COOKIE_COMMENT)
  203. {
  204. DEFINE_BLOCK(I, COLORINDEX_COMMENT);
  205. dwCookie |= COOKIE_COMMENT;
  206. goto Out;
  207. }
  208. //如果当前正处于字符串变量中,则应检查是否有结束字符串变量的字符串
  209. if (dwCookie & COOKIE_STRING)
  210. {
  211. if(g_bControl) { //处理控制字符,至少C++会用到(例\"表示引号而不是两个字符)
  212. if(I > 0) {
  213. if(strLine[I-1] != '\\') {
  214. if(strLine[I] != '\\')
  215. bIsInTheControlChar = FALSE;
  216. else
  217. bIsInTheControlChar = TRUE;
  218. }
  219. else {
  220. if(strLine[I] == '\\') {
  221. if(!bIsInTheControlChar)
  222. bIsInTheControlChar = TRUE;
  223. else
  224. bIsInTheControlChar = FALSE;
  225. }
  226. }
  227. }
  228. }
  229. int nlen;
  230. for (int i = 0; i < g_nEndStringStrCount; i++ ) {
  231. if(g_EndStringStr[i]==NULL)
  232. continue;
  233. nlen = strlen(g_EndStringStr[i]);
  234. bMatch = TRUE;
  235. //如果strLine的当前字符串值与结束定义字符规则中的一项相同则中止定义字符串
  236. if (I >= nlen - 1)
  237. {
  238. for(int k=0; k<nlen; k++) { //向前搜索字符串检查是否与结束定义的字符串相同
  239. if(strLine[I-nlen+1+k]!=g_EndStringStr[i][k]) {
  240. bMatch = FALSE; //如果不匹配,中断比较
  241. break;
  242. }
  243. }
  244. if(bMatch && !bIsInTheControlChar) {
  245. dwCookie &= ~COOKIE_STRING;
  246. bRedefineBlock = TRUE;
  247. goto cmpnextchar; //继续处理strLine的下一个字符
  248. }
  249. }
  250. }
  251. goto cmpnextchar; //如果没有结束定义字符串继续处理strLine的下一个字符
  252. }
  253. //如果当前正处于字符变量中,则应检查是否有结束字符变量的字符串
  254. if (dwCookie & COOKIE_CHAR)
  255. {
  256. if(g_bControl) { //处理控制字符,至少C++会用到(例\"表示引号而不是两个字符)
  257. if(I > 0) {
  258. if(strLine[I-1] != '\\') {
  259. if(strLine[I] != '\\')
  260. bIsInTheControlChar = FALSE;
  261. else
  262. bIsInTheControlChar = TRUE;
  263. }
  264. else {
  265. if(strLine[I] == '\\') {
  266. if(!bIsInTheControlChar)
  267. bIsInTheControlChar = TRUE;
  268. else
  269. bIsInTheControlChar = FALSE;
  270. }
  271. }
  272. }
  273. }
  274. int nlen;
  275. for (int i = 0; i < g_nEndCharStrCount; i++ ) {
  276. if(g_EndCharStr[i]==NULL)
  277. continue;
  278. nlen = strlen(g_EndCharStr[i]);
  279. bMatch = TRUE;
  280. //如果strLine的当前字符值与结束定义字符规则中的一项相同则中止定义字符串
  281. if (I >= nlen - 1)
  282. {
  283. for(int k=0; k<nlen; k++) { //向前搜索字符串检查是否与结束定义的字符相同
  284. if(strLine[I-nlen+1+k]!=g_EndCharStr[i][k]) {
  285. bMatch = FALSE; //如果不匹配,中断比较
  286. break;
  287. }
  288. }
  289. if(bMatch && !bIsInTheControlChar) {
  290. dwCookie &= ~COOKIE_CHAR;
  291. bRedefineBlock = TRUE;
  292. goto cmpnextchar; //继续处理strLine的下一个字符
  293. }
  294. }
  295. }
  296. goto cmpnextchar; //如果没有结束定义字符继续处理strLine的下一个字符
  297. }
  298. //如果当前正处于多行注释中,则应检查是否有结束多行注释的字符串
  299. if (dwCookie & COOKIE_EXT_COMMENT) {
  300. for (int i = 0; i < g_nEndCommentExStrCount; i++ ) {
  301. if(g_EndCommentExStr[i]==NULL)
  302. continue;
  303. bMatch = TRUE;
  304. int nlen = strlen(g_EndCommentExStr[i]);
  305. if(I >= nlen - 1)
  306. {
  307. for(int k=0; k<nlen; k++) {
  308. if(strLine[I-nlen+1+k]!=g_EndCommentExStr[i][k]) {
  309. bMatch = FALSE;
  310. break;
  311. }
  312. }
  313. if(bMatch) {
  314. dwCookie &= ~COOKIE_EXT_COMMENT;
  315. bRedefineBlock = TRUE;
  316. goto cmpnextchar;
  317. }
  318. }
  319. }
  320. goto cmpnextchar;
  321. }
  322. //处理单行注释
  323. for (i = 0; i < g_nLineCommentStrCount; i++ ) {
  324. if(g_LineCommentStr[i]==NULL)
  325. continue;
  326. int nlen = strlen(g_LineCommentStr[i]);
  327. bMatch = TRUE;
  328. if(I >= nlen - 1)
  329. {
  330. for(int k=0; k<nlen; k++) {
  331. if(strLine[I-nlen+1+k]!=g_LineCommentStr[i][k]) {
  332. bMatch = FALSE;
  333. break;
  334. }
  335. }
  336. if(bMatch) {
  337. DEFINE_BLOCK(I - nlen + 1, COLORINDEX_COMMENT);
  338. dwCookie |= COOKIE_COMMENT;
  339. goto Out; //只要发现有单行注释的字符串则退出
  340. }
  341. }
  342. }
  343. //处理字符串变量的开始
  344. for (i = 0; i < g_nBeginStringStrCount; i++ ) {
  345. if(g_BeginStringStr[i]==NULL)
  346. continue;
  347. int nlen = strlen(g_BeginStringStr[i]);
  348. bMatch = TRUE;
  349. if(I >= nlen - 1)
  350. {
  351. for(int k=0; k<nlen; k++) {
  352. if(strLine[I-nlen+1+k]!=g_BeginStringStr[i][k]) {
  353. bMatch = FALSE;
  354. break;
  355. }
  356. }
  357. if(bMatch) {
  358. DEFINE_BLOCK(I - nlen + 1, COLORINDEX_STRING);
  359. dwCookie |= COOKIE_STRING;
  360. goto cmpnextchar;
  361. }
  362. }
  363. }
  364. //处理字符型变量的开始
  365. for (i = 0; i < g_nBeginCharStrCount; i++ ) {
  366. if(g_BeginCharStr[i]==NULL)
  367. continue;
  368. int nlen = strlen(g_BeginCharStr[i]);
  369. bMatch = TRUE;
  370. if(I >= nlen - 1)
  371. {
  372. for(int k=0; k<nlen; k++) {
  373. if(strLine[I-nlen+1+k]!=g_BeginCharStr[i][k]) {
  374. bMatch = FALSE;
  375. break;
  376. }
  377. }
  378. if(bMatch) {
  379. DEFINE_BLOCK(I - nlen + 1, COLORINDEX_CHAR);
  380. dwCookie |= COOKIE_CHAR;
  381. goto cmpnextchar;
  382. }
  383. }
  384. }
  385. //处理多行注释的开始
  386. for (i = 0; i < g_nBeginCommentExStrCount; i++ ) {
  387. if(g_BeginCommentExStr[i]==NULL)
  388. continue;
  389. int nlen = strlen(g_BeginCommentExStr[i]);
  390. bMatch = TRUE;
  391. if(I >= nlen - 1)
  392. {
  393. for(int k=0; k<nlen; k++) {
  394. if(strLine[I-nlen+1+k]!=g_BeginCommentExStr[i][k]) {
  395. bMatch = FALSE;
  396. break;
  397. }
  398. }
  399. if(bMatch) {
  400. DEFINE_BLOCK(I - nlen + 1, COLORINDEX_COMMENT);
  401. dwCookie |= COOKIE_EXT_COMMENT;
  402. if(nlen>1) {
  403. if ( ++I>= nLength) // 考虑"/*/"的情况
  404. goto Out;
  405. }
  406. goto cmpnextchar;
  407. }
  408. }
  409. }
  410. bInString = FALSE;
  411. for ( i = 0; i < g_nstrInStringCount; i++ ) {
  412. BOOL b = ( strLine[I] == g_strInString.GetAt(i) ) ;
  413. bInString |= b;
  414. if(bInString)
  415. break;
  416. }
  417. if (isalnum(strLine[I]) || strLine[I] == '_' || bInString)
  418. {
  419. if (nIdentBegin == -1)
  420. nIdentBegin = I;
  421. }
  422. else
  423. {
  424. if (nIdentBegin >= 0)
  425. {
  426. CString strtmp= strLine.Mid(nIdentBegin, I - nIdentBegin);
  427. if (IsSynWord(m_strArrayKeyWords, strtmp))
  428. {
  429. DEFINE_BLOCK(nIdentBegin, COLORINDEX_SYNTAX);
  430. }
  431. else if (IsNumber(strtmp))
  432. {
  433. DEFINE_BLOCK(nIdentBegin, COLORINDEX_NUMBER);
  434. }
  435. bRedefineBlock = TRUE;
  436. bDecIndex = TRUE;
  437. nIdentBegin = -1;
  438. }
  439. }
  440. cmpnextchar:
  441. i=0; //没有意义,为编译通过而准备
  442. }
  443. Out: //当遇到单行注释时会直接跳到这儿
  444. if (nIdentBegin >= 0)
  445. {
  446. CString strtmp = strLine.Mid(nIdentBegin, I - nIdentBegin);
  447. if (IsSynWord(m_strArrayKeyWords, strtmp))
  448. {
  449. DEFINE_BLOCK(nIdentBegin, COLORINDEX_SYNTAX);
  450. }
  451. else if (IsNumber(strtmp))
  452. {
  453. DEFINE_BLOCK(nIdentBegin, COLORINDEX_NUMBER);
  454. }
  455. }
  456. return dwCookie;
  457. }
  458. DWORD ParseLineForHtml(CStringArray &m_strArrayKeyWords,
  459. DWORD dwCookie,
  460. CString &strLine,
  461. COLORINFO *ColorInfo,
  462. int &nActualItems)
  463. {
  464. //对于无多行注释的语法在只取当前行的解析结果时可直接返回
  465. if(g_nBeginCommentExStrCount==0 && ColorInfo==NULL)
  466. return dwCookie;
  467. int nLength = strLine.GetLength();
  468. int nIdentBegin = -1;
  469. int i;
  470. BOOL bMatch;
  471. BOOL bInString; //定义一个字符串的界限
  472. BOOL bRedefineBlock = TRUE;
  473. BOOL bDecIndex = FALSE;
  474. if(nLength == 0)
  475. return dwCookie;
  476. for (int I = 0; ; I++)
  477. {
  478. if (bRedefineBlock) //如果开始定义颜色块向下做
  479. {
  480. int nPos = I;
  481. if (bDecIndex)
  482. nPos--;
  483. if (dwCookie & COOKIE_EXT_COMMENT)
  484. {
  485. DEFINE_BLOCK(nPos, COLORINDEX_COMMENT);
  486. }
  487. else if (dwCookie & COOKIE_STRING)
  488. {
  489. DEFINE_BLOCK(nPos, COLORINDEX_STRING);
  490. }
  491. else if (dwCookie & COOKIE_SCRIPT)
  492. {
  493. DEFINE_BLOCK(nPos, COLORINDEX_STRING);
  494. }
  495. else
  496. {
  497. DEFINE_BLOCK(nPos, COLORINDEX_NORMAL);
  498. }
  499. bRedefineBlock = FALSE;
  500. bDecIndex = FALSE;
  501. }
  502. if (I >= nLength)
  503. goto Out;
  504. //遇到双字节字体如中文直接跳过
  505. if(IsDBCSLeadByte(strLine[I])) //检查是不是中文字符
  506. {
  507. I += 2;
  508. if (I >= nLength)
  509. goto Out;
  510. else
  511. goto cmpnextchar; //继续处理strLine的下一个字符
  512. }
  513. //////////////////////////////
  514. if ( !(dwCookie & COOKIE_TAG) )
  515. {
  516. if (dwCookie & COOKIE_SCRIPT)
  517. {
  518. if ( I + 7 < nLength)
  519. {// the string "</script" length is 7;
  520. if (strLine[I] != '<')
  521. continue;
  522. if (strLine[I+1] != '/')
  523. continue;
  524. if (strLine[I+2] != 's' && strLine[I+2] != 'S')
  525. continue;
  526. if (strLine[I+3] != 'c' && strLine[I+3] != 'C')
  527. continue;
  528. if (strLine[I+4] != 'r' && strLine[I+4] != 'R')
  529. continue;
  530. if (strLine[I+5] != 'i' && strLine[I+5] != 'I')
  531. continue;
  532. if (strLine[I+6] != 'p' && strLine[I+6] != 'P')
  533. continue;
  534. if (strLine[I+7] != 't' && strLine[I+7] != 'T')
  535. continue;
  536. dwCookie &= ~COOKIE_SCRIPT;
  537. goto con;
  538. }
  539. continue;
  540. }
  541. }
  542. con:
  543. if (strLine[I] == '<')
  544. {
  545. dwCookie |= COOKIE_TAG;
  546. DEFINE_BLOCK(I, COLORINDEX_SYNTAX);
  547. //DEFINE_BLOCK(I+1, COLORINDEX_NORMAL);
  548. }
  549. if (dwCookie & COOKIE_TAG)
  550. {
  551. //如果当前正处于字符串变量中,则应检查是否有结束字符串变量的字符串
  552. if ( dwCookie & COOKIE_STRING )
  553. {
  554. int nlen;
  555. for (int i = 0; i < g_nEndStringStrCount; i++ )
  556. {
  557. if(g_EndStringStr[i]==NULL)
  558. continue;
  559. nlen = strlen(g_EndStringStr[i]);
  560. bMatch = TRUE;
  561. //如果strLine的当前字符串值与结束定义字符规则中的一项相同则中止定义字符串
  562. if (I >= nlen - 1)
  563. {
  564. for(int k=0; k<nlen; k++) { //向前搜索字符串检查是否与结束定义的字符串相同
  565. if(strLine[I-nlen+1+k]!=g_EndStringStr[i][k])
  566. {
  567. bMatch = FALSE; //如果不匹配,中断比较
  568. break;
  569. }
  570. }
  571. if(bMatch) {
  572. dwCookie &= ~COOKIE_STRING;
  573. bRedefineBlock = TRUE;
  574. goto cmpnextchar; //继续处理strLine的下一个字符
  575. }
  576. }
  577. }
  578. goto cmpnextchar; //如果没有结束定义字符串继续处理strLine的下一个字符
  579. }
  580. //如果当前正处于字符变量中,则应检查是否有结束字符变量的字符串
  581. if ( dwCookie & COOKIE_CHAR )
  582. {
  583. int nlen;
  584. for (i = 0; i < g_nEndCharStrCount; i++ )
  585. {
  586. if(g_EndCharStr[i]==NULL)
  587. continue;
  588. nlen = strlen(g_EndCharStr[i]);
  589. bMatch = TRUE;
  590. //如果strLine的当前字符值与结束定义字符规则中的一项相同则中止定义字符串
  591. if (I >= nlen - 1)
  592. {
  593. for(int k=0; k<nlen; k++) { //向前搜索字符串检查是否与结束定义的字符相同
  594. if(strLine[I-nlen+1+k]!=g_EndCharStr[i][k])
  595. {
  596. bMatch = FALSE; //如果不匹配,中断比较
  597. break;
  598. }
  599. }
  600. if(bMatch) {
  601. dwCookie &= ~COOKIE_CHAR;
  602. bRedefineBlock = TRUE;
  603. goto cmpnextchar; //继续处理strLine的下一个字符
  604. }
  605. }
  606. }
  607. goto cmpnextchar; //如果没有结束定义字符继续处理strLine的下一个字符
  608. }
  609. //如果当前正处于多行注释中,则应检查是否有结束多行注释的字符串
  610. if ( dwCookie & COOKIE_EXT_COMMENT ) {
  611. for (i = 0; i < g_nEndCommentExStrCount; i++ )
  612. {
  613. if(g_EndCommentExStr[i]==NULL)
  614. continue;
  615. bMatch = TRUE;
  616. int nlen = strlen(g_EndCommentExStr[i]);
  617. if(I >= nlen - 1)
  618. {
  619. for(int k=0; k<nlen; k++) {
  620. if(strLine[I-nlen+1+k]!=g_EndCommentExStr[i][k])
  621. {
  622. bMatch = FALSE;
  623. break;
  624. }
  625. }
  626. if(bMatch) {
  627. dwCookie &= ~COOKIE_EXT_COMMENT;
  628. bRedefineBlock = TRUE;
  629. goto cmpnextchar;
  630. }
  631. }
  632. }
  633. goto cmpnextchar;
  634. }
  635. //处理字符串变量的开始
  636. for (i = 0; i < g_nBeginStringStrCount; i++ ) {
  637. if(g_BeginStringStr[i]==NULL)
  638. continue;
  639. int nlen = strlen(g_BeginStringStr[i]);
  640. bMatch = TRUE;
  641. if(I >= nlen - 1)
  642. {
  643. for(int k=0; k<nlen; k++)
  644. {
  645. if(strLine[I-nlen+1+k]!=g_BeginStringStr[i][k])
  646. {
  647. bMatch = FALSE;
  648. break;
  649. }
  650. }
  651. if(bMatch) {
  652. DEFINE_BLOCK(I - nlen + 1, COLORINDEX_STRING);
  653. dwCookie |= COOKIE_STRING;
  654. goto cmpnextchar;
  655. }
  656. }
  657. }
  658. //处理字符型变量的开始
  659. for (i = 0; i < g_nBeginCharStrCount; i++ )
  660. {
  661. if(g_BeginCharStr[i]==NULL)
  662. continue;
  663. int nlen = strlen(g_BeginCharStr[i]);
  664. bMatch = TRUE;
  665. if(I >= nlen - 1)
  666. {
  667. for(int k=0; k<nlen; k++)
  668. {
  669. if(strLine[I-nlen+1+k]!=g_BeginCharStr[i][k])
  670. {
  671. bMatch = FALSE;
  672. break;
  673. }
  674. }
  675. if(bMatch) {
  676. DEFINE_BLOCK(I - nlen + 1, COLORINDEX_CHAR);
  677. dwCookie |= COOKIE_CHAR;
  678. goto cmpnextchar;
  679. }
  680. }
  681. }
  682. //处理多行注释的开始
  683. for (i = 0; i < g_nBeginCommentExStrCount; i++ )
  684. {
  685. if(g_BeginCommentExStr[i]==NULL)
  686. continue;
  687. int nlen = strlen(g_BeginCommentExStr[i]);
  688. bMatch = TRUE;
  689. if(I >= nlen - 1)
  690. {
  691. for(int k=0; k<nlen; k++) {
  692. if(strLine[I-nlen+1+k]!=g_BeginCommentExStr[i][k])
  693. {
  694. bMatch = FALSE;
  695. break;
  696. }
  697. }
  698. if(bMatch)
  699. {
  700. nActualItems--;
  701. DEFINE_BLOCK(I - nlen + 1, COLORINDEX_COMMENT);
  702. dwCookie |= COOKIE_EXT_COMMENT;
  703. goto cmpnextchar;
  704. }
  705. }
  706. }
  707. bInString = FALSE;
  708. for ( i = 0; i < g_nstrInStringCount; i++ )
  709. {
  710. BOOL b = ( strLine[I] == g_strInString.GetAt(i) );
  711. bInString |= b;
  712. if(bInString)
  713. break;
  714. }
  715. if (isalnum(strLine[I]) || strLine[I] == '_' || bInString)
  716. {
  717. if (nIdentBegin == -1)
  718. nIdentBegin = I;
  719. }
  720. else
  721. {
  722. if (nIdentBegin >= 0)
  723. {
  724. CString strtmp= strLine.Mid(nIdentBegin, I - nIdentBegin);
  725. if (IsNumber(strtmp))
  726. {
  727. DEFINE_BLOCK(nIdentBegin, COLORINDEX_NUMBER);
  728. }//*
  729. else
  730. {
  731. if(strtmp.CompareNoCase(_T("script"))==0)
  732. {
  733. if( nIdentBegin > 0 && strLine[nIdentBegin-1] == '<')
  734. {
  735. dwCookie |= COOKIE_SCRIPT;
  736. }
  737. else if( nIdentBegin > 1 && strLine[nIdentBegin-1] == '/' && strLine[nIdentBegin-2] == '<')
  738. {
  739. dwCookie &= ~COOKIE_SCRIPT;
  740. DEFINE_BLOCK(nIdentBegin-2, COLORINDEX_SYNTAX);
  741. }
  742. }
  743. if( (nIdentBegin > 0) && (strLine[nIdentBegin-1] == '=') )
  744. {
  745. DEFINE_BLOCK(nIdentBegin, COLORINDEX_NORMAL);
  746. }
  747. else
  748. {
  749. DEFINE_BLOCK(nIdentBegin, COLORINDEX_SYNTAX);
  750. }
  751. }
  752. bRedefineBlock = TRUE;
  753. bDecIndex = TRUE;
  754. nIdentBegin = -1;
  755. }
  756. }
  757. }
  758. if (strLine[I] == '>')
  759. {
  760. bRedefineBlock = FALSE;
  761. dwCookie &= ~COOKIE_TAG;
  762. DEFINE_BLOCK(I, COLORINDEX_SYNTAX);
  763. if(dwCookie & COOKIE_SCRIPT)
  764. {
  765. DEFINE_BLOCK(I+1, COLORINDEX_STRING);
  766. }
  767. else if( (I > 1) && (strLine[I-1]=='-') && (strLine[I-2]=='-') )
  768. {
  769. DEFINE_BLOCK(I, COLORINDEX_COMMENT);
  770. }
  771. else
  772. {
  773. DEFINE_BLOCK(I+1, COLORINDEX_NORMAL);
  774. }
  775. }
  776. cmpnextchar:
  777. i = 0;
  778. }
  779. Out: //当遇到单行注释时会直接跳到这儿
  780. if (dwCookie & COOKIE_TAG) {
  781. if (nIdentBegin >= 0)
  782. {
  783. CString strtmp = strLine.Mid(nIdentBegin, I - nIdentBegin);
  784. if (IsSynWord(m_strArrayKeyWords, strtmp))
  785. {
  786. if( (nIdentBegin > 0) && (strLine[nIdentBegin-1]=='/') ) {
  787. DEFINE_BLOCK(nIdentBegin-1, COLORINDEX_SYNTAX);
  788. }
  789. else {
  790. DEFINE_BLOCK(nIdentBegin, COLORINDEX_SYNTAX);
  791. }
  792. if(strtmp.CompareNoCase(_T("script"))==0) {
  793. if( nIdentBegin > 0 && strLine[nIdentBegin-1] == '<') {
  794. dwCookie |= COOKIE_SCRIPT;
  795. }
  796. else if( nIdentBegin > 1 && strLine[nIdentBegin-1] == '/' && strLine[nIdentBegin-12] == '<') {
  797. dwCookie &= ~COOKIE_SCRIPT;
  798. DEFINE_BLOCK(nIdentBegin-2, COLORINDEX_NORMAL);
  799. }
  800. }
  801. }
  802. else if (IsNumber(strtmp))
  803. {
  804. DEFINE_BLOCK(nIdentBegin, COLORINDEX_NUMBER);
  805. }
  806. }
  807. }
  808. return dwCookie;
  809. }
  810. void LoadParseRule(int nlanguage)
  811. {
  812. g_strInString = _T("");
  813. g_nstrInStringCount = 0;
  814. g_nBeginCommentExStrCount = 0;
  815. g_nEndCommentExStrCount = 0;
  816. g_nLineCommentStrCount = 0;
  817. g_nBeginStringStrCount = 0;
  818. g_nEndStringStrCount = 0;
  819. g_nBeginCharStrCount = 0;
  820. g_nEndCharStrCount = 0;
  821. g_bControl = FALSE;
  822. g_bCase = FALSE;
  823. /////////////////////////////////////////////////////////////////////////////
  824. if(g_BeginCommentExStr[0]!= NULL) {delete g_BeginCommentExStr[0]; g_BeginCommentExStr[0] = NULL;}
  825. if(g_BeginCommentExStr[1]!= NULL) {delete g_BeginCommentExStr[1]; g_BeginCommentExStr[1] = NULL;}
  826. /////////////////////////////////////////////////////////////////////////////
  827. if(g_EndCommentExStr[0]!= NULL) {delete g_EndCommentExStr[0]; g_EndCommentExStr[0] = NULL;}
  828. if(g_EndCommentExStr[1]!= NULL) {delete g_EndCommentExStr[1]; g_EndCommentExStr[1] = NULL;}
  829. /////////////////////////////////////////////////////////////////////////////
  830. if(g_LineCommentStr[0]!= NULL) {delete g_LineCommentStr[0]; g_LineCommentStr[0] = NULL;}
  831. if(g_LineCommentStr[1]!= NULL) {delete g_LineCommentStr[1]; g_LineCommentStr[1] = NULL;}
  832. /////////////////////////////////////////////////////////////////////////////
  833. if(g_BeginStringStr[0]!= NULL) {delete g_BeginStringStr[0]; g_BeginStringStr[0] = NULL;}
  834. /////////////////////////////////////////////////////////////////////////////
  835. if(g_EndStringStr[0]!= NULL) {delete g_EndStringStr[0]; g_EndStringStr[0] = NULL;}
  836. /////////////////////////////////////////////////////////////////////////////
  837. if(g_BeginCharStr[0]!= NULL) {delete g_BeginCharStr[0]; g_BeginCharStr[0] = NULL;}
  838. /////////////////////////////////////////////////////////////////////////////
  839. if(g_EndCharStr[0]!= NULL) {delete g_EndCharStr[0]; g_EndCharStr[0] = NULL;}
  840. CString strInString = _T("");
  841. CString BeginCommentExStr0 = _T("");
  842. CString EndCommentExStr0 = _T("");
  843. CString BeginCommentExStr1 = _T("");
  844. CString EndCommentExStr1 = _T("");
  845. CString LineCommentStr0 = _T("");
  846. CString LineCommentStr1 = _T("");
  847. CString BeginStringStr0 = _T("");
  848. CString EndStringStr0 = _T("");
  849. CString BeginCharStr0 = _T("");
  850. CString EndCharStr0 = _T("");
  851. switch ( nlanguage ) {
  852. case _BASIC:
  853. strInString = _T("&#");
  854. LineCommentStr0=_T("\'");
  855. LineCommentStr1=_T("rem");
  856. BeginStringStr0=_T("\"");
  857. EndStringStr0=_T("\"");
  858. break;
  859. default: //is NONE
  860. return;
  861. }
  862. CString strLanguagePos = _T("icrEdit__ParseRule");
  863. strLanguagePos += GetLanguageString(nlanguage);
  864. CString strtmp;
  865. CWinApp *app = AfxGetApp();
  866. g_bCase = app->GetProfileInt( strLanguagePos, _T("g_bCase"), g_bCase);
  867. //一个单词包含的字符常量
  868. strtmp = app->GetProfileString( strLanguagePos, _T("strInString"), strInString);
  869. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  870. if(!strtmp.IsEmpty()) {
  871. g_strInString = strtmp;
  872. g_nstrInStringCount = g_strInString.GetLength();
  873. }
  874. //一个单词包含的字符常量
  875. //开始多行注释的字符串
  876. strtmp = app->GetProfileString( strLanguagePos, _T("BeginCommentExStr0"), BeginCommentExStr0);
  877. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  878. if(!strtmp.IsEmpty()) {
  879. g_BeginCommentExStr[0] = new TCHAR[strtmp.GetLength()+1];
  880. strcpy(g_BeginCommentExStr[0], strtmp);
  881. g_nBeginCommentExStrCount = 1;
  882. }
  883. strtmp = app->GetProfileString( strLanguagePos, _T("BeginCommentExStr1"), BeginCommentExStr1);
  884. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  885. if(!strtmp.IsEmpty()) {
  886. g_BeginCommentExStr[1] = new TCHAR[strtmp.GetLength()+1];
  887. strcpy(g_BeginCommentExStr[1], strtmp);
  888. g_nBeginCommentExStrCount = 2;
  889. }
  890. //开始多行注释的字符串
  891. //结束多行注释的字符串
  892. strtmp = app->GetProfileString( strLanguagePos, _T("EndCommentExStr0"), EndCommentExStr0);
  893. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  894. if(!strtmp.IsEmpty()) {
  895. g_EndCommentExStr[0] = new TCHAR[strtmp.GetLength()+1];
  896. strcpy(g_EndCommentExStr[0], strtmp);
  897. g_nEndCommentExStrCount = 1;
  898. }
  899. strtmp = app->GetProfileString( strLanguagePos, _T("EndCommentExStr1"), EndCommentExStr1);
  900. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  901. if(!strtmp.IsEmpty()) {
  902. g_EndCommentExStr[1] = new TCHAR[strtmp.GetLength()+1];
  903. strcpy(g_EndCommentExStr[1], strtmp);
  904. g_nEndCommentExStrCount = 2;
  905. }
  906. //结束多行注释的字符串
  907. //开始单行注释的字符串
  908. strtmp = app->GetProfileString( strLanguagePos, _T("LineCommentStr0"), LineCommentStr0);
  909. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  910. if(!strtmp.IsEmpty()) {
  911. g_LineCommentStr[0] = new TCHAR[strtmp.GetLength()+1];
  912. strcpy(g_LineCommentStr[0], strtmp);
  913. g_nLineCommentStrCount = 1;
  914. }
  915. strtmp = app->GetProfileString( strLanguagePos, _T("LineCommentStr1"), LineCommentStr1);
  916. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  917. if(!strtmp.IsEmpty()) {
  918. g_LineCommentStr[1] = new TCHAR[strtmp.GetLength()+1];
  919. strcpy(g_LineCommentStr[1], strtmp);
  920. g_nLineCommentStrCount = 2;
  921. }
  922. //开始单行注释的字符串
  923. //开始字符串变量的字符串
  924. strtmp = app->GetProfileString( strLanguagePos, _T("BeginStringStr0"), BeginStringStr0);
  925. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  926. if(!strtmp.IsEmpty()) {
  927. g_BeginStringStr[0] = new TCHAR[strtmp.GetLength()+1];
  928. strcpy(g_BeginStringStr[0], strtmp);
  929. g_nBeginStringStrCount = 1;
  930. }
  931. //开始字符串变量的字符串
  932. //结束字符串变量的字符串
  933. strtmp = app->GetProfileString( strLanguagePos, _T("EndStringStr0"), EndStringStr0);
  934. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  935. if(!strtmp.IsEmpty()) {
  936. g_EndStringStr[0] = new TCHAR[strtmp.GetLength()+1];
  937. strcpy(g_EndStringStr[0], strtmp);
  938. g_nEndStringStrCount = 1;
  939. }
  940. //结束字符串变量的字符串
  941. //开始字符型常量的字符串
  942. strtmp = app->GetProfileString( strLanguagePos, _T("BeginCharStr0"), BeginCharStr0);
  943. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  944. if(!strtmp.IsEmpty()) {
  945. g_BeginCharStr[0] = new TCHAR[strtmp.GetLength()+1];
  946. strcpy(g_BeginCharStr[0], strtmp);
  947. g_nBeginCharStrCount = 1;
  948. }
  949. //开始字符型常量的字符串
  950. //结束字符型常量的字符串
  951. strtmp = app->GetProfileString( strLanguagePos, _T("EndCharStr0"), EndCharStr0);
  952. strtmp.TrimLeft();strtmp.TrimRight();strtmp.TrimLeft(0x9);strtmp.TrimRight(0x9);
  953. if(!strtmp.IsEmpty()) {
  954. g_EndCharStr[0] = new TCHAR[strtmp.GetLength()+1];
  955. strcpy(g_EndCharStr[0], strtmp);
  956. g_nEndCharStrCount = 1;
  957. }
  958. //结束字符型常量的字符串
  959. }
  960. CString GetLanguageString(int nlanguage)
  961. {
  962. switch ( nlanguage ) {
  963. case _BASIC:
  964. return _T("_BASIC");
  965. default: //is NONE
  966. return _T("Plain text");
  967. }
  968. }
  969. void DeleteAllocString()
  970. {
  971. //删除分配的语法解析规则字符串指针以防止内存泄漏
  972. if(g_BeginCommentExStr[0]!= NULL) {delete g_BeginCommentExStr[0]; g_BeginCommentExStr[0] = NULL;}
  973. if(g_BeginCommentExStr[1]!= NULL) {delete g_BeginCommentExStr[1]; g_BeginCommentExStr[1] = NULL;}
  974. if(g_EndCommentExStr[0]!= NULL) {delete g_EndCommentExStr[0]; g_EndCommentExStr[0] = NULL;}
  975. if(g_EndCommentExStr[1]!= NULL) {delete g_EndCommentExStr[1]; g_EndCommentExStr[1] = NULL;}
  976. if(g_LineCommentStr[0]!= NULL) {delete g_LineCommentStr[0]; g_LineCommentStr[0] = NULL;}
  977. if(g_LineCommentStr[1]!= NULL) {delete g_LineCommentStr[1]; g_LineCommentStr[1] = NULL;}
  978. if(g_BeginStringStr[0]!= NULL) {delete g_BeginStringStr[0]; g_BeginStringStr[0] = NULL;}
  979. if(g_EndStringStr[0]!= NULL) {delete g_EndStringStr[0]; g_EndStringStr[0] = NULL;}
  980. if(g_BeginCharStr[0]!= NULL) {delete g_BeginCharStr[0]; g_BeginCharStr[0] = NULL;}
  981. if(g_EndCharStr[0]!= NULL) {delete g_EndCharStr[0]; g_EndCharStr[0] = NULL;}
  982. }
  983. CString GetLineCommentString(int nlanguage)
  984. {
  985. CString LineCommentStr0 = _T("");
  986. switch ( nlanguage ) {
  987. case _BASIC:
  988. LineCommentStr0=_T("\'");
  989. break;
  990. default: //is NONE
  991. return LineCommentStr0;
  992. }
  993. CString strLanguagePos = _T("icrEdit__ParseRule");
  994. strLanguagePos += GetLanguageString(nlanguage);
  995. CWinApp *app = AfxGetApp();
  996. LineCommentStr0 = app->GetProfileString( strLanguagePos, _T("LineCommentStr0"), LineCommentStr0);
  997. LineCommentStr0.TrimLeft();
  998. LineCommentStr0.TrimRight();
  999. LineCommentStr0.TrimLeft(0x9);
  1000. LineCommentStr0.TrimRight(0x9);
  1001. if(!LineCommentStr0.IsEmpty())
  1002. return LineCommentStr0;
  1003. LineCommentStr0 = app->GetProfileString( strLanguagePos, _T("LineCommentStr1"), LineCommentStr0);
  1004. LineCommentStr0.TrimLeft();
  1005. LineCommentStr0.TrimRight();
  1006. LineCommentStr0.TrimLeft(0x9);
  1007. LineCommentStr0.TrimRight(0x9);
  1008. return LineCommentStr0;
  1009. }
  1010. //根据显示给用户看的字符串取出语言
  1011. int GetLanguageByStringShow(CString strlanguage)
  1012. {
  1013. if(strlanguage==_T("Basic"))
  1014. return _BASIC;
  1015. return 0;
  1016. }
  1017. //根据语言返回给用户看的字符串
  1018. CString GetStringShowByLanguage(int nlanguage)
  1019. {
  1020. switch(nlanguage) {
  1021. case _BASIC:
  1022. return _T("Basic");
  1023. default:
  1024. return _T("Plain text");
  1025. }
  1026. }