KLubCmpl_Blocker.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:14k
源码类别:

模拟服务器

开发平台:

C/C++

  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] != '')
  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.   char * pIfEnd;
  33.   //是否为单一连续一行的if 语句
  34.   if (pIfEnd = strstr(pLine, "end"))
  35.   {
  36. //是的话,结束该行扫描
  37.   if (*(pIfEnd - 1) == ')' ||  *(pIfEnd - 1) == ' '||*(pIfEnd - 1) == 't') 
  38. break;
  39.   }
  40.   else
  41.   {
  42. KStackNode * pStackNode = new KStackNode;
  43. pStackNode->m_pLine = pNode;
  44. pStackNode->nKey = KEYIF;
  45. PushKey(pStackNode);
  46. break;
  47.   }
  48. }
  49. else
  50. break;
  51. }
  52. else if((pElseIf = strstr(pLine,"elseif")) == pLine + i)
  53. {
  54. //为elseif语句的头
  55. if (*(pElseIf + 6) == '(' || *(pElseIf + 6) == ' ' || *(pElseIf + 6) == 't')
  56.   
  57. KStackNode * pStackNode = new KStackNode;
  58. pStackNode->m_pLine = pNode;
  59. pStackNode->nKey = KEYELSEIF;
  60. PushKey(pStackNode);
  61. break;
  62. }
  63. else
  64. break;
  65. }
  66. else if ((pElse = strstr(pLine, "else") )== pLine + i )
  67. {
  68. //为elseif语句的头
  69. if (*(pElse + 4) == '(' || *(pElse + 4) == ' ' || *(pElse + 4) == 'n'|| *(pElse + 4) == 't')
  70.   
  71. KStackNode * pStackNode = new KStackNode;
  72. pStackNode->m_pLine = pNode;
  73. pStackNode->nKey = KEYELSE;
  74. PushKey(pStackNode);
  75. break;
  76. }
  77. else
  78. break;
  79. }
  80. else if ((pEnd = strstr(pLine, "end")) == pLine + i)
  81. {
  82. if (*(pEnd + 3) == ';' || *(pEnd + 3) == ' ' || *(pEnd + 3) == 10 || *(pEnd + 3) == 't')
  83. KStackNode * pStackNode = NULL;
  84. KStackNode * pEndStack = new KStackNode;
  85. pEndStack->m_pLine = pNode;
  86. pEndStack->nKey = KEYEND;
  87. PushKey(pEndStack);
  88. do
  89.   {
  90. pStackNode = PopKey();
  91. UnitsList.AddHead((KNode *)pStackNode);
  92.   }
  93. while(pStackNode->nKey != KEYIF);
  94. }
  95. //该为最先if语句,首先转换!
  96. if (m_StackList.GetNodeCount() == 0)
  97. {
  98. KLineNode * pReturnNode = ((KStackNode*)UnitsList.GetHead())->m_pLine;
  99. this->ExchangeCurLines();
  100. if (pReturnNode)
  101.   ScanIf(pReturnNode);
  102. return;
  103. }
  104. else
  105. {
  106. int num = UnitsList.GetNodeCount();
  107. for(int i = 0 ; i < num;i ++)
  108. UnitsList.RemoveHead();
  109. }
  110. }
  111. else
  112. {
  113. break;
  114. }
  115. break;
  116. }
  117. pNode = (KLineNode *)pNode->GetNext();
  118. }
  119. }
  120. BOOL KLubCmpl_Blocker::ExchangeCurLines()
  121. {
  122. static int nLabelNum = 0;
  123. static int nReturnLabelNum = 0;
  124. int nCount = 0;
  125. char szNewLine[100];
  126. nCount = UnitsList.GetNodeCount() ;
  127. if (nCount== 0)
  128. return FALSE;
  129. int i = 1;
  130. char szNewLabel[30];
  131. char szNewReturnLabel[30];
  132. // if (s1) then 
  133. // .....
  134. // ....
  135. // end;
  136. KStackNode * pIfEndNode = (KStackNode *)UnitsList.GetTail();
  137. int nEndLabelNum = nCount + nLabelNum ;
  138. //当前的组合应为if end;
  139. if (nCount == 2)
  140. {
  141. KStackNode * pNode = (KStackNode*)UnitsList.RemoveHead();
  142. KStackNode * pEndNode = (KStackNode*)UnitsList.RemoveHead();
  143. KLineNode * pNewLine = new KLineNode;
  144. KLineNode * pNewReturnLine = new KLineNode;
  145. pNewLine->m_pLineMem = new KMemClass1;
  146. pNewReturnLine->m_pLineMem = new KMemClass1;
  147. sprintf(szNewReturnLabel, "nLabel("ReturnLabel%d");n", ++ nReturnLabelNum  );
  148. sprintf(szNewLabel, "nLabel("AutoLabel%d");n", ++ nLabelNum );
  149. char * Buf = (char *)pNewLine->m_pLineMem->Alloc(strlen(szNewLabel)+d);
  150. strcpy(Buf,szNewLabel);
  151. Buf = (char *)pNewReturnLine->m_pLineMem->Alloc(strlen(szNewReturnLabel)+d);
  152. strcpy(Buf,szNewReturnLabel);
  153. pEndNode->m_pLine->InsertAfter((KNode*) pNewReturnLine);
  154. m_Lines.AddTail((KNode*)pNewLine);
  155. sprintf(szNewLine, "%s Goto("AutoLabel%d") end;n", (char *)pNode->m_pLine->m_pLineMem->GetMemPtr(), nLabelNum );
  156. szNewLine[pNode->m_pLine->m_pLineMem->GetMemLen() - 1] = ' ' ;
  157. KMemClass1 * pMem = new KMemClass1;
  158. pMem->Alloc(strlen(szNewLine) +d);
  159. strcpy((char *)pMem->GetMemPtr(), szNewLine);
  160. // delete pNode->m_pLine->m_pLineMem;
  161. pNode->m_pLine->m_pLineMem = pMem;
  162. KStackNode * pNextNode = pEndNode;
  163. pNewLine->m_pNext = pNode->m_pLine->GetNext();
  164. pNode->m_pLine->GetNext()->m_pPrev = pNewLine;
  165. //Set Tail to NextNode prev
  166. pNextNode->m_pLine->GetPrev()->m_pNext = &m_Lines.m_ListTail;
  167. m_Lines.m_ListTail.m_pPrev = pNextNode->m_pLine->m_pPrev;
  168. pNode->m_pLine->m_pNext = pNextNode->m_pLine;
  169. pNextNode->m_pLine->m_pPrev = pNode->m_pLine;
  170. KLineNode * pGotoReturnNode = new KLineNode;
  171. char szGotoReturn[100];
  172. sprintf(szGotoReturn, "Goto("ReturnLabel%d");n", nReturnLabelNum  );
  173. pGotoReturnNode->m_pLineMem =  new KMemClass1;
  174. char * Buff = (char * )pGotoReturnNode->m_pLineMem->Alloc(strlen(szGotoReturn)+d);
  175. strcpy(Buff, szGotoReturn);
  176. m_Lines.AddTail(pGotoReturnNode);
  177. pEndNode->m_pLine->Remove();
  178. return TRUE;
  179. }
  180. nReturnLabelNum ++ ;
  181. while(1)
  182. if (i != nCount - 2)
  183. {
  184. KStackNode * pNode = (KStackNode*)UnitsList.GetHead();
  185. KLineNode * pNewLine = new KLineNode;
  186. pNewLine->m_pLineMem = new KMemClass1;
  187. sprintf(szNewLabel, "nLabel("AutoLabel%d");n", nLabelNum );
  188. char * Buf = (char *)pNewLine->m_pLineMem->Alloc(strlen(szNewLabel)+d);
  189. strcpy(Buf,szNewLabel);
  190. m_Lines.AddTail((KNode*)pNewLine);
  191. sprintf(szNewLine, "%s Goto("AutoLabel%d") end;n", (char *)pNode->m_pLine->m_pLineMem->GetMemPtr(), nLabelNum );
  192. szNewLine[pNode->m_pLine->m_pLineMem->GetMemLen() - 1] = ' ' ;
  193. g_StrRep(szNewLine,"elseif", "if");
  194. KMemClass1 * pMem = new KMemClass1;
  195. pMem->Alloc(strlen(szNewLine)+1);
  196. strcpy((char *)pMem->GetMemPtr(), szNewLine);
  197. // pNode->m_pLine->m_pLineMem->Free();
  198. pNode->m_pLine->m_pLineMem = pMem;
  199. KStackNode * pNextNode = (KStackNode* )pNode->GetNext();
  200. pNewLine->m_pNext = pNode->m_pLine->GetNext();
  201. pNode->m_pLine->GetNext()->m_pPrev = pNewLine;
  202. //Set Tail to NextNode prev
  203. pNextNode->m_pLine->GetPrev()->m_pNext = &m_Lines.m_ListTail;
  204. m_Lines.m_ListTail.m_pPrev = pNextNode->m_pLine->m_pPrev;
  205. pNode->m_pLine->m_pNext = pNextNode->m_pLine;
  206. pNextNode->m_pLine->m_pPrev = pNode->m_pLine;
  207. KLineNode * pGotoReturnNode = new KLineNode;
  208. char szGotoReturn[100];
  209. sprintf(szGotoReturn, "Goto("ReturnLabel%d");n", nReturnLabelNum );
  210. pGotoReturnNode->m_pLineMem = new KMemClass1;
  211. char * Buff = (char * )pGotoReturnNode->m_pLineMem->Alloc(strlen(szGotoReturn)+d);
  212. strcpy(Buff, szGotoReturn);
  213. m_Lines.AddTail(pGotoReturnNode);
  214. // return TRUE;
  215. UnitsList.RemoveHead();
  216. i++;
  217. nLabelNum ++;
  218. // Print();
  219. // getch();
  220. continue;
  221. }
  222. else
  223. {
  224. KStackNode * pElseIfNode = (KStackNode*)UnitsList.GetHead();
  225. KStackNode * pElseNode = (KStackNode*)UnitsList.GetHead()->GetNext();
  226. KStackNode * pEndNode = (KStackNode*)UnitsList.GetHead()->GetNext()->GetNext();
  227.   if ((pElseIfNode->nKey != KEYELSEIF && pElseIfNode->nKey != KEYIF) ||pElseNode->nKey != KEYELSE || pEndNode->nKey != KEYEND)
  228. return FALSE;
  229. KLineNode * pNewLine = new KLineNode;
  230. KLineNode * pNewElseLine = new KLineNode;
  231. KLineNode * pNewReturnLine = new KLineNode;
  232. pNewLine->m_pLineMem = new KMemClass1;
  233. pNewReturnLine->m_pLineMem = new KMemClass1;
  234. pNewElseLine->m_pLineMem = new KMemClass1;
  235. char szNewElseLine[50];
  236. sprintf(szNewReturnLabel, "nLabel("ReturnLabel%d");n", nReturnLabelNum  );
  237. sprintf(szNewLabel, "nLabel("AutoLabel%d");n", nLabelNum );
  238. sprintf(szNewElseLine, "nLabel("AutoLabel%d");n", ++nLabelNum);
  239. char * Buf = (char *)pNewLine->m_pLineMem->Alloc(strlen(szNewLabel)+d);
  240. strcpy(Buf,szNewLabel);
  241. Buf = (char *)pNewReturnLine->m_pLineMem->Alloc(strlen(szNewReturnLabel)+d);
  242. strcpy(Buf,szNewReturnLabel);
  243. Buf = (char *)pNewElseLine->m_pLineMem->Alloc(strlen(szNewElseLine)+d);
  244. strcpy(Buf,szNewElseLine);
  245. pEndNode->m_pLine->InsertAfter((KNode*) pNewReturnLine);
  246. m_Lines.AddTail((KNode*)pNewLine);
  247. m_Lines.AddTail((KNode*)pNewElseLine);
  248. sprintf(szNewLine, "%s Goto("AutoLabel%d") else Goto("AutoLabel%d") end;n", (char *)pElseIfNode->m_pLine->m_pLineMem->GetMemPtr(), nLabelNum - 1, nLabelNum );
  249. szNewLine[pElseIfNode->m_pLine->m_pLineMem->GetMemLen() - 1] = ' ' ;
  250. g_StrRep(szNewLine,"elseif", "if");
  251. KMemClass1 * pMem = new KMemClass1;
  252. pMem->Alloc(strlen(szNewLine)+d);
  253. strcpy((char *)pMem->GetMemPtr(), szNewLine);
  254. // delete pElseIfNode->m_pLine->m_pLineMem;
  255. pElseIfNode->m_pLine->m_pLineMem = pMem;
  256. //printf("1n");
  257. //Print();
  258. //getch();
  259. pNewLine->m_pNext = pElseIfNode->m_pLine->GetNext();
  260. pElseIfNode->m_pLine->GetNext()->m_pPrev = pNewLine;
  261. pElseNode->m_pLine->GetPrev()->m_pNext = pNewElseLine;
  262. pNewElseLine->m_pPrev = pElseNode->m_pLine->GetPrev();
  263. pNewElseLine->m_pNext = pElseNode->m_pLine->GetNext();
  264. pElseNode->m_pLine->GetNext()->m_pPrev = pNewElseLine;
  265. pEndNode->m_pLine->GetPrev()->m_pNext = &m_Lines.m_ListTail;
  266. m_Lines.m_ListTail.m_pPrev = pEndNode->m_pLine->GetPrev();
  267. pElseIfNode->m_pLine->m_pNext = pEndNode->m_pLine->GetNext();
  268. pEndNode->m_pLine->GetNext()->m_pPrev  = pElseIfNode->m_pLine;
  269. //printf("3n");
  270. //Print();
  271. //getch();
  272. KLineNode * pGotoReturnNode1 = new KLineNode;
  273. KLineNode * pGotoReturnNode2 = new KLineNode;
  274. char szGotoReturn[100];
  275. sprintf(szGotoReturn, "Goto("ReturnLabel%d");n",  nReturnLabelNum  );
  276. pGotoReturnNode1->m_pLineMem = new KMemClass1;
  277. pGotoReturnNode2->m_pLineMem = new KMemClass1;
  278. char * Buff = (char * )pGotoReturnNode1->m_pLineMem->Alloc(strlen(szGotoReturn)+d);
  279. strcpy(Buff, szGotoReturn);
  280. Buff = (char * )pGotoReturnNode2->m_pLineMem->Alloc(strlen(szGotoReturn)+d);
  281. strcpy(Buff, szGotoReturn);
  282. pNewElseLine->InsertBefore((KNode*) pGotoReturnNode1);
  283. m_Lines.AddTail(pGotoReturnNode2);
  284. //pEndNode->m_pLine->Remove();
  285. //pElseNode->m_pLine->Remove();
  286. //pEndNode->m_pLine->Remove();
  287. // Print();
  288. // getch();
  289. UnitsList.RemoveHead();
  290. UnitsList.RemoveHead();
  291. UnitsList.RemoveHead();
  292. return TRUE;
  293. }
  294. }
  295. }
  296. KLineNode * KLubCmpl_Blocker::Load(LPSTR FileName)
  297. {
  298. KPakFile File;
  299. DWORD dwSize;
  300. PVOID Buffer;
  301. KLineNode * pFirstLine = NULL;
  302. int nState = 0;
  303. // check file name
  304. if (FileName[0] == 0) return NULL;
  305. if (!File.Open(FileName))
  306. {
  307. g_DebugLog("Can't open tab file : %s", FileName);
  308. return NULL;
  309. }
  310. dwSize = File.Size();
  311. KMemClass1 Memory;
  312. Buffer = Memory.Alloc(dwSize);
  313. File.Read(Buffer, dwSize);
  314. DWORD nCurPos = 0;
  315. while(nCurPos < dwSize)
  316. {
  317. long i = 0;
  318.  char szLine[100];
  319.    while(nCurPos <= dwSize)
  320.    {
  321. if (((char*)Buffer)[nCurPos] == 'n')
  322. break;
  323.   szLine[i++] = ((char*)Buffer)[nCurPos ++];
  324.    }
  325.  szLine[i - 1] = 'n';
  326.  szLine[i] = '';
  327.  nCurPos = nCurPos + 1;
  328.  
  329.  KLineNode * pLineNode = new KLineNode; 
  330.  KMemClass1 * pMem = new KMemClass1;
  331.  pMem->Alloc(i);
  332.  pLineNode->m_pLineMem = pMem;
  333.  strcpy((char *)pLineNode->m_pLineMem->GetMemPtr(), szLine);
  334.  if (strstr(szLine,"function main()"))  pFirstLine = pLineNode;
  335.  
  336.  if (strstr(szLine,"end;--main" ))  nState = 1;
  337.  
  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. }