Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lab4 #197

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open

lab4 #197

Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
189 changes: 189 additions & 0 deletions lab4/lab4.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

unsigned int Reverse(unsigned int Size) {
return ((Size >> 24) & 0x000000ff) | ((Size >> 8) & 0x0000ff00) | ((Size << 8) & 0x00ff0000) | ((Size << 24) & 0xff000000);
}


typedef union Tag {
char Buffer[12];
struct TagData{
unsigned short int Empty;
unsigned char Version[3];
unsigned char Version_1;
unsigned char Version_2;
unsigned char Flags;
unsigned int Size;
} TagData;
} TagTag;

typedef union Frame {
char Buffer[10];
struct FrameData{
unsigned char Name[4];
unsigned int Size;
unsigned short int Flags;
} FrameData;
} FrameTag;

void Copy(FILE *Input, FILE *Output) {
int Char;
while ((Char = getc(Input)) != EOF) {
putc(Char, Output);
}
}



void Show(char *FileName) {
FILE* File = fopen(FileName, "rb");
fseek(File, 0, 0);

TagTag Tag;
fread(Tag.Buffer + 2, sizeof(char), 10, File);
unsigned int TagSize = Reverse(Tag.TagData.Size);
printf("%sv%d.%d\n", Tag.TagData.Version, Tag.TagData.Version_1, Tag.TagData.Version_2);
while (ftell(File) < TagSize + 10) {
FrameTag Frame;
fread(Frame.Buffer, sizeof(char), 10, File);
if (Frame.FrameData.Name[0] == 0) {
break;
}
printf("%s: ", Frame.FrameData.Name);
unsigned int FrameSize = Reverse(Frame.FrameData.Size);
unsigned char* FrameContent = malloc(sizeof(char) *FrameSize);
fread(FrameContent, sizeof(char), FrameSize, File);
for (int i = 0; i < FrameSize; ++i) {
printf("%c", FrameContent[i]);
}
printf("\n");
free(FrameContent);
}
fclose(File);
}

void Get(char *FileName, char FrameName[4]) {
FILE* File = fopen(FileName, "rb");

TagTag Tag;
fread(Tag.Buffer + 2, sizeof(char), 10, File);
unsigned int TagSize = Reverse(Tag.TagData.Size);
while (ftell(File) < TagSize + 10) {
FrameTag Frame;
fread(Frame.Buffer, sizeof(char), 10, File);
unsigned int FrameSize = Reverse(Frame.FrameData.Size);
if (strcmp((char*)Frame.FrameData.Name, FrameName) == 0) {
printf("%s: ", Frame.FrameData.Name);
unsigned char *FrameContent = malloc(sizeof(char) *FrameSize);
fread(FrameContent, sizeof(char), FrameSize, File);
for (int i = 0; i < FrameSize; ++i) {
printf("%c", FrameContent[i]);
}
printf("\n");
free(FrameContent);
fclose(File);
return;
}
fseek(File, FrameSize, 1);
}
fclose(File);
}

void Set(char *FileName, char FrameName[4], char *FrameValue) {
FILE* File = fopen(FileName, "rb");
TagTag Tag;
fread(Tag.Buffer + 2, sizeof(char), 10, File);
unsigned int TagSize = Reverse(Tag.TagData.Size), OldFramePosition = 0, OldFrameSize = 0;
while (ftell(File) < TagSize + 10) {
FrameTag Frame;
fread(Frame.Buffer, sizeof(char), 10, File);
unsigned int FrameSize = Reverse(Frame.FrameData.Size);
if (strcmp((char*)Frame.FrameData.Name, FrameName) == 0) {
OldFramePosition = (unsigned int)ftell(File) - 10;
OldFrameSize = FrameSize;
break;
}
fseek(File, FrameSize, 1);
}
unsigned int ValueSize = (unsigned int)strlen(FrameValue), NewTagSize = TagSize - OldFrameSize + ValueSize + 10 * (OldFramePosition != 0); // Ничего интересного, просто новые переменные
if (OldFramePosition == 0) {
OldFramePosition = (unsigned int)ftell(File);
}
if (ValueSize == 0) {
NewTagSize -= 10;
}
FILE* FileCopy = fopen("temp.mp3", "wb");
fseek(File, 0, 0);
fseek(FileCopy, 0, 0);
Copy(File, FileCopy);
fclose(File);
fclose(FileCopy);

FileCopy = fopen("temp.mp3", "rb");
File = fopen(FileName, "wb");
Tag.TagData.Size = Reverse(NewTagSize);
fwrite(Tag.Buffer + 2, sizeof(char), 10, File);
fseek(FileCopy, 10, 0);

for (int i = 0; i < OldFramePosition - 10; ++i) {
int Char = getc(FileCopy);
putc(Char, File);
}
if (ValueSize > 0) {
FrameTag Frame;
for (int i = 0; i < 4; ++i)
Frame.FrameData.Name[i] = FrameName[i];
Frame.FrameData.Size = Reverse(ValueSize);
Frame.FrameData.Flags = 0;
fwrite(Frame.Buffer, sizeof(char), 10, File);
}
fwrite(FrameValue, sizeof(char), ValueSize, File);
fseek(FileCopy, OldFramePosition + 10 + OldFrameSize, 0);
for (int i = (int)ftell(File); i < NewTagSize; ++i) {
int Char = getc(FileCopy);
putc(Char, File);
}
printf("New val %s: %s\n", FrameName, FrameValue);
Copy(FileCopy, File);
fclose(File);
fclose(FileCopy);
remove("temp.mp3");
}

int main(int argc, char *argv[]) {
char *FileName = NULL, *FrameName = NULL, *Value = NULL, ShowFlag = 0, SetFlag = 0, GetFlag = 0;
for (int i = 1; i < argc; i++) {
if (strcmp(argv[i], "--show") == 0) {
ShowFlag = 1;
continue;
}
if (argv[i][2] == 'f') {
FileName = strpbrk(argv[i], "=") + 1;
}
if (argv[i][2] == 'g') {
GetFlag = 1;
FrameName = strpbrk(argv[i], "=") + 1;
continue;
}
if (argv[i][2] == 's') {
SetFlag = 1;
FrameName = strpbrk(argv[i], "=") + 1;
continue;
}
if (argv[i][2] == 'v') {
Value = strpbrk(argv[i], "=") + 1;
continue;
}
Comment on lines +162 to +178
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Проверка не на --show, --get, --set, --value, а на **s%, **g%, **v% и --show

}
if (ShowFlag) {
Show(FileName);
}
if (GetFlag) {
Get(FileName, FrameName);
}
if (SetFlag) {
Set(FileName, FrameName, Value);
}
}