#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unicode/utypes.h>
#include <unicode/stringpiece.h>
#include <unicode/utf8.h>
#include <unicode/uchar.h>


int main(int argc, char **argv){
	FILE *out_file;
	//FILE *in_file;
	const char *out_file_name = "./all-uni.txt";
	const char *in_file_name = "./all-utf8.txt";
	uint32_t num1 = 0;
	uint32_t unicode;
	uint32_t len = 0;
	//uint8_t byte;
	size_t total_read = 0;
	size_t file_bytes = 0;
	struct stat buffer;
	char *mem_file;

	int input = open(in_file_name, O_RDONLY);
	if(input == -1){
		fprintf( stderr, "Error opening %s\n", in_file_name);
		exit(1);
	}
	int status = fstat(input, &buffer);
	file_bytes=buffer.st_size;
	mem_file = (char *)mmap(0, file_bytes, PROT_READ, MAP_SHARED, input, 0);
	if(mem_file == MAP_FAILED) {
		close(input);
		printf("Error: mmap MAP_FAILED\n");
		exit(1);
	}

	if( ( out_file = fopen(out_file_name, "w" ) ) == NULL ) {
		fprintf( stderr, "Error opening %s\n", out_file_name);
		exit(1);
	}

	//printf("
	while(num1 < file_bytes){
		len = 0;
		U8_NEXT(&mem_file[num1], len, 4, unicode);
		//len = gd_UTF8_To_Unicode(&mem_file[num1], &unicode);
		if(unicode == 0XFFFFFFFF){
			num1++;
			continue;
		}else{
			num1+=len;
			fprintf(out_file, "%u\n", unicode);
		}
	}


	if(munmap(mem_file, file_bytes) == -1){
		printf("Error: munmap\n");
	}
	fclose(out_file);
	close(input);
	return 0;
}
