Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.84 KB | None | 0 0
  1. #include "stdlib.h"
  2. #include "stdio.h"
  3. #include "string.h"
  4.  
  5. unsigned int reverseBytes (unsigned int n)
  6. {
  7. return ((n >> 24) & 0x000000ff) |
  8. ((n >> 8) & 0x0000ff00) |
  9. ((n << 8) & 0x00ff0000) |
  10. ((n << 24) & 0xff000000);
  11. }
  12.  
  13. typedef union tagTAGHEADER
  14. {
  15. char buffer[12]; // 12 total
  16.  
  17. struct {
  18. unsigned short empty; // 2
  19. unsigned char version[3]; // 3
  20. unsigned char v1; // 1
  21. unsigned char v2; // 1
  22. unsigned char flags; // 1
  23. unsigned int size; // 4
  24. } data;
  25. } TAGHEADER;
  26.  
  27. typedef union tagFRAMEHEADER
  28. {
  29. char buffer[10]; // 10 total
  30.  
  31. struct {
  32. unsigned char name[4]; // 4
  33. unsigned int size; // 4
  34. unsigned short flags; // 2
  35. } data;
  36. } FRAMEHEADER;
  37.  
  38. void copyFile(FILE* inp, FILE* outp) {
  39. int c;
  40. while ((c = getc(inp)) != EOF)
  41. putc(c, outp);
  42. }
  43.  
  44. void show(char* fileName)
  45. {
  46. FILE* file;
  47. file = fopen(fileName, "rb");
  48. if (file == NULL)
  49. {
  50. printf("Read file error ocured!\n");
  51. exit(404);
  52. }
  53.  
  54. fseek(file, 0, SEEK_SET);
  55.  
  56. TAGHEADER tagHeader;
  57. fread(tagHeader.buffer + 2, sizeof(char), 10, file);
  58.  
  59. unsigned int tagSize = reverseBytes(tagHeader.data.size);
  60.  
  61. printf("%sv%d.%d\n", tagHeader.data.version,
  62. tagHeader.data.v1,
  63. tagHeader.data.v2);
  64.  
  65. while (ftell(file) < tagSize + 10)
  66. {
  67. FRAMEHEADER frameHeader;
  68. fread(frameHeader.buffer, sizeof(char), 10, file);
  69. if (frameHeader.data.name[0] == 0)
  70. continue;
  71. printf("%s: ", frameHeader.data.name);
  72.  
  73. unsigned int frameSize = reverseBytes(frameHeader.data.size);
  74.  
  75. char* frameContent;
  76. frameContent = (char*)malloc(sizeof(char) * frameSize);
  77. fread(frameContent, sizeof(char), frameSize, file);
  78.  
  79. for (unsigned int i = 0; i < frameSize; ++i)
  80. {
  81. printf("%c", frameContent[i]);
  82. }
  83. printf("\n");
  84. free(frameContent);
  85. }
  86. fclose(file);
  87. }
  88.  
  89. void get(char* fileName, char frameName[4])
  90. {
  91. FILE* file;
  92. file = fopen(fileName, "rb");
  93.  
  94. TAGHEADER tagHeader;
  95. fread(tagHeader.buffer + 2, sizeof(char), 10, file);
  96.  
  97. unsigned int tagSize = reverseBytes(tagHeader.data.size);
  98.  
  99. while (ftell(file) < tagSize + 10)
  100. {
  101. FRAMEHEADER frameHeader;
  102. fread(frameHeader.buffer, sizeof(char), 10, file);
  103.  
  104. unsigned int frameSize = reverseBytes(frameHeader.data.size);
  105.  
  106. if (strcmp((const char*)frameHeader.data.name, (const char*)frameName) == 0)
  107. {
  108. printf("%s: ", frameHeader.data.name);
  109.  
  110. unsigned char* frameContent;
  111. frameContent = (unsigned char*)malloc(sizeof(char) * frameSize);
  112. fread(frameContent, sizeof(char), frameSize, file);
  113.  
  114. for (unsigned int i = 0; i < frameSize; ++i)
  115. {
  116. printf("%c", frameContent[i]);
  117. }
  118. printf("\n");
  119. free(frameContent);
  120. fclose(file);
  121. return;
  122. }
  123.  
  124. fseek(file, frameSize, SEEK_CUR);
  125. }
  126. fclose(file);
  127. printf("No value found for %s!", frameName);
  128. }
  129.  
  130. void set(char* fileName, char frameName[4], char* frameValue)
  131. {
  132. FILE* file;
  133. file = fopen(fileName, "rb");
  134.  
  135. TAGHEADER tagHeader;
  136. fread(tagHeader.buffer + 2, sizeof(char), 10, file);
  137.  
  138. unsigned int tagSize = reverseBytes(tagHeader.data.size);
  139.  
  140. unsigned int oldFramePos = 0;
  141. unsigned int oldFrameSize = 0;
  142.  
  143. while (ftell(file) < tagSize + 10)
  144. {
  145. FRAMEHEADER frameHeader;
  146. fread(frameHeader.buffer, sizeof(char), 10, file);
  147.  
  148. unsigned int frameSize = reverseBytes(frameHeader.data.size);
  149.  
  150. if (strcmp((const char*)frameHeader.data.name, (const char*)frameName) == 0)
  151. {
  152. oldFramePos = ftell(file) - 10;
  153. oldFrameSize = frameSize;
  154. break;
  155. }
  156. fseek(file, frameSize, SEEK_CUR);
  157. }
  158.  
  159. unsigned int valueSize = strlen(frameValue);
  160.  
  161. unsigned int newTagSize = tagSize - oldFrameSize + valueSize + 10 * (oldFramePos != 0);
  162.  
  163. if (oldFramePos == 0)
  164. {
  165. oldFramePos = ftell(file);
  166. }
  167. if (valueSize == 0)
  168. {
  169. newTagSize -= 10;
  170. }
  171.  
  172. FILE* fileCopy;
  173. fileCopy = fopen("temp.mp3", "wb");
  174.  
  175. fseek(file, 0, SEEK_SET);
  176. fseek(fileCopy, 0, SEEK_SET);
  177. copyFile(file, fileCopy);
  178.  
  179. fclose(file);
  180. fclose(fileCopy);
  181.  
  182. fileCopy = fopen("temp.mp3", "rb");
  183. file = fopen(fileName, "wb");
  184.  
  185. tagHeader.data.size = reverseBytes(newTagSize);
  186.  
  187. fwrite(tagHeader.buffer + 2, sizeof(char), 10, file);
  188.  
  189. fseek(fileCopy, 10, SEEK_SET);
  190.  
  191. for (unsigned int i = 0; i < oldFramePos - 10; ++i)
  192. {
  193. int c;
  194. c = getc(fileCopy);
  195. putc(c, file);
  196. }
  197.  
  198. if (valueSize > 0)
  199. {
  200. FRAMEHEADER frameHeader;
  201. for (unsigned int i = 0; i < 4; ++i)
  202. {
  203. frameHeader.data.name[i] = frameName[i];
  204. }
  205. frameHeader.data.size = reverseBytes(valueSize);
  206. frameHeader.data.flags = 0;
  207. fwrite(frameHeader.buffer, sizeof(char), 10, file);
  208. }
  209.  
  210. fwrite(frameValue, sizeof(char), valueSize, file);
  211.  
  212. fseek(fileCopy, oldFramePos + 10 + oldFrameSize, SEEK_SET);
  213.  
  214. for (unsigned int i = ftell(file); i < newTagSize; ++i)
  215. {
  216. unsigned short int c;
  217. c = getc(fileCopy);
  218. putc(c, file);
  219. }
  220.  
  221. printf("New value for frame %s: %s\n", frameName, frameValue);
  222.  
  223. copyFile(fileCopy, file);
  224.  
  225. fclose(file);
  226. fclose(fileCopy);
  227. remove("temp.mp3");
  228. }
  229.  
  230. int main(int argc, char* argv[]) {
  231. char* fileName;
  232. char* frameName;
  233. char* value;
  234. char showFlag = 0;
  235. char setFlag = 0;
  236. char getFlag = 0;
  237. for (int i = 1;i < argc; i++){
  238. if (strcmp(argv[i], "--show") == 0) {
  239. showFlag = 1;
  240. continue;
  241. }
  242. if (argv[i][2] == 'f')
  243. {
  244. fileName = strpbrk(argv[i], "=") + 1;
  245. }
  246. if (argv[i][2] == 'g') {
  247. getFlag = 1;
  248. frameName = strpbrk(argv[i], "=") + 1;
  249. continue;
  250. }
  251. if (argv[i][2] == 's') {
  252. setFlag = 1;
  253. frameName = strpbrk(argv[i], "=") + 1;
  254. continue;
  255. }
  256. if (argv[i][2] == 'v') {
  257. value = strpbrk(argv[i], "=") + 1;
  258. continue;
  259. }
  260. }
  261. if (showFlag)
  262. {
  263. show(fileName);
  264. }
  265. if (getFlag)
  266. {
  267. get(fileName, frameName);
  268. }
  269. if (setFlag)
  270. {
  271. set(fileName, frameName, value);
  272. }
  273. return 0;
  274. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement