//申请用来存储数据的内存 int CNEOMemQueue::AddLastToThisToken(SNEOQueueTokenHead *pToken,const char *szData,int nDataLen) { int nRet=0; char szNameBuffer[256]; if(!ICanWork()) goto CNEOMemQueue_AddLastToThisToken_End; //指针不为空,说明存在数据,跳到next指针处 if(!pToken->m_pBuffer) { //如果本Token不包含有效数据,则保存到自己 SafePrintf(szNameBuffer,256,"%s::pToken->m_pBuffer",m_szAppName); //格式化说明文字 pToken->m_pBuffer=(char *)m_pMemPool->Malloc(nDataLen,szNameBuffer);//向内存池申请数据块 if(!pToken->m_pBuffer) { //申请失败 m_pDebug->DebugToFile("%s::AddLastToThisToken():Malloc new Token fail!\n",m_szAppName); goto CNEOMemQueue_AddLastToThisToken_End; } memcpy(pToken->m_pBuffer,szData,nDataLen); //拷贝业务数据到内存块 pToken->m_nDataLen=nDataLen; nRet=nDataLen; m_pLast=pToken; goto CNEOMemQueue_AddLastToThisToken_End; }//if else { //next为空,则在next下面插入 if(!pToken->m_pNext) { //如果下家的链指针为空,就利用GetAToken创建头 pToken->m_pNext=GetAToken(); if(!pToken->m_pNext) { //创建失败报警 m_pDebug->DebugToFile("%s::AddLastToThisToken():malloc pToken->m_pNext fail!!\n",m_szAppName); goto CNEOMemQueue_AddLastToThisToken_End; } } if(pToken->m_pNext)//递归调用 nRet=AddLastToThisToken(pToken->m_pNext,szData,nDataLen); } CNEOMemQueue_AddLastToThisToken_End: return nRet; }
int CNEOMemQueue::AddLast(const char *szData //数据指针 ,int nDataLen, //数据长度 int nLimit) //防止递归长度过神 { int nRet=0; if(!ICanWork()) goto CNEOMemQueue_AddLast_End; if(0>=nLimit) //应用限制值 { // 这是无限制 if(m_nMaxToken<=m_nTokenCount)//无限制时,以m_nMaxToken作为边界限制 goto CNEOMemQueue_AddLast_End; }//if else { //这是限制 if(nLimit<=m_nTokenCount) //如果有nlimit,则使用这个参数限制 goto CNEOMemQueue_AddLast_End; } if(!m_pHead) { m_pHead=GetAToken();//链头的第一次初始化 if(!m_pHead) { m_pDebug->DebugToFile("%s::AddLast():malloc m_pHead fail \n",m_szAppName); goto CNEOMemQueue_AddLast_End; } } if(m_pLast)//加速因子作用,直接跳入 { nRet=AddLastToThisToken(m_pLast,szData,nDataLen); } else if(m_pHead)//加速因子无值,传统模式,遍历插入 { nRet=AddLastToThisToken(m_pHead,szData,nDataLen); } CNEOMemQueue_AddLast_End: return nRet; }
void ContextHelp(short spritenum) { int i,fp; char t,*tc; char x=0,y=4; char *name,*hightag; char *filebuffer; SPRITEp sp; short hitag=0; long size=0,tokresult=0; sp = &sprite[spritenum]; clearmidstatbar16(); if((fp=kopen4load("swbhelp.hlp",0)) == -1) { Msg("ERROR: Help file not found.",M_RED); return; } // Read in whole file size = kfilelength(fp); filebuffer = (char *)malloc(size); if (filebuffer == NULL) { Msg("Not enough memory to load swhelp.hlp",M_RED); return; } if (kread(fp, filebuffer, size) != size) { Msg("Unexpected end of file while reading swhelp.hlp",M_RED); kclose(fp); return; } // close the file kclose(fp); // Conver filebuffer to all upper case //strupr(filebuffer); // Assign a token name to search for based on the sprite being pointed to. name = (char *)malloc(20); hightag = (char *)malloc(sizeof(short)); // Make the token strcpy(name,"@TAG"); // Make sure 500-600 SOBJ bounding tags all say the same thing. hitag = sp->hitag; if(hitag > 500 && hitag <= 600 ) hitag = 500; // Give help summary for unknown sprites. if((hitag == 0 || hitag > 1006) && sp->lotag == 0) hitag = 999; sprintf(hightag,"%d",hitag); //itoa(hitag,hightag,10); strcat(name,hightag); tc = filebuffer; if(!(tokresult = GetAToken(name,tc,size))) { // This message should never happen unless something is real wrong! Msg("No help available.",M_RED); return; } tc += tokresult; do { tc++; t = *tc; while(t!='\n' && t!='@' && t!='#' && x<128) { tempbuf[x]=t; tc++; t = *tc; x++; if(x >= 128) break; } tempbuf[x]=0; x=0; printext16(x*4,ydim16+(y*6)+2,11,-1,tempbuf,1); y++; if(y>16) { y=18; printext16(x*4,ydim16+(y*6)+2,11,-1,"Hit any key to continue or Q to quit....",1); while (BKeyPressed() == NULL); if (keystatus[KEYSC_Q]) { clearmidstatbar16(); return; } ResetKeys(); clearmidstatbar16(); y=6; } } while(t!='@' && t!='#'); }