Exemple #1
0
const char* FastFindFirstOf(const char* s, size_t len, const char* set, size_t setlen) {
    switch (setlen) {
        case 0:
            return s + len;

        case 1:
            return FindChr(s, *set, len);

        default:
            return TCompactStrSpn(set, set + setlen).FindFirstOf(s, s + len);
    }
}
Exemple #2
0
// unsigned int WINAPI DOIrisSerialPort::ReadThread( LPVOID pArg )
DWORD __stdcall DOIrisSerialPort::ReadThread( LPVOID pArg )
// DWORD __stdcall ReadThread(LPVOID hwnd)
{
    unsigned long fdwCommMask;
     
    unsigned long CharsInBuffer = 0;
    unsigned long NonPacketCharsInBuffer;
    unsigned long packetlength;
 
	char * pEndChar;

    LPSerial pCaller = reinterpret_cast<LPSerial>(pArg);
	//DO_ASSERT( pCaller != NULL );
    pCaller->m_bReadThreadIsRunning = TRUE;
    
		/*
    if ( pCaller->m_msgReceiver )
    {
        pCaller->m_msgReceiver->InitializeThread();
    }
    */
    // Enable logging from this thread via pCaller->m_pRnDLog.
    
	//HRESULT hRes = E_FAIL;
    //pCaller->m_pRnDLog->AddThread( hRes );   
    //DO_ASSERT( SUCCEEDED(hRes) );

	// Setup the input and packet buffers 
    char *cBuffer = new char[pCaller->m_iInBufferLength];
    //DO_ASSERT( cBuffer != NULL );
    char *cPacketBuffer = new char[pCaller->m_iPacketBufferLength];
    //DO_ASSERT( cPacketBuffer != NULL );

    if( !SetCommMask( pCaller->m_hPort, EV_RXCHAR | EXIT_EVENT ) )
	{
        //pCaller->m_pRnDLog->LogRnDEvent( IDS_IRISCOMMON_SETCOMMMASK_FAILED );
    }

    // Main loop of read thread.
    while( !pCaller->m_bStopReadThread )
    {
        if( !WaitCommEvent(pCaller->m_hPort, &fdwCommMask, 0))
        {
            //pCaller->m_pRnDLog->LogRnDEvent( IDS_IRISCOMMON_WAITCOMMEVENT_FAILED, 
            //                                 static_cast<int>(GetLastError()) );
            break;	//	Get out of read thread while loop 
        }
        
        // Reset the comm Mask.
        if( !SetCommMask(pCaller->m_hPort, EV_RXCHAR | EXIT_EVENT)) 
		{
            //pCaller->m_pRnDLog->LogRnDEvent( IDS_IRISCOMMON_SETCOMMMASK_FAILED,
            //                                 static_cast<int>(GetLastError()));
        }
    
        if( fdwCommMask & EV_RXCHAR )
        {
            unsigned long num;
#ifdef _WIN32_WCE
            // Read all bytes received into cBuffer.
			ReadFile(pCaller->m_hPort, &cBuffer[CharsInBuffer], pCaller->m_iInBufferLength-CharsInBuffer, &num, 0);
#else
            ReadFile(pCaller->m_hPort, &cBuffer[CharsInBuffer], pCaller->m_iInBufferLength-CharsInBuffer, &num, &(pCaller->m_overlapped));
#endif // _WIN32_WCE
            CharsInBuffer += num;
            GenRecBytes = GenRecBytes+num;	
            // Check for a packet in the buffer
            while( CharsInBuffer && (pEndChar = FindChr( cBuffer, IRIS_PACKET_END_FLAG, CharsInBuffer )) != NULL )
            {
                packetlength = static_cast<unsigned long>((pEndChar - cBuffer) + 1);  // Includes IRIS_PACKET_END_FLAG char
                
                // Make sure IRIS_PACKET_END_FLAG is in new message area of buffer
                if ( packetlength <= CharsInBuffer && packetlength <= pCaller->m_iPacketBufferLength )
                {
                    // Move packet to buffer and send
                    memcpy( cPacketBuffer, cBuffer, packetlength);	// PC-Lint warning 688 expected
		    		        pCaller->PktCallRelay( cPacketBuffer, packetlength );	
                }

                // Move remaining chars in buffer to beginning of buffer and adjust char counts
                NonPacketCharsInBuffer = CharsInBuffer - packetlength;

                if( NonPacketCharsInBuffer > 0 )
				{
					// PC-Lint warning 688 expected
                    memcpy( cBuffer, &cBuffer[CharsInBuffer-NonPacketCharsInBuffer], NonPacketCharsInBuffer);
                }
                else
                {
                    NonPacketCharsInBuffer = 0;
                }
				CharsInBuffer = NonPacketCharsInBuffer; 
            }

			// Handle the case were the buffer is full but no packet is found
            if( CharsInBuffer >= pCaller->m_iInBufferLength )
            {
                CharsInBuffer = 0;
                //pCaller->m_pRnDLog->LogRnDEvent( IDS_IRISCOMMON_BUFFER_OVERFLOW );
            }
        }
        
        // Clear buffers to prevent problem when exiting thread
        if( fdwCommMask & EXIT_EVENT )
		{
            PurgeComm(pCaller->m_hPort, PURGE_RXCLEAR | PURGE_TXCLEAR | 
                                        PURGE_RXABORT | PURGE_TXABORT );
        }
    }
    

	delete [] cBuffer;
	delete [] cPacketBuffer;

    //pCaller->m_pRnDLog->RemoveThread();
/*
    if ( pCaller->m_msgReceiver )
    {
        pCaller->m_msgReceiver->ShutdownThread();
    }
*/
    pCaller->m_bReadThreadIsRunning = FALSE;


    return 0;
}
Exemple #3
0
// unsigned int WINAPI DOIrisSerialPort::ReadThread( LPVOID pArg )
unsigned int DOIrisReadThread(IRIS_Node *pINode, char *cBuffer, unsigned long num)
{
    //unsigned long fdwCommMask;
     
    unsigned long CharsInBuffer = 0;
    unsigned long NonPacketCharsInBuffer;
    unsigned long packetlength;
    unsigned char tmpchr;
	  char * pEndChar;
		// unsigned long num;

    //LPSerial pCaller = reinterpret_cast<LPSerial>(pArg);
	  //DO_ASSERT( pCaller != NULL );
    //pCaller->m_bReadThreadIsRunning = TRUE;
    /*
    if ( pCaller->m_msgReceiver )
    {
        pCaller->m_msgReceiver->InitializeThread();
    }
    */
    // Enable logging from this thread via pCaller->m_pRnDLog.
    
	//HRESULT hRes = E_FAIL;
    //pCaller->m_pRnDLog->AddThread( hRes );   
    //DO_ASSERT( SUCCEEDED(hRes) );
 //printf ("DOIrisReadThread income. length=%d\n", num);
	// Setup the input and packet buffers 
    //char *cBuffer = new char[300];// [pCaller->m_iInBufferLength];
    //DO_ASSERT( cBuffer != NULL );
    char *cPacketBuffer = new char[300];//[pCaller->m_iPacketBufferLength];
    //DO_ASSERT( cPacketBuffer != NULL );
    /*
    if( !SetCommMask( pCaller->m_hPort, EV_RXCHAR | EXIT_EVENT ) )
		{
      pCaller->m_pRnDLog->LogRnDEvent( IDS_IRISCOMMON_SETCOMMMASK_FAILED );
    }    
    
		// Main loop of read thread.
    while( !pCaller->m_bStopReadThread )
    {
        if( !WaitCommEvent(pCaller->m_hPort, &fdwCommMask, 0))
        {
            //pCaller->m_pRnDLog->LogRnDEvent( IDS_IRISCOMMON_WAITCOMMEVENT_FAILED, 
            //                                 static_cast<int>(GetLastError()) );
            break;	//	Get out of read thread while loop 
        }
        
      // Reset the comm Mask.
       if( !SetCommMask(pCaller->m_hPort, EV_RXCHAR | EXIT_EVENT))
				{
            //pCaller->m_pRnDLog->LogRnDEvent( IDS_IRISCOMMON_SETCOMMMASK_FAILED,
            //                                 static_cast<int>(GetLastError()));
        }
    
        if( fdwCommMask & EV_RXCHAR )
        {
            unsigned long num;
#ifdef _WIN32_WCE
         // Read all bytes received into cBuffer.
			  ReadFile(pCaller->m_hPort, &cBuffer[CharsInBuffer], pCaller->m_iInBufferLength-CharsInBuffer, &num, 0);
#else
        ReadFile(pCaller->m_hPort, &cBuffer[CharsInBuffer], pCaller->m_iInBufferLength-CharsInBuffer, &num, &(pCaller->m_overlapped));
#endif // _WIN32_WCE
				*/
            CharsInBuffer += num;
            //printf ("CharsInBuffer = %d\n", CharsInBuffer);
            // Check for a packet in the buffer
            while( CharsInBuffer && (pEndChar = FindChr( cBuffer, IRIS_PACKET_END_FLAG, CharsInBuffer )) != NULL )
            {	
							packetlength = static_cast<unsigned long>((pEndChar - cBuffer) + 1);  // Includes IRIS_PACKET_END_FLAG char
              //printf ("packetlength=%d, pEndChar=%d\n", packetlength, pEndChar); 
                // Make sure IRIS_PACKET_END_FLAG is in new message area of buffer
                if ( packetlength <= CharsInBuffer) //&& packetlength <= pCaller->m_iPacketBufferLength )
                {
                  // Move packet to buffer and send
                  memcpy( cPacketBuffer, cBuffer, packetlength);	// PC-Lint warning 688 expected
								  t.TRACE("cPacketBuffer: "); 
									// t.TRACE_HEX(); 
									/*
									for (int j=0; j < packetlength; j++)
									{
										tmpchr=(unsigned char) cPacketBuffer[j];
										t.TRACE("\\0x%X", tmpchr);
									}
									t.TRACE("\n"); 
		    	        */
									// pCaller->PktCallRelay( cPacketBuffer, packetlength );
									pINode->receivePacket( cPacketBuffer, packetlength ); 

                }

                // Move remaining chars in buffer to beginning of buffer and adjust char counts
                NonPacketCharsInBuffer = CharsInBuffer - packetlength;

                if( NonPacketCharsInBuffer > 0 )
								{
									// PC-Lint warning 688 expected
                  memcpy( cBuffer, &cBuffer[CharsInBuffer-NonPacketCharsInBuffer], NonPacketCharsInBuffer);
                }
                else
                {
                  NonPacketCharsInBuffer = 0;
                }
				      CharsInBuffer = NonPacketCharsInBuffer; 
            }

			// Handle the case were the buffer is full but no packet is found
            if( CharsInBuffer >=  300)//pCaller->m_iInBufferLength )
            {
              CharsInBuffer = 0;
              //pCaller->m_pRnDLog->LogRnDEvent( IDS_IRISCOMMON_BUFFER_OVERFLOW );
            }
 //       } // if(?)
        
        // Clear buffers to prevent problem when exiting thread
				/*
        if( fdwCommMask & EXIT_EVENT )
				{
            PurgeComm(pCaller->m_hPort, PURGE_RXCLEAR | PURGE_TXCLEAR | 
                                        PURGE_RXABORT | PURGE_TXABORT );
        }
				*/
 //   }    //while

	//delete [] cBuffer;
	delete [] cPacketBuffer;

    //pCaller->m_pRnDLog->RemoveThread();
    /*
    if ( pCaller->m_msgReceiver )
    {
        pCaller->m_msgReceiver->ShutdownThread();
    }

    pCaller->m_bReadThreadIsRunning = FALSE;
    */

    return 0;
}
void CNPCTxtAnalysis::AnalySisText(CHAR* Msg)
{
	BOOL	DrawCenter = FALSE;
	CHAR*	szTemp;
	CHAR*	CmdStr;
	CHAR*	CmdParamStr;
	CHAR*	szStr;

	INT	nPosX =0;
	INT nLineCount = 0;
	COLORREF	cColor = 0;

	SIZE	tSize;

	if(m_bInited)
	{

		// Init Buffers
		CmdParamStr	=	new CHAR[MAX_BUFFER_SIZE];
		CmdStr		=	new CHAR[MAX_BUFFER_SIZE];
		szStr		=	new CHAR[MAX_BUFFER_SIZE];


		ZeroMemory(CmdParamStr,MAX_BUFFER_SIZE);
		ZeroMemory(CmdStr,MAX_BUFFER_SIZE);
		ZeroMemory(szStr,MAX_BUFFER_SIZE);


		while(true)
		{
			if(strlen(Msg)==0) break;

			szTemp =  GetValidStr(Msg,szStr,LINE_DIVIDER);				// Line Divider
			strcpy(Msg,szTemp);

			if(strlen(szStr)!=0)
			{

				while((FindChr(szStr,'<')>0)&&(FindChr(szStr,'>')>0) && (strlen(szStr)!=0))
				{
					CHAR*	Fdata;
					Fdata	=	new CHAR[MAX_BUFFER_SIZE];
					ZeroMemory(Fdata,MAX_BUFFER_SIZE);
					// <>Tag 분리 Text Button 생성
					if((szStr[0])!='<')
					{
						szTemp =  GetValidStr(szStr,Fdata,'<');
						strcpy(szStr,"<");
						strcat(szStr,szTemp);				
					}

					// <>안에 있는 내용 CmdStr로
					szTemp = ArrestString(szStr,'<','>',CmdStr);
					strcpy(szStr,szTemp);
					szTemp = NULL;
					
					if(strlen(CmdStr)!=0)
					{
						switch(UpperCase(CmdStr[0]))
						{
							case '0':		// <0> 일경우 글자색 BLACK
							{
								cColor = RGB(0,0,0);
								continue;
							}
							break;
							case '1':		// <1> 일경우 글자색 RED
							{
								cColor = RGB(255,0,0);
								continue;
							}
							break;
							case '2':		// <2> 일경우 글자색 GREEN
							{
								cColor = RGB(0,128,0);
								continue;
							}
							break;
							case '3':		// <3> 일경우 글자색 Olive
							{
								cColor = RGB(128,128,0);
								continue;
							}
							break;
							case '4':		// <4> 일경우 글자색 GRAY
							{
								cColor = RGB(128,128,128);
								continue;
							}
							break;
							case '5':		// <5> 일경우 글자색 Maroon
							{
								cColor = RGB(128,0,0);
								continue;
							}
							break;
							case '6':		// <6> 일경우 글자색 Teal
							{
								cColor = RGB(0,128,128);
								continue;
							}
							break;
							case '7':		// <7> 일경우 글자색 Navy
							{
								cColor = RGB(0,0,128);
								continue;
							}
							break;
							case '8':		// <8> 일경우 글자색 Silver
							{
								cColor = RGB(192,192,192);
								continue;
							}
							break;
							case '9':		// <9> 일경우 글자색 Purple
							{
								cColor = RGB(128,0,128);
								continue;
							}
							break;
							case 'A':		// <A> 일경우 글자색 Lime
							{
								cColor = RGB(0,255,0);
								continue;
							}
							break;
							case 'B':		// <B> 일경우 글자색 Blue
							{
								cColor = RGB(0,0,255);
								continue;
							}
							break;
							case 'C':		// <C> 일경우 글자색 White
							{
								cColor = RGB(255,255,255);
								continue;
							}
							break;
							case 'D':		// <D> 일경우 글자색 Fuchsia
							{
								cColor = RGB(255,0,255);
								continue;
							}
							break;
							case 'E':		// <E> 일경우 글자색 Aqua
							{
								cColor = RGB(0,255,255);
								continue;
							}
							break;
							case 'F':		// <F> 일경우 글자색 Yellow
							{
								cColor = RGB(255,255,0);
								continue;
							}
							break;
							case 'X':		// <Z> 일경우 글자색 Default
							{

								cColor = RGB(1,1,1);
								continue;
							}
							break;
						}

/*						szTemp = new CHAR[2];
						strncpy(szTemp,CmdStr,2);
						szTemp = UpperCase(szTemp);
						if(strncmp(szTemp,"/C",2)==0)		// </C> 일 경우 가운데 찍기 끝
						{
							DrawCenter = FALSE;
							delete[] szTemp;
							szTemp = NULL;
							continue;
						}
						delete[] szTemp;
*/						szTemp = NULL;
						szTemp = GetValidStr(CmdStr,CmdStr,'/');
						strcpy(CmdParamStr,szTemp);
						szTemp = NULL;

					}
					else
					{
						// 종결 <> 가 있으면 종료
					}

					if(strlen(Fdata)!=0)		// '<' 전에 있는 Text를 일반 Text에 추가
					{	// 일반 Text 추가
						CMText* pxTmpTxt;
						pxTmpTxt = new CMText;
						pxTmpTxt->pText = new CHAR[strlen(Fdata)+1];
						// Text 설정
						pxTmpTxt->bDrawCenter = DrawCenter;
						pxTmpTxt->fColor =	cColor!=RGB(1,1,1) ? cColor : DEFAULT_TXT_COLOR;		// 색은 Tag에 의해 결정해 주어야함.
						pxTmpTxt->nLine = nLineCount;
						pxTmpTxt->nPosx = nPosX;
						strcpy(pxTmpTxt->pText,Fdata);

						m_pxpTxt->AddNode(pxTmpTxt);
						tSize = m_pxGWND->GetStrLength(NULL,NULL,"%s",Fdata);
						nPosX=nPosX+tSize.cx;
					}

					if(strlen(CmdStr)!=0)
					{
						RECT tRect;
						tRect.top =0;
						tRect.left = nPosX;

						tSize = m_pxGWND->GetStrLength(NULL,NULL,"%s",CmdStr);
						tRect.right = tSize.cx;					
						tRect.bottom = tSize.cy;

						// Text 버튼 생성
						m_pxBtn->AddButton(CmdStr,tRect,nLineCount,CmdParamStr,(cColor!=RGB(1,1,1) ? cColor : DEFAULT_BTN_COLOR),DEFAULT_BTN_CLICK_COLOR);

						nPosX=nPosX+tSize.cx;

					}	// Text Button
				}
				// '>'뒷부분 혹은 '<','>' 없는 기냥 Text일 경우
				if(strlen(szStr)!=0)
				{
					do
					{
						// Line 을 나누고 그 결과를 Text List 에 넣는다.
						CHAR  *szTemp1=NULL,*szTemp2=NULL;
						szTemp1 = new CHAR[MAX_BUFFER_SIZE];
						ZeroMemory(szTemp1,MAX_BUFFER_SIZE);

						// Line Divider
						szTemp2 =  GetValidStr(szStr,szTemp1,LINE_DIVIDER);	
						strcpy(szStr,szTemp2);
						
						// Text 생성
						CMText* pxTmpTxt;
						pxTmpTxt = new CMText;
						pxTmpTxt->pText = new CHAR[strlen(szTemp1)+1];

						// Text 설정
						pxTmpTxt->bDrawCenter = DrawCenter;
						pxTmpTxt->fColor =	cColor!=RGB(1,1,1) ? cColor : DEFAULT_TXT_COLOR;			// 임시 Tag에 의하여 색변환
						pxTmpTxt->nLine = nLineCount;
						pxTmpTxt->nPosx = nPosX;
						strcpy(pxTmpTxt->pText,szTemp1);
						m_pxpTxt->AddNode(pxTmpTxt);

						tSize = m_pxGWND->GetStrLength(NULL,NULL,"%s",szTemp1);
						nPosX=nPosX+tSize.cx;

						delete[] szTemp1;

						nPosX = 20;		// 시작은 20 pixel 부터
						nLineCount ++;	// Line Feed
					}while(strlen(szStr)!=0);
					// Draw Normal Text
				}
			}
			// Line Feed
			nLineCount ++;
			nPosX = 20;		//시작은 20 pixel 부터
		}
		delete CmdParamStr;
		delete CmdStr;
		delete szStr;
		m_bReady = TRUE;
	}
	else
	{
		m_bReady = FALSE;
	}
}
CHAR* CNPCTxtAnalysis::ArrestString(CHAR* szSource,CHAR SearchAfter,CHAR AssertBefore,CHAR* AssertStr)
{
	int Src_Len;
	bool Right_Data,Fin;

	ZeroMemory(AssertStr,strlen(AssertStr));
	ZeroMemory(m_InnerResult,MAX_BUFFER_SIZE);

	if(strlen(szSource)==0)
	{
		ZeroMemory(AssertStr,sizeof(AssertStr));
		return m_InnerResult;
	}
	int n;
	Src_Len = strlen(szSource);
	Right_Data = false;
	if(Src_Len >=2)
	{
		if(szSource[0] == SearchAfter)
		{
			strncpy(szSource,szSource+1,Src_Len-1);
			szSource[Src_Len-1]=NULL;
			Src_Len = strlen(szSource);
			Right_Data = true;
		}
		else
		{
			n= FindChr(szSource,SearchAfter);
			if(n>=0)
			{
				strncpy(szSource,szSource+n,Src_Len - (n));
				Src_Len = strlen(szSource);
				Right_Data = true;
			}
		}

		Fin = false;

		if(Right_Data)
		{
			n = FindChr(szSource,AssertBefore);
			if(n>=0)
			{
				strncpy(AssertStr,szSource,n);
				strncpy(m_InnerResult,szSource+n,Src_Len - n);
			}
			else
			{
				strncat(m_InnerResult,&SearchAfter,1);
				strcat(m_InnerResult,szSource);
			}
		}
		else
		{
			for(int i = 0; i< Src_Len;i++)
			{
				if(szSource[i] == SearchAfter)
				{

					strncpy(m_InnerResult,szSource+i,Src_Len-i+2);
					break;
				}
			}
		}
	}
	return m_InnerResult;
}