Add comments and error checking to A9
This commit is contained in:
@@ -39,12 +39,12 @@ int get_fd(char *path) {
|
||||
FILE *fp = fopen(path, "rb");
|
||||
if (fp == NULL) {
|
||||
perror("fopen");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
int fd = fileno(fp);
|
||||
if (fd == -1) {
|
||||
perror("fileno");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
return fd;
|
||||
}
|
||||
@@ -53,7 +53,7 @@ FILE *get_fp(int fd) {
|
||||
FILE *fp = fdopen(fd, "rb");
|
||||
if (fp == NULL) {
|
||||
perror("fdopen");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
return fp;
|
||||
}
|
||||
@@ -66,7 +66,7 @@ char *load_file(int fd) {
|
||||
char *buffer = malloc(size);
|
||||
if (buffer == NULL) {
|
||||
perror("malloc");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
fread(buffer, 1, size, fp);
|
||||
fclose(fp);
|
||||
@@ -81,15 +81,16 @@ png_chunk *get_png_chunk(char *buffer, unsigned int offset) {
|
||||
png_chunk *chunk = malloc(sizeof(png_chunk));
|
||||
if (chunk == NULL) {
|
||||
perror("malloc");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
memcpy(&chunk->length, buffer + offset + 0, 4);
|
||||
// Convert length to host byte order because PNG lengths is in network byte order/Big Endian
|
||||
chunk->length = ntohl(chunk->length);
|
||||
memcpy(&chunk->type, buffer + offset + 4, 4);
|
||||
chunk->data = malloc(chunk->length);
|
||||
if (chunk->data == NULL) {
|
||||
perror("malloc");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
memcpy(chunk->data, buffer + offset + 8, chunk->length);
|
||||
memcpy(&chunk->crc, buffer + offset + 8 + chunk->length, 4);
|
||||
@@ -100,9 +101,11 @@ png_chunk **get_png_chunks(char *buffer) {
|
||||
png_chunk **chunks = malloc(sizeof(png_chunk *));
|
||||
if (chunks == NULL) {
|
||||
perror("malloc");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
// Running offset of the buffer
|
||||
unsigned int offset = PNG_SIGNATURE_SIZE;
|
||||
// Index of the current chunk
|
||||
int i = 0;
|
||||
while (true) {
|
||||
chunks[i] = get_png_chunk(buffer, offset);
|
||||
@@ -112,11 +115,14 @@ png_chunk **get_png_chunks(char *buffer) {
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
chunks = realloc(chunks, sizeof(png_chunk *) * (i + 1));
|
||||
if (chunks == NULL) {
|
||||
// Add one because realloc is 1-indexed when multiplying by sizeof
|
||||
png_chunk **err_check = realloc(chunks, sizeof(png_chunk *) * (i + 1));
|
||||
if (err_check == NULL) {
|
||||
destroy_chunks(chunks);
|
||||
perror("realloc");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
chunks = err_check;
|
||||
}
|
||||
return chunks;
|
||||
}
|
||||
@@ -126,6 +132,7 @@ int get_number_of_chunks(png_chunk **chunks) {
|
||||
while (memcmp(chunks[i]->type, "IEND", 4) != 0) {
|
||||
i++;
|
||||
}
|
||||
// Add one for the IEND chunk
|
||||
return ++i;
|
||||
}
|
||||
|
||||
@@ -148,14 +155,16 @@ void write_png_chunks(char *path, png_chunk **chunks) {
|
||||
FILE *fp = fopen(path, "wb");
|
||||
if (fp == NULL) {
|
||||
perror("fopen");
|
||||
exit(1);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
fwrite(PNG_SIGNATURE, PNG_SIGNATURE_SIZE, 1, fp);
|
||||
unsigned int size = get_number_of_chunks(chunks);
|
||||
for (int i = 0; i < size; i++) {
|
||||
// Convert length to network byte order for writing
|
||||
chunks[i]->length = htonl(chunks[i]->length);
|
||||
fwrite(&chunks[i]->length, 4, 1, fp);
|
||||
fwrite(chunks[i]->type, 4, 1, fp);
|
||||
// Convert back so we can accurately use it to write the length of the data
|
||||
chunks[i]->length = ntohl(chunks[i]->length);
|
||||
fwrite(chunks[i]->data, chunks[i]->length, 1, fp);
|
||||
fwrite(&chunks[i]->crc, 4, 1, fp);
|
||||
|
||||
Reference in New Issue
Block a user