#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <sysexits.h>
#include <getopt.h>
#include <arpa/inet.h>
#include <errno.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>

void usage(const char *pname) {
	fprintf(stderr, "Usage: %s [-h|--help] [-b|--boardrsrc boardfile] [-d|--drvrrsrc driverfile] [-l|--bytelanes bytelanes] [-o|--output outfile]\n", pname);
	return;
}

int main(int argc, char *argv[]) {
	char *filename = argv[1];
	int fd;
	struct stat sb;
	unsigned char *rom = NULL;

	printf("Opening %s\n", filename);
	fd = open(filename, O_RDWR);
	if(fd < 0) {
		fprintf(stderr, "Error opening declrom file %s: %d %s\n", filename, errno, strerror(errno));
		exit(EX_CONFIG);
	}

	if(fstat(fd, &sb) != 0) {
		fprintf(stderr, "Error fstating declrom file %s: %d %s\n", filename, errno, strerror(errno));
		exit(EX_CONFIG);
	}

	rom = calloc(1, sb.st_size);

	if(read(fd, rom, sb.st_size) != sb.st_size) {
		fprintf(stderr, "Error reading declrom file %s: %d %s\n", filename, errno, strerror(errno));
		exit(EX_CONFIG);
	}

	uint32_t len = *(uint32_t*)(rom + sb.st_size - 16);
	len = ntohl(len);
	printf("Length: %d\n", len);

	unsigned char *i = (rom + sb.st_size - len);
	uint32_t sum = 0;
	int n = 0;
	while(n < len) {
		uint32_t tmpint = sum >> 31;
		sum = sum << 1;
		sum |= tmpint;
		sum += *i;
		i++;
		n++;
	}

	lseek(fd, -12, SEEK_END);
	sum = htonl(sum);
	if(write(fd, &sum, sizeof(sum)) != sizeof(sum)) {
		fprintf(stderr, "Error writing checksum: %d %s\n", errno, strerror(errno));
		exit(EX_CONFIG);
	}
	
	exit(EX_OK);
}
