Advertisement
Guest User

Untitled

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