Exemplo n.º 1
0
//申请用来存储数据的内存
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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!='#');
}