Add an implementation, still just trying to read
This commit is contained in:
		
							
								
								
									
										7
									
								
								Assignment9/.idea/runConfigurations/Assignment9.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assignment9/.idea/runConfigurations/Assignment9.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Assignment9" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test1.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test1.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Test1" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="../tests/test1.png" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test2.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test2.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Test2" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="../tests/test2.png" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test3.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test3.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Test3" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="../tests/test3.png" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
							
								
								
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test4.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								Assignment9/.idea/runConfigurations/Test4.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,7 @@ | ||||
| <component name="ProjectRunConfigurationManager"> | ||||
|   <configuration default="false" name="Test4" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="../tests/test4.png" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Assignment9" TARGET_NAME="Assignment9" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Assignment9" RUN_TARGET_NAME="Assignment9"> | ||||
|     <method v="2"> | ||||
|       <option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" /> | ||||
|     </method> | ||||
|   </configuration> | ||||
| </component> | ||||
| @@ -1,4 +1,6 @@ | ||||
| cmake_minimum_required(VERSION 3.20) | ||||
| project(Assignment9 C) | ||||
| set(CMAKE_C_STANDARD 99) | ||||
| add_executable(Assignment9 src/main.c) | ||||
| add_executable(Assignment9 src/main.c | ||||
|         src/png.c | ||||
|         src/png.h) | ||||
							
								
								
									
										68
									
								
								Assignment9/documentation/EndiannessAndHomework9.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								Assignment9/documentation/EndiannessAndHomework9.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,68 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <arpa/inet.h> | ||||
