#include #include #include #include #include #include #include #include "mt_mt.h" #define LINEMAX 256 #define PQOSDSETTINGVER_LEN 16 int parsePQ(Item_t *pItem) { FILE *fp = NULL; FILE *binfp = NULL; //int retval; //long filelen = 0; char buf[LINEMAX]; unsigned char *pOutBuf; //int datasize= 0; int line = 0; int retval = 0; int value; int databyte; char PQOSDSetting_ver[PQOSDSETTINGVER_LEN]; #if WRITEITEMTOFILE char binFileName[256]; #endif pOutBuf = (unsigned char *)malloc(MAXBINSIZE); if (pOutBuf == NULL) { fprintf(stderr, "Unable alloc pOutBuf buffer\n"); return -1; } pItem->pData = pOutBuf; pItem->size = 0; if (pItem->filepath != NULL && pOutBuf!= NULL) { printf("%s open file %s\n", __FUNCTION__, pItem->filepath); fp = fopen(pItem->filepath, "rb"); #if WRITEITEMTOFILE strcpy(binFileName, pItem->name); binfp = fopen(strcat(binFileName,".bin"), "wb"); if (fp != NULL && binfp != NULL) #else if (fp != NULL) #endif { char *pch; //int reti; //regmatch_t match[2]; /* Compile regular expression */ //reti = regcomp(®ex, "^ItemFile[ \t]*=[ \t]*\"[a-zA-Z0-9._/\\]*\"[ \t]*", 0); //reti = regcomp(®ex, "^[ \t]*#[.]*", 0); //if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); } /* Free compiled regular expression if you want to use the regex_t again */ if (fgets (buf , LINEMAX , fp) == NULL) { fprintf(stderr, "%s %d fgets error!\n", __FUNCTION__, __LINE__); #if WRITEITEMTOFILE fclose(binfp); #endif fclose(fp); free(pOutBuf); return -1; } line++; if (fgets (buf , LINEMAX , fp) == NULL) { fprintf(stderr, "%s %d fgets error!\n", __FUNCTION__, __LINE__); #if WRITEITEMTOFILE fclose(binfp); #endif fclose(fp); free(pOutBuf); return -1; } pch = strtok (buf," \t\r\n"); pch = strtok (NULL, " \t\r\n"); if (strlen(pch) <=PQOSDSETTINGVER_LEN) { fprintf(stderr, "strlen(pch) = %d\n", strlen(pch)); memset(PQOSDSetting_ver,0,PQOSDSETTINGVER_LEN); memcpy(PQOSDSetting_ver, pch, strlen(pch)); //fwrite(PQOSDSetting_ver, sizeof(char)*PQOSDSETTINGVER_LEN, 1, binfp); writeOutputBuf(PQOSDSetting_ver, sizeof(char)*PQOSDSETTINGVER_LEN, &pOutBuf, binfp); pItem->size += sizeof(char)*PQOSDSETTINGVER_LEN; } else { //fprintf(stderr, "PQOSDSetting_ver len > %d, strip it\n",PQOSDSETTINGVER_LEN); //fprintf(stderr, "strlen(pch) = %d\n", strlen(pch)); memset(PQOSDSetting_ver,0,PQOSDSETTINGVER_LEN); memcpy(PQOSDSetting_ver, pch, PQOSDSETTINGVER_LEN); //fwrite(PQOSDSetting_ver, sizeof(char)*PQOSDSETTINGVER_LEN, 1, binfp); writeOutputBuf(PQOSDSetting_ver, sizeof(char)*PQOSDSETTINGVER_LEN, &pOutBuf, binfp); pItem->size += sizeof(char)*PQOSDSETTINGVER_LEN; } line++; if (fgets (buf , LINEMAX , fp) == NULL) { #if WRITEITEMTOFILE fclose(binfp); #endif fclose(fp); free(pOutBuf); return -1; } line++; while( fgets (buf , LINEMAX , fp) != NULL ) { short data_word; char data_byte; line++; //reti = regexec(®ex, buf, 1, match, 0); //if( !reti ){ // puts("Match"); // printf("==>%s", buf); //} //else if( reti == REG_NOMATCH ){ // puts("No match"); // printf("==>%s", buf); //} //else{ // //regerror(reti, ®ex, msgbuf, sizeof(msgbuf)); // fprintf(stderr, "Regex match failed:\n"); //} pch = strtok (buf,"@"); pch = strtok (NULL, " @\t\r\n"); value = atoi(pch); //printf ("%s\n",pch); pch = strtok (NULL, " @\t\r\n"); //printf ("%s\n",pch); databyte = atoi(pch); switch (databyte) { case 1: data_byte = (char) value; //fwrite(&data_byte, sizeof(char), 1, binfp); writeOutputBuf(&data_byte, sizeof(char), &pOutBuf, binfp); pItem->size += sizeof(char); break; case 2: data_word = (short) value; //fwrite(&data_word, sizeof(short), 1, binfp); writeOutputBuf(&data_word, sizeof(short), &pOutBuf, binfp); pItem->size += sizeof(short); break; case 3: data_byte = (char) (value & 0xff); data_word = (short) (value>>8); //fwrite(&data_byte, sizeof(char), 1, binfp); //fwrite(&data_word, sizeof(short), 1, binfp); writeOutputBuf(&data_byte, sizeof(char), &pOutBuf, binfp); writeOutputBuf(&data_word, sizeof(short), &pOutBuf, binfp); pItem->size += sizeof(char)+ sizeof(short); break; case 4: //fwrite(&value, sizeof(int), 1, binfp); writeOutputBuf(&value, sizeof(int), &pOutBuf, binfp); pItem->size += sizeof(int); break; } } //regfree(®ex); } else { perror("Can't open file"); } } //for 4 bytes aligment pItem->dummyByteNums = 0; if ((pItem->size % 4) != 0) { pItem->dummyByteNums = 4 - (pItem->size % 4); } if (fp != NULL) { fclose(fp); } if (binfp != NULL) { fflush(binfp); fclose(binfp); } return retval; }