Повышение эффективности синтаксического анализатора языка Си
#include <stdlib.h> #include <stdio.h> #include <string.h> #define CliMaxSize 1024 #define PacketMaxSize 999 #define MaxNumberofPackets 5 #if 1 static char InData[CliMaxSize] = "\r\nRCV\r\nSOME:DATA40\r\n24Ab2bfsdfa46jKjj936100dsasgdfsdf1240s0x\r\nOK\r\n\r\nRCV\r\nSOME:DATA50\r\n24Ab246324400123543gfdsas4sdaasd22231fn67sdff46ngk\r\nOK\r\n\r\nRCV\r\nSOME:DATA0\r\n\r\nOK\r\n"; #endif #if 0 static char InData[CliMaxSize] = "\r\nRCV\r\nSOME:DATA40\r\n24Ab2bfsdfa46jKjj936100dsasgdfsdf1240s0x\r\nOK\r\n\r\nRCV\r\nSOME:DATA60\r\n24Ab246324400123543gfdsas4sdaasd"; #endif static char PacketBytes[PacketMaxSize]; typedef struct { unsigned char ValidPackets; unsigned char DataSizeStartAddress[MaxNumberofPackets]; unsigned char ValidPacketsStartAddress[MaxNumberofPackets]; unsigned int DataSize[MaxNumberofPackets]; }_CLI; static unsigned char AvailableValidPackets(_CLI *const PtrCLI) { char *pch; PtrCLI->ValidPackets = 0; pch = strstr(InData,"OK\r\n"); while (pch != NULL) { PtrCLI->ValidPackets++; pch = strstr(++pch,"OK\r\n"); } return PtrCLI->ValidPackets; } static void GetStartAddressOfPackets(_CLI *const PtrCLI) { char *pch = &InData[0]; unsigned char LocalCounter = 0; /* find the location of ":" in Source */ while (*pch++ != '\0') { if (*pch == ':') { PtrCLI->ValidPacketsStartAddress[LocalCounter] = pch - &InData[0] + 9; PtrCLI->DataSizeStartAddress[LocalCounter] = pch - &InData[0] + 5; LocalCounter++; } } } static void ExtractDataSizeInIntegerForm(_CLI *const PtrCLI) { char LocArray[MaxNumberofPackets] = { 0,0,0,0,0}; char LocCounter = 0, LocalDummy = 0, localMultiplier = 1; for (char LocLoop = 0; LocLoop < PtrCLI->ValidPackets; LocLoop++) { char *LocPtr = (char*)&InData[PtrCLI->DataSizeStartAddress[LocLoop]]; while (*LocPtr != '\r') { LocArray[LocCounter++] = *(LocPtr++) - '0'; localMultiplier *= 10; } for (char c = 0; c < LocCounter; c++){ localMultiplier = localMultiplier / 10; LocalDummy += LocArray[c] * localMultiplier; LocArray[c] = 0; } PtrCLI->DataSize[LocLoop] = LocalDummy; LocCounter = 0; LocalDummy = 0; } } static void CopyString(const int StartAddress, const int size) { char *ptr = &InData[0] + StartAddress; memset(PacketBytes, '\0', sizeof(PacketBytes)); for(char i = 0; i < size; i++) { PacketBytes[i] = *ptr++; } } static void ExtractPackets (_CLI *const PtrCLI){ for(char i = 0; i< PtrCLI->ValidPackets; i++) { if (PtrCLI->DataSize[i] != 0) { CopyString(PtrCLI->ValidPacketsStartAddress[i], PtrCLI->DataSize[i]); printf("Packet %d> size: %d data: ",i+1, PtrCLI->DataSize[i]); for (char j = 0; j< PtrCLI->DataSize[i]; j++) { printf("%c", PacketBytes[j]); } printf("\n"); } else { printf("Packet %d> size: %d data: \n",i+1, PtrCLI->DataSize[i]); } } } int main() { _CLI CommandLineInterface; AvailableValidPackets(&CommandLineInterface); GetStartAddressOfPackets(&CommandLineInterface); ExtractDataSizeInIntegerForm(&CommandLineInterface); ExtractPackets(&CommandLineInterface); return 0; }
Что я уже пробовал:
Я делаю этот парсер и вывод идет по мере необходимости:
Пакет 1> размер: 40 данные: 24Ab2bfsdfa46jKjj936100dsasgdfsdf1240s0x Пакет 2> размер: 50 данные: 24Ab246324400123543gfdsas4sdaasd22231fn67sdff46ngk пакет 3> размер: 0 данные:
но мой начальник просит меня сделать его более эффективным. может ли кто-нибудь из вас дать несколько советов, чтобы сделать его лучше и короче?
любое предложение будет оценено по достоинству.