mt_pq.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <regex.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include "mt_mt.h"
  9. #define LINEMAX 256
  10. #define PQOSDSETTINGVER_LEN 16
  11. int parsePQ(Item_t *pItem)
  12. {
  13. FILE *fp = NULL;
  14. FILE *binfp = NULL;
  15. //int retval;
  16. //long filelen = 0;
  17. char buf[LINEMAX];
  18. unsigned char *pOutBuf;
  19. //int datasize= 0;
  20. int line = 0;
  21. int retval = 0;
  22. int value;
  23. int databyte;
  24. char PQOSDSetting_ver[PQOSDSETTINGVER_LEN];
  25. #if WRITEITEMTOFILE
  26. char binFileName[256];
  27. #endif
  28. pOutBuf = (unsigned char *)malloc(MAXBINSIZE);
  29. if (pOutBuf == NULL)
  30. {
  31. fprintf(stderr, "Unable alloc pOutBuf buffer\n");
  32. return -1;
  33. }
  34. pItem->pData = pOutBuf;
  35. pItem->size = 0;
  36. if (pItem->filepath != NULL && pOutBuf!= NULL)
  37. {
  38. printf("%s open file %s\n", __FUNCTION__, pItem->filepath);
  39. fp = fopen(pItem->filepath, "rb");
  40. #if WRITEITEMTOFILE
  41. strcpy(binFileName, pItem->name);
  42. binfp = fopen(strcat(binFileName,".bin"), "wb");
  43. if (fp != NULL && binfp != NULL)
  44. #else
  45. if (fp != NULL)
  46. #endif
  47. {
  48. char *pch;
  49. //int reti;
  50. //regmatch_t match[2];
  51. /* Compile regular expression */
  52. //reti = regcomp(&regex, "^ItemFile[ \t]*=[ \t]*\"[a-zA-Z0-9._/\\]*\"[ \t]*", 0);
  53. //reti = regcomp(&regex, "^[ \t]*#[.]*", 0);
  54. //if( reti ){ fprintf(stderr, "Could not compile regex\n"); exit(1); }
  55. /* Free compiled regular expression if you want to use the regex_t again */
  56. if (fgets (buf , LINEMAX , fp) == NULL)
  57. {
  58. fprintf(stderr, "%s %d fgets error!\n", __FUNCTION__, __LINE__);
  59. #if WRITEITEMTOFILE
  60. fclose(binfp);
  61. #endif
  62. fclose(fp);
  63. free(pOutBuf);
  64. return -1;
  65. }
  66. line++;
  67. if (fgets (buf , LINEMAX , fp) == NULL)
  68. {
  69. fprintf(stderr, "%s %d fgets error!\n", __FUNCTION__, __LINE__);
  70. #if WRITEITEMTOFILE
  71. fclose(binfp);
  72. #endif
  73. fclose(fp);
  74. free(pOutBuf);
  75. return -1;
  76. }
  77. pch = strtok (buf," \t\r\n");
  78. pch = strtok (NULL, " \t\r\n");
  79. if (strlen(pch) <=PQOSDSETTINGVER_LEN)
  80. {
  81. fprintf(stderr, "strlen(pch) = %d\n", strlen(pch));
  82. memset(PQOSDSetting_ver,0,PQOSDSETTINGVER_LEN);
  83. memcpy(PQOSDSetting_ver, pch, strlen(pch));
  84. //fwrite(PQOSDSetting_ver, sizeof(char)*PQOSDSETTINGVER_LEN, 1, binfp);
  85. writeOutputBuf(PQOSDSetting_ver, sizeof(char)*PQOSDSETTINGVER_LEN, &pOutBuf, binfp);
  86. pItem->size += sizeof(char)*PQOSDSETTINGVER_LEN;
  87. }
  88. else
  89. {
  90. //fprintf(stderr, "PQOSDSetting_ver len > %d, strip it\n",PQOSDSETTINGVER_LEN);
  91. //fprintf(stderr, "strlen(pch) = %d\n", strlen(pch));
  92. memset(PQOSDSetting_ver,0,PQOSDSETTINGVER_LEN);
  93. memcpy(PQOSDSetting_ver, pch, PQOSDSETTINGVER_LEN);
  94. //fwrite(PQOSDSetting_ver, sizeof(char)*PQOSDSETTINGVER_LEN, 1, binfp);
  95. writeOutputBuf(PQOSDSetting_ver, sizeof(char)*PQOSDSETTINGVER_LEN, &pOutBuf, binfp);
  96. pItem->size += sizeof(char)*PQOSDSETTINGVER_LEN;
  97. }
  98. line++;
  99. if (fgets (buf , LINEMAX , fp) == NULL)
  100. {
  101. #if WRITEITEMTOFILE
  102. fclose(binfp);
  103. #endif
  104. fclose(fp);
  105. free(pOutBuf);
  106. return -1;
  107. }
  108. line++;
  109. while( fgets (buf , LINEMAX , fp) != NULL )
  110. {
  111. short data_word;
  112. char data_byte;
  113. line++;
  114. //reti = regexec(&regex, buf, 1, match, 0);
  115. //if( !reti ){
  116. // puts("Match");
  117. // printf("==>%s", buf);
  118. //}
  119. //else if( reti == REG_NOMATCH ){
  120. // puts("No match");
  121. // printf("==>%s", buf);
  122. //}
  123. //else{
  124. // //regerror(reti, &regex, msgbuf, sizeof(msgbuf));
  125. // fprintf(stderr, "Regex match failed:\n");
  126. //}
  127. pch = strtok (buf,"@");
  128. pch = strtok (NULL, " @\t\r\n");
  129. value = atoi(pch);
  130. //printf ("%s\n",pch);
  131. pch = strtok (NULL, " @\t\r\n");
  132. //printf ("%s\n",pch);
  133. databyte = atoi(pch);
  134. switch (databyte)
  135. {
  136. case 1:
  137. data_byte = (char) value;
  138. //fwrite(&data_byte, sizeof(char), 1, binfp);
  139. writeOutputBuf(&data_byte, sizeof(char), &pOutBuf, binfp);
  140. pItem->size += sizeof(char);
  141. break;
  142. case 2:
  143. data_word = (short) value;
  144. //fwrite(&data_word, sizeof(short), 1, binfp);
  145. writeOutputBuf(&data_word, sizeof(short), &pOutBuf, binfp);
  146. pItem->size += sizeof(short);
  147. break;
  148. case 3:
  149. data_byte = (char) (value & 0xff);
  150. data_word = (short) (value>>8);
  151. //fwrite(&data_byte, sizeof(char), 1, binfp);
  152. //fwrite(&data_word, sizeof(short), 1, binfp);
  153. writeOutputBuf(&data_byte, sizeof(char), &pOutBuf, binfp);
  154. writeOutputBuf(&data_word, sizeof(short), &pOutBuf, binfp);
  155. pItem->size += sizeof(char)+ sizeof(short);
  156. break;
  157. case 4:
  158. //fwrite(&value, sizeof(int), 1, binfp);
  159. writeOutputBuf(&value, sizeof(int), &pOutBuf, binfp);
  160. pItem->size += sizeof(int);
  161. break;
  162. }
  163. }
  164. //regfree(&regex);
  165. }
  166. else
  167. {
  168. perror("Can't open file");
  169. }
  170. }
  171. //for 4 bytes aligment
  172. pItem->dummyByteNums = 0;
  173. if ((pItem->size % 4) != 0)
  174. {
  175. pItem->dummyByteNums = 4 - (pItem->size % 4);
  176. }
  177. if (fp != NULL)
  178. {
  179. fclose(fp);
  180. }
  181. if (binfp != NULL)
  182. {
  183. fflush(binfp);
  184. fclose(binfp);
  185. }
  186. return retval;
  187. }