PageRenderTime 72ms CodeModel.GetById 32ms RepoModel.GetById 0ms app.codeStats 0ms

/trunk/Sources/Kernel/Engine/KLubCmpl_Blocker.cpp

http://mmo-resourse.googlecode.com/
C++ | 518 lines | 387 code | 98 blank | 33 comment | 79 complexity | cbccf0271cc4c6d3daff5ae377bc66e4 MD5 | raw file
Possible License(s): Zlib, LGPL-2.1, LGPL-2.0
  1. #include "KWin32.h"
  2. #include "string.h"
  3. #include "KLubCmpl_Blocker.h"
  4. #ifndef __linux
  5. #include "conio.h"
  6. #endif
  7. #define d 0
  8. void KLubCmpl_Blocker::ScanIf(KLineNode * pFirstNode)
  9. {
  10. KLineNode * pNode = pFirstNode;
  11. KLineNode * pFirstIfNode = NULL;
  12. while(pNode)
  13. {
  14. char * pLine;
  15. pLine = (char *)pNode->m_pLineMem->GetMemPtr();
  16. int i = 0;
  17. while(pLine[i] != '\0')
  18. {
  19. if (pLine[i] == ' '|| pLine[i] == '\t')
  20. {
  21. i++;
  22. continue;
  23. }
  24. char * pIf;
  25. char * pElseIf;
  26. char * pElse;
  27. char * pEnd;
  28. if ((pIf = strstr(pLine, "if") )== pLine + i)
  29. {
  30. //?if????
  31. if (*(pIf + 2) == '(' || *(pIf + 2) == ' ' || *(pIf+2) == '\t')
  32. {
  33. char * pIfEnd;
  34. //??????????if ??
  35. if (pIfEnd = strstr(pLine, "end"))
  36. {
  37. //??????????
  38. if (*(pIfEnd - 1) == ')' || *(pIfEnd - 1) == ' '||*(pIfEnd - 1) == '\t')
  39. break;
  40. }
  41. else
  42. {
  43. KStackNode * pStackNode = new KStackNode;
  44. pStackNode->m_pLine = pNode;
  45. pStackNode->nKey = KEYIF;
  46. PushKey(pStackNode);
  47. break;
  48. }
  49. }
  50. else
  51. break;
  52. }
  53. else if((pElseIf = strstr(pLine,"elseif")) == pLine + i)
  54. {
  55. //?elseif????
  56. if (*(pElseIf + 6) == '(' || *(pElseIf + 6) == ' ' || *(pElseIf + 6) == '\t')
  57. {
  58. KStackNode * pStackNode = new KStackNode;
  59. pStackNode->m_pLine = pNode;
  60. pStackNode->nKey = KEYELSEIF;
  61. PushKey(pStackNode);
  62. break;
  63. }
  64. else
  65. break;
  66. }
  67. else if ((pElse = strstr(pLine, "else") )== pLine + i )
  68. {
  69. //?elseif????
  70. if (*(pElse + 4) == '(' || *(pElse + 4) == ' ' || *(pElse + 4) == '\n'|| *(pElse + 4) == '\t')
  71. {
  72. KStackNode * pStackNode = new KStackNode;
  73. pStackNode->m_pLine = pNode;
  74. pStackNode->nKey = KEYELSE;
  75. PushKey(pStackNode);
  76. break;
  77. }
  78. else
  79. break;
  80. }
  81. else if ((pEnd = strstr(pLine, "end")) == pLine + i)
  82. {
  83. if (*(pEnd + 3) == ';' || *(pEnd + 3) == ' ' || *(pEnd + 3) == 10 || *(pEnd + 3) == '\t')
  84. {
  85. KStackNode * pStackNode = NULL;
  86. KStackNode * pEndStack = new KStackNode;
  87. pEndStack->m_pLine = pNode;
  88. pEndStack->nKey = KEYEND;
  89. PushKey(pEndStack);
  90. do
  91. {
  92. pStackNode = PopKey();
  93. UnitsList.AddHead((KNode *)pStackNode);
  94. }
  95. while(pStackNode->nKey != KEYIF);
  96. }
  97. //????if????????
  98. if (m_StackList.GetNodeCount() == 0)
  99. {
  100. KLineNode * pReturnNode = ((KStackNode*)UnitsList.GetHead())->m_pLine;
  101. this->ExchangeCurLines();
  102. if (pReturnNode)
  103. ScanIf(pReturnNode);
  104. return;
  105. }
  106. else
  107. {
  108. int num = UnitsList.GetNodeCount();
  109. for(int i = 0 ; i < num;i ++)
  110. UnitsList.RemoveHead();
  111. }
  112. }
  113. else
  114. {
  115. break;
  116. }
  117. break;
  118. }
  119. pNode = (KLineNode *)pNode->GetNext();
  120. }
  121. }
  122. BOOL KLubCmpl_Blocker::ExchangeCurLines()
  123. {
  124. static int nLabelNum = 0;
  125. static int nReturnLabelNum = 0;
  126. int nCount = 0;
  127. char szNewLine[100];
  128. nCount = UnitsList.GetNodeCount() ;
  129. if (nCount== 0)
  130. return FALSE;
  131. int i = 1;
  132. char szNewLabel[30];
  133. char szNewReturnLabel[30];
  134. // if (s1) then
  135. // .....
  136. // ....
  137. // end;
  138. KStackNode * pIfEndNode = (KStackNode *)UnitsList.GetTail();
  139. int nEndLabelNum = nCount + nLabelNum ;
  140. //???????if end;
  141. if (nCount == 2)
  142. {
  143. KStackNode * pNode = (KStackNode*)UnitsList.RemoveHead();
  144. KStackNode * pEndNode = (KStackNode*)UnitsList.RemoveHead();
  145. KLineNode * pNewLine = new KLineNode;
  146. KLineNode * pNewReturnLine = new KLineNode;
  147. pNewLine->m_pLineMem = new KMemClass1;
  148. pNewReturnLine->m_pLineMem = new KMemClass1;
  149. sprintf(szNewReturnLabel, "\nLabel(\"ReturnLabel%d\");\n", ++ nReturnLabelNum );
  150. sprintf(szNewLabel, "\nLabel(\"AutoLabel%d\");\n", ++ nLabelNum );
  151. char * Buf = (char *)pNewLine->m_pLineMem->Alloc(strlen(szNewLabel)+d);
  152. strcpy(Buf,szNewLabel);
  153. Buf = (char *)pNewReturnLine->m_pLineMem->Alloc(strlen(szNewReturnLabel)+d);
  154. strcpy(Buf,szNewReturnLabel);
  155. pEndNode->m_pLine->InsertAfter((KNode*) pNewReturnLine);
  156. m_Lines.AddTail((KNode*)pNewLine);
  157. sprintf(szNewLine, "%s Goto(\"AutoLabel%d\") end;\n", (char *)pNode->m_pLine->m_pLineMem->GetMemPtr(), nLabelNum );
  158. szNewLine[pNode->m_pLine->m_pLineMem->GetMemLen() - 1] = ' ' ;
  159. KMemClass1 * pMem = new KMemClass1;
  160. pMem->Alloc(strlen(szNewLine) +d);
  161. strcpy((char *)pMem->GetMemPtr(), szNewLine);
  162. // delete pNode->m_pLine->m_pLineMem;
  163. pNode->m_pLine->m_pLineMem = pMem;
  164. KStackNode * pNextNode = pEndNode;
  165. pNewLine->m_pNext = pNode->m_pLine->GetNext();
  166. pNode->m_pLine->GetNext()->m_pPrev = pNewLine;
  167. //Set Tail to NextNode prev
  168. pNextNode->m_pLine->GetPrev()->m_pNext = &m_Lines.m_ListTail;
  169. m_Lines.m_ListTail.m_pPrev = pNextNode->m_pLine->m_pPrev;
  170. pNode->m_pLine->m_pNext = pNextNode->m_pLine;
  171. pNextNode->m_pLine->m_pPrev = pNode->m_pLine;
  172. KLineNode * pGotoReturnNode = new KLineNode;
  173. char szGotoReturn[100];
  174. sprintf(szGotoReturn, "Goto(\"ReturnLabel%d\");\n", nReturnLabelNum );
  175. pGotoReturnNode->m_pLineMem = new KMemClass1;
  176. char * Buff = (char * )pGotoReturnNode->m_pLineMem->Alloc(strlen(szGotoReturn)+d);
  177. strcpy(Buff, szGotoReturn);
  178. m_Lines.AddTail(pGotoReturnNode);
  179. pEndNode->m_pLine->Remove();
  180. return TRUE;
  181. }
  182. nReturnLabelNum ++ ;
  183. while(1)
  184. {
  185. if (i != nCount - 2)
  186. {
  187. KStackNode * pNode = (KStackNode*)UnitsList.GetHead();
  188. KLineNode * pNewLine = new KLineNode;
  189. pNewLine->m_pLineMem = new KMemClass1;
  190. sprintf(szNewLabel, "\nLabel(\"AutoLabel%d\");\n", nLabelNum );
  191. char * Buf = (char *)pNewLine->m_pLineMem->Alloc(strlen(szNewLabel)+d);
  192. strcpy(Buf,szNewLabel);
  193. m_Lines.AddTail((KNode*)pNewLine);
  194. sprintf(szNewLine, "%s Goto(\"AutoLabel%d\") end;\n", (char *)pNode->m_pLine->m_pLineMem->GetMemPtr(), nLabelNum );
  195. szNewLine[pNode->m_pLine->m_pLineMem->GetMemLen() - 1] = ' ' ;
  196. g_StrRep(szNewLine,"elseif", "if");
  197. KMemClass1 * pMem = new KMemClass1;
  198. pMem->Alloc(strlen(szNewLine)+1);
  199. strcpy((char *)pMem->GetMemPtr(), szNewLine);
  200. // pNode->m_pLine->m_pLineMem->Free();
  201. pNode->m_pLine->m_pLineMem = pMem;
  202. KStackNode * pNextNode = (KStackNode* )pNode->GetNext();
  203. pNewLine->m_pNext = pNode->m_pLine->GetNext();
  204. pNode->m_pLine->GetNext()->m_pPrev = pNewLine;
  205. //Set Tail to NextNode prev
  206. pNextNode->m_pLine->GetPrev()->m_pNext = &m_Lines.m_ListTail;
  207. m_Lines.m_ListTail.m_pPrev = pNextNode->m_pLine->m_pPrev;
  208. pNode->m_pLine->m_pNext = pNextNode->m_pLine;
  209. pNextNode->m_pLine->m_pPrev = pNode->m_pLine;
  210. KLineNode * pGotoReturnNode = new KLineNode;
  211. char szGotoReturn[100];
  212. sprintf(szGotoReturn, "Goto(\"ReturnLabel%d\");\n", nReturnLabelNum );
  213. pGotoReturnNode->m_pLineMem = new KMemClass1;
  214. char * Buff = (char * )pGotoReturnNode->m_pLineMem->Alloc(strlen(szGotoReturn)+d);
  215. strcpy(Buff, szGotoReturn);
  216. m_Lines.AddTail(pGotoReturnNode);
  217. // return TRUE;
  218. UnitsList.RemoveHead();
  219. i++;
  220. nLabelNum ++;
  221. // Print();
  222. // getch();
  223. continue;
  224. }
  225. else
  226. {
  227. KStackNode * pElseIfNode = (KStackNode*)UnitsList.GetHead();
  228. KStackNode * pElseNode = (KStackNode*)UnitsList.GetHead()->GetNext();
  229. KStackNode * pEndNode = (KStackNode*)UnitsList.GetHead()->GetNext()->GetNext();
  230. if ((pElseIfNode->nKey != KEYELSEIF && pElseIfNode->nKey != KEYIF) ||pElseNode->nKey != KEYELSE || pEndNode->nKey != KEYEND)
  231. return FALSE;
  232. KLineNode * pNewLine = new KLineNode;
  233. KLineNode * pNewElseLine = new KLineNode;
  234. KLineNode * pNewReturnLine = new KLineNode;
  235. pNewLine->m_pLineMem = new KMemClass1;
  236. pNewReturnLine->m_pLineMem = new KMemClass1;
  237. pNewElseLine->m_pLineMem = new KMemClass1;
  238. char szNewElseLine[50];
  239. sprintf(szNewReturnLabel, "\nLabel(\"ReturnLabel%d\");\n", nReturnLabelNum );
  240. sprintf(szNewLabel, "\nLabel(\"AutoLabel%d\");\n", nLabelNum );
  241. sprintf(szNewElseLine, "\nLabel(\"AutoLabel%d\");\n", ++nLabelNum);
  242. char * Buf = (char *)pNewLine->m_pLineMem->Alloc(strlen(szNewLabel)+d);
  243. strcpy(Buf,szNewLabel);
  244. Buf = (char *)pNewReturnLine->m_pLineMem->Alloc(strlen(szNewReturnLabel)+d);
  245. strcpy(Buf,szNewReturnLabel);
  246. Buf = (char *)pNewElseLine->m_pLineMem->Alloc(strlen(szNewElseLine)+d);
  247. strcpy(Buf,szNewElseLine);
  248. pEndNode->m_pLine->InsertAfter((KNode*) pNewReturnLine);
  249. m_Lines.AddTail((KNode*)pNewLine);
  250. m_Lines.AddTail((KNode*)pNewElseLine);
  251. sprintf(szNewLine, "%s Goto(\"AutoLabel%d\") else Goto(\"AutoLabel%d\") end;\n", (char *)pElseIfNode->m_pLine->m_pLineMem->GetMemPtr(), nLabelNum - 1, nLabelNum );
  252. szNewLine[pElseIfNode->m_pLine->m_pLineMem->GetMemLen() - 1] = ' ' ;
  253. g_StrRep(szNewLine,"elseif", "if");
  254. KMemClass1 * pMem = new KMemClass1;
  255. pMem->Alloc(strlen(szNewLine)+d);
  256. strcpy((char *)pMem->GetMemPtr(), szNewLine);
  257. // delete pElseIfNode->m_pLine->m_pLineMem;
  258. pElseIfNode->m_pLine->m_pLineMem = pMem;
  259. //printf("1\n");
  260. //Print();
  261. //getch();
  262. pNewLine->m_pNext = pElseIfNode->m_pLine->GetNext();
  263. pElseIfNode->m_pLine->GetNext()->m_pPrev = pNewLine;
  264. pElseNode->m_pLine->GetPrev()->m_pNext = pNewElseLine;
  265. pNewElseLine->m_pPrev = pElseNode->m_pLine->GetPrev();
  266. pNewElseLine->m_pNext = pElseNode->m_pLine->GetNext();
  267. pElseNode->m_pLine->GetNext()->m_pPrev = pNewElseLine;
  268. pEndNode->m_pLine->GetPrev()->m_pNext = &m_Lines.m_ListTail;
  269. m_Lines.m_ListTail.m_pPrev = pEndNode->m_pLine->GetPrev();
  270. pElseIfNode->m_pLine->m_pNext = pEndNode->m_pLine->GetNext();
  271. pEndNode->m_pLine->GetNext()->m_pPrev = pElseIfNode->m_pLine;
  272. //printf("3\n");
  273. //Print();
  274. //getch();
  275. KLineNode * pGotoReturnNode1 = new KLineNode;
  276. KLineNode * pGotoReturnNode2 = new KLineNode;
  277. char szGotoReturn[100];
  278. sprintf(szGotoReturn, "Goto(\"ReturnLabel%d\");\n", nReturnLabelNum );
  279. pGotoReturnNode1->m_pLineMem = new KMemClass1;
  280. pGotoReturnNode2->m_pLineMem = new KMemClass1;
  281. char * Buff = (char * )pGotoReturnNode1->m_pLineMem->Alloc(strlen(szGotoReturn)+d);
  282. strcpy(Buff, szGotoReturn);
  283. Buff = (char * )pGotoReturnNode2->m_pLineMem->Alloc(strlen(szGotoReturn)+d);
  284. strcpy(Buff, szGotoReturn);
  285. pNewElseLine->InsertBefore((KNode*) pGotoReturnNode1);
  286. m_Lines.AddTail(pGotoReturnNode2);
  287. //pEndNode->m_pLine->Remove();
  288. //pElseNode->m_pLine->Remove();
  289. //pEndNode->m_pLine->Remove();
  290. // Print();
  291. // getch();
  292. UnitsList.RemoveHead();
  293. UnitsList.RemoveHead();
  294. UnitsList.RemoveHead();
  295. return TRUE;
  296. }
  297. }
  298. }
  299. KLineNode * KLubCmpl_Blocker::Load(LPSTR FileName)
  300. {
  301. KPakFile File;
  302. DWORD dwSize;
  303. PVOID Buffer;
  304. KLineNode * pFirstLine = NULL;
  305. int nState = 0;
  306. // check file name
  307. if (FileName[0] == 0) return NULL;
  308. if (!File.Open(FileName))
  309. {
  310. g_DebugLog("Can't open tab file : %s", FileName);
  311. return NULL;
  312. }
  313. dwSize = File.Size();
  314. KMemClass1 Memory;
  315. Buffer = Memory.Alloc(dwSize);
  316. File.Read(Buffer, dwSize);
  317. DWORD nCurPos = 0;
  318. while(nCurPos < dwSize)
  319. {
  320. long i = 0;
  321. char szLine[100];
  322. while(nCurPos <= dwSize)
  323. {
  324. if (((char*)Buffer)[nCurPos] == '\n')
  325. break;
  326. szLine[i++] = ((char*)Buffer)[nCurPos ++];
  327. }
  328. szLine[i - 1] = '\n';
  329. szLine[i] = '\0';
  330. nCurPos = nCurPos + 1;
  331. KLineNode * pLineNode = new KLineNode;
  332. KMemClass1 * pMem = new KMemClass1;
  333. pMem->Alloc(i);
  334. pLineNode->m_pLineMem = pMem;
  335. strcpy((char *)pLineNode->m_pLineMem->GetMemPtr(), szLine);
  336. if (strstr(szLine,"function main()")) pFirstLine = pLineNode;
  337. if (strstr(szLine,"end;--main" )) nState = 1;
  338. if (nState == 0)
  339. m_Lines.AddTail(pLineNode);
  340. else
  341. m_RestLines.AddTail(pLineNode);
  342. }
  343. return pFirstLine;
  344. }
  345. void KLubCmpl_Blocker::PushKey(KStackNode * pStackNode)
  346. {
  347. g_DebugLog("Push (%d) %s", pStackNode->nKey, pStackNode->m_pLine->m_pLineMem->GetMemPtr());
  348. m_StackList.AddHead((KNode*)pStackNode);
  349. }
  350. KStackNode* KLubCmpl_Blocker::PopKey()
  351. {
  352. g_DebugLog("Pop (%d) %s", ((KStackNode*)(m_StackList.GetHead()))->nKey, ((KStackNode*)(m_StackList.GetHead()))->m_pLine->m_pLineMem->GetMemPtr());
  353. return (KStackNode*) m_StackList.RemoveHead();
  354. }
  355. int KLubCmpl_Blocker::GetBuffer(KMemClass1 * &pMem)
  356. {
  357. LPSTR DataBuf;
  358. DWORD dwLen = 0;
  359. KLineNode * pNode = (KLineNode *)m_Lines.GetHead();
  360. while(pNode)
  361. {
  362. dwLen += pNode->m_pLineMem->GetMemLen();
  363. pNode = (KLineNode*)pNode->GetNext();
  364. }
  365. pNode = (KLineNode *)m_RestLines.GetHead();
  366. while(pNode)
  367. {
  368. dwLen += pNode->m_pLineMem->GetMemLen();
  369. pNode = (KLineNode*)pNode->GetNext();
  370. }
  371. if (dwLen == 0 ) return 0;
  372. KMemClass1 *pFileMem = new KMemClass1;
  373. DataBuf = (LPSTR)pFileMem->Alloc(dwLen*2);
  374. pNode = (KLineNode*)m_Lines.GetHead();
  375. int nANum = 0;
  376. while(pNode)
  377. {
  378. strcpy(DataBuf, (LPSTR)pNode->m_pLineMem->GetMemPtr() );
  379. DataBuf += strlen(DataBuf) ;
  380. pNode = (KLineNode*)pNode->GetNext();
  381. }
  382. pNode = (KLineNode *)m_RestLines.GetHead();
  383. while(pNode)
  384. {
  385. strcpy(DataBuf, (LPSTR)pNode->m_pLineMem->GetMemPtr() );
  386. DataBuf += strlen(DataBuf) ;
  387. pNode = (KLineNode*)pNode->GetNext();
  388. }
  389. nANum = DataBuf - (char*)pFileMem->GetMemPtr() + strlen(DataBuf);
  390. pMem = pFileMem;
  391. return nANum;
  392. }
  393. BOOL KLubCmpl_Blocker::Write(LPSTR szFileName)
  394. {
  395. KFile File;
  396. if (szFileName[0] == 0)
  397. return FALSE;
  398. KMemClass1 * pMem = NULL;
  399. int len = GetBuffer(pMem);
  400. if (len == 0 ) return FALSE;
  401. // create ini file
  402. if (!File.Create(szFileName))
  403. return FALSE;
  404. // write ini file
  405. File.Write(pMem->GetMemPtr(), len);
  406. File.Close();
  407. delete pMem;
  408. return TRUE;
  409. }
  410. void KLubCmpl_Blocker::Print()
  411. {
  412. KLineNode* pNode = (KLineNode*)m_Lines.GetHead();
  413. printf("\n---------------BEGIN--------------\n");
  414. while(pNode)
  415. {
  416. printf("%s",(LPSTR)pNode->m_pLineMem->GetMemPtr());
  417. pNode = (KLineNode*)pNode->GetNext();
  418. }
  419. printf("\n---------------END--------------\n");
  420. }