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); } }
// 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; }
// 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; }