| // FILE format is: 'header', then 2023 skipped bytes, then the number of interest | ||||
| #define OURINT 1426915328 | ||||
| #define OFFSETTODATA 2023 | ||||
|  | ||||
| int writeToFile(){ | ||||
|  | ||||
|     FILE* fp = fopen("toReadLater.txt","w+"); | ||||
| 	char c = 'h'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'e'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'a'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'd'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'e'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     c = 'r'; | ||||
|     fwrite(&c, sizeof(char), 1, fp); | ||||
|     unsigned int buf = OFFSETTODATA; | ||||
|     fwrite(&buf, sizeof(int), 1, fp); | ||||
|     fseek(fp, OFFSETTODATA, SEEK_CUR); | ||||
|  | ||||
|     buf = OURINT; | ||||
|     fwrite(&buf, sizeof(int), 1, fp); | ||||
|     fclose(fp); | ||||
| } | ||||
|  | ||||
| int readFromFile(){ | ||||
| 	FILE *fp = fopen("toReadLater.txt", "r+"); | ||||
| 	fseek(fp, 6 , SEEK_SET); | ||||
| 	int skip = 0; | ||||
| 	fread(&skip, sizeof(int), 1, fp); | ||||
|     // NOTE, in HW, the size of the section is a value in  | ||||
|     // Big-Endian format, it will actually need conversion | ||||
| 	fseek(fp, skip, SEEK_CUR); | ||||
| 	unsigned int qBe = 0; | ||||
| 	unsigned int qLe = 0; | ||||
| 	int i; | ||||
| 	unsigned char *c = (char *)(&qBe); | ||||
| 	unsigned char *d = (char *)(&qLe); | ||||
| 	for (i = 0; i < 4; i++) | ||||
| 	{ | ||||
| 		c[i] = getc(fp); | ||||
| 		printf("Byte %i: %i %x\n",i, c[i], c[i]); | ||||
| 	} | ||||
|  | ||||
|     for (i = 0; i < 4; i++) | ||||
| 	{ | ||||
| 		d[4-i-1] = c[i]; | ||||
| 	} | ||||
|  | ||||
|     printf("Translated using swapping the bytes order: %i\n", qLe); | ||||
| 	qLe = ntohl(qBe); | ||||
|     printf("Translated using ntohl: %i\n", qLe); | ||||
|     fclose(fp); | ||||
| } | ||||
| int main (int argc, char** argv){ | ||||
|     unsigned int wantToRead; | ||||
| 	writeToFile(); | ||||
| 	printf("Sizeof (int) is:%li\n", sizeof(unsigned int)); | ||||
| 	readFromFile(); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| @@ -1,3 +1,39 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <limits.h> | ||||
| #include <string.h> | ||||
| #include <stdbool.h> | ||||
| #include "png.h" | ||||
|  | ||||
| int main(int argc, char *argv[]) { | ||||
| 	return 0; | ||||
| 	if (argc != 2) { | ||||
| 		printf("Usage: %s <png file>\n", argv[0]); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	if (strlen(argv[1]) > PATH_MAX) { | ||||
| 		printf("Path too long\n"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	char *path = argv[1]; | ||||
|  | ||||
| 	char* png_buffer = load_file(get_fd(path)); | ||||
| 	if (!is_png(png_buffer)) { | ||||
| 		printf("It's not a PNG file\n"); | ||||
| 		exit(1); | ||||
| 	} else { | ||||
| 		printf("It's a PNG file\n"); | ||||
| 	} | ||||
| 	png_chunk **chunks = get_png_chunks(png_buffer); | ||||
| 	int size = get_number_of_chunks(chunks); | ||||
| 	for (int i = 0; i < size; i++) { | ||||
| 		// Check if header is IDAT or IEND | ||||
| 		bool is_idat = memcmp(chunks[i]->type, "IDAT", 4) == 0; | ||||
| 		bool is_iend = memcmp(chunks[i]->type, "IEND", 4) == 0; | ||||
| 		if (is_idat || is_iend) { | ||||
| 			printf("Found %s chunk\n", chunks[i]->type); | ||||
| 		} else { | ||||
| 			printf("Found unknown: %s\n", chunks[i]->type); | ||||
| 		} | ||||
| 		printf("Chunk size is:%d\n", chunks[i]->length); | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										146
									
								
								Assignment9/src/png.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								Assignment9/src/png.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| /* | ||||
|  * Copyright Notice | ||||
|  * ---------------- | ||||
|  * Copyright © 1998, 1999 by: Glenn Randers-Pehrson | ||||
|  * This specification is a modification of the PNG 1.0 specification. It is being | ||||
|  * provided by the copyright holder under the provisions of the 1996 MIT copyright and license: | ||||
|  * Copyright © 1996 by: Massachusetts Institute of Technology (MIT) | ||||
|  * This W3C specification is being provided by the copyright holders under | ||||
|  * the following license. By obtaining, using and/or copying this specification, you | ||||
|  * agree that you have read, understood, and will comply with the following terms | ||||
|  * and conditions: | ||||
|  * Permission to use, copy, and distribute this specification for any purpose | ||||
|  * and without fee or royalty is hereby granted, provided that the full text of | ||||
|  * this NOTICE appears on ALL copies of the specification or portions thereof, | ||||
|  * including modifications, that you make. | ||||
|  * THIS SPECIFICATION IS PROVIDED ”AS IS,” AND COPYRIGHT HOLD-ERS | ||||
|  * MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR | ||||
|  * IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, COPYRIGHT | ||||
|  * HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES OF MER-CHANTABILITY | ||||
|  * OR FITNESS FOR ANY PARTICULAR PURPOSE OR | ||||
|  * THAT THE USE OF THE SPECIFICATION WILL NOT INFRINGE ANY | ||||
|  * THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER | ||||
|  * RIGHTS. COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY | ||||
|  * USE OF THIS SPECIFICATION. | ||||
|  * The name and trademarks of copyright holders may NOT be used in | ||||
|  * ad-vertising or publicity pertaining to the specification without specific, written | ||||
|  * prior permission. Title to copyright in this specification and any associated | ||||
|  * documentation will at all times remain with copyright holders. | ||||
|  */ | ||||
|  | ||||
| #include <arpa/inet.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <zlib.h> | ||||
| #include <string.h> | ||||
| #include "png.h" | ||||
|  | ||||
| int get_fd(char *path) { | ||||
| 	FILE *fp = fopen(path, "rb"); | ||||
| 	if (fp == NULL) { | ||||
| 		perror("fopen"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	int fd = fileno(fp); | ||||
| 	if (fd == -1) { | ||||
| 		perror("fileno"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	return fd; | ||||
| } | ||||
|  | ||||
| FILE *get_fp(int fd) { | ||||
| 	FILE *fp = fdopen(fd, "rb"); | ||||
| 	if (fp == NULL) { | ||||
| 		perror("fdopen"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	return fp; | ||||
| } | ||||
|  | ||||
| char *load_file(int fd) { | ||||
| 	FILE *fp = get_fp(fd); | ||||
| 	fseek(fp, 0, SEEK_END); | ||||
| 	long size = ftell(fp); | ||||
| 	rewind(fp); | ||||
| 	char *buffer = malloc(size); | ||||
| 	if (buffer == NULL) { | ||||
| 		perror("malloc"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	fread(buffer, 1, size, fp); | ||||
| 	// Iterate over buffer and convert from network byte order to host byte order | ||||
| 	//for (int i = 0; i < size; i += 4) { | ||||
| 	//	uint32_t *ptr = (uint32_t *)(buffer + i); | ||||
| 	//	*ptr = ntohl(*ptr); | ||||
| 	//} | ||||
| 	fclose(fp); | ||||
| 	return buffer; | ||||
| } | ||||
|  | ||||
| int is_png(char *buffer) { | ||||
| 	return memcmp(buffer, PNG_SIGNATURE, PNG_SIGNATURE_SIZE) == 0; | ||||
| } | ||||
|  | ||||
| png_chunk *get_png_chunk(char *buffer, int offset) { | ||||
| 	png_chunk *chunk = malloc(sizeof(png_chunk)); | ||||
| 	if (chunk == NULL) { | ||||
| 		perror("malloc"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	memcpy(&chunk->length, buffer + offset + 0, 4); | ||||
| 	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); | ||||
| 	} | ||||
| 	memcpy(chunk->data, buffer + offset + 8, chunk->length); | ||||
| 	memcpy(&chunk->crc, buffer + offset + 8 + chunk->length, 4); | ||||
| 	return chunk; | ||||
| } | ||||
|  | ||||
| png_chunk **get_png_chunks(char *buffer) { | ||||
| 	png_chunk **chunks = malloc(sizeof(png_chunk *)); | ||||
| 	if (chunks == NULL) { | ||||
| 		perror("malloc"); | ||||
| 		exit(1); | ||||
| 	} | ||||
| 	int offset = PNG_SIGNATURE_SIZE; | ||||
| 	int i = 0; | ||||
| 	while (1) { | ||||
| 		chunks[i] = get_png_chunk(buffer, offset); | ||||
| 		offset += chunks[i]->length; | ||||
| 		if (memcmp(chunks[i]->type, "IEND", 4) == 0) { | ||||
| 			break; | ||||
| 		} | ||||
| 		i++; | ||||
| 		chunks = realloc(chunks, sizeof(png_chunk *) * (i + 1)); | ||||
| 		if (chunks == NULL) { | ||||
| 			perror("realloc"); | ||||
| 			exit(1); | ||||
| 		} | ||||
| 	} | ||||
| 	return chunks; | ||||
| } | ||||
|  | ||||
| int is_chunk_valid(png_chunk *chunk) { | ||||
| 	uint32_t crc = htonl(chunk->crc); | ||||
| 	//uint32_t calculated_crc = crc32(0, chunk->type, 4); | ||||
| 	//calculated_crc = crc32(calculated_crc, chunk->data, chunk->length); | ||||
| 	//return crc == calculated_crc; | ||||
| 	return 1; | ||||
| } | ||||
|  | ||||
| int is_chunk_critical(png_chunk *chunk) { | ||||
| 	return chunk->type[0] >= 'A' && chunk->type[0] <= 'Z'; | ||||
| } | ||||
|  | ||||
| int get_number_of_chunks(png_chunk **chunks) { | ||||
| 	int i = 0; | ||||
| 	while (chunks[i] != NULL) { | ||||
| 		i++; | ||||
| 	} | ||||
| 	return i; | ||||
| } | ||||
							
								
								
									
										74
									
								
								Assignment9/src/png.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								Assignment9/src/png.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| /* | ||||
|  * Copyright Notice | ||||
|  * ---------------- | ||||
|  * Copyright © 1998, 1999 by: Glenn Randers-Pehrson | ||||
|  * This specification is a modification of the PNG 1.0 specification. It is being | ||||
|  * provided by the copyright holder under the provisions of the 1996 MIT copyright and license: | ||||
|  * Copyright © 1996 by: Massachusetts Institute of Technology (MIT) | ||||
|  * This W3C specification is being provided by the copyright holders under | ||||
|  * the following license. By obtaining, using and/or copying this specification, you | ||||
|  * agree that you have read, understood, and will comply with the following terms | ||||
|  * and conditions: | ||||
|  * Permission to use, copy, and distribute this specification for any purpose | ||||
|  * and without fee or royalty is hereby granted, provided that the full text of | ||||
|  * this NOTICE appears on ALL copies of the specification or portions thereof, | ||||
|  * including modifications, that you make. | ||||
|  * THIS SPECIFICATION IS PROVIDED ”AS IS,” AND COPYRIGHT HOLD-ERS | ||||
|  * MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR | ||||
|  * IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, COPYRIGHT | ||||
|  * HOLDERS MAKE NO REPRESENTATIONS OR WARRANTIES OF MER-CHANTABILITY | ||||
|  * OR FITNESS FOR ANY PARTICULAR PURPOSE OR | ||||
|  * THAT THE USE OF THE SPECIFICATION WILL NOT INFRINGE ANY | ||||
|  * THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER | ||||
|  * RIGHTS. COPYRIGHT HOLDERS WILL BEAR NO LIABILITY FOR ANY | ||||
|  * USE OF THIS SPECIFICATION. | ||||
|  * The name and trademarks of copyright holders may NOT be used in | ||||
|  * ad-vertising or publicity pertaining to the specification without specific, written | ||||
|  * prior permission. Title to copyright in this specification and any associated | ||||
|  * documentation will at all times remain with copyright holders. | ||||
|  */ | ||||
|  | ||||
| #pragma once | ||||
|  | ||||
| #include <arpa/inet.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <zlib.h> | ||||
| #include <string.h> | ||||
|  | ||||
| // http://www.libpng.org/pub/png/spec/1.2/PNG-Rationale.html#R.PNG-file-signature | ||||
| #define PNG_SIGNATURE "\211PNG\r\n\032\n" | ||||
| #define PNG_SIGNATURE_SIZE 8 | ||||
| typedef struct png_chunk { | ||||
| 	uint32_t length; | ||||
| 	char type[4]; | ||||
| 	char *data; | ||||
| 	uint32_t crc; | ||||
| } png_chunk; | ||||
|  | ||||
| // Get file descriptor from path | ||||
| int get_fd(char *path); | ||||
|  | ||||
| // Get FILE* from file descriptor | ||||
| FILE *get_fp(int fd); | ||||
|  | ||||
| // Store file in heap memory | ||||
| char *load_file(int fd); | ||||
|  | ||||
| // Check if file is a PNG | ||||
| int is_png(char *buffer); | ||||
|  | ||||
| // Get PNG chunk | ||||
| png_chunk *get_png_chunk(char *buffer, int offset); | ||||
|  | ||||
| // Get all PNG chunks | ||||
| png_chunk **get_png_chunks(char *buffer); | ||||
|  | ||||
| // Get number of chunks | ||||
| int get_number_of_chunks(png_chunk **chunks); | ||||
|  | ||||
| // Check if chunk is critical | ||||
| int is_chunk_critical(png_chunk *chunk); | ||||
|  | ||||
| // Is chunk valid? | ||||
| int is_chunk_valid(png_chunk *chunk); | ||||
		Reference in New Issue
	
	Block a user