#include "read.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
bool _suffix_check(char* filename) {
char* suffix = strrchr(filename, '.');
if (suffix == NULL) {
return false;
} else if (strcmp(suffix, ".kml") != 0) {
return false;
}
return true;
}
bool _file_exists(char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
return false;
}
fclose(file);
return true;
}
float _file_size(char* filename) {
FILE* file = fopen(filename, "r");
fseek(file, 0, SEEK_END);
float size = ftell(file);
fclose(file);
return size;
}
float read_kml_size(char* filename) {
return _file_size(filename);
}
float read_kml_version(char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
return 0.0;
}
char line[256];
for (int i = 0; i < 5; i++) {
if (fgets(line, sizeof(line), file) == NULL) {
fclose(file);
return 0.0;
}
}
const char* needed_begin = "&kml_set_version<";
const char* needed_end = ">&";
char* start = strstr(line, needed_begin);
char* end = strstr(line, needed_end);
if (start != NULL && end != NULL && start < end) {
start += strlen(needed_begin);
*end = '\0';
float version = atof(start);
fclose(file);
return version;
}
fclose(file);
return 0.0;
}
char* read_kml_name(char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
return NULL;
}
char line[256];
for (int i = 0; i < 6; i++) {
if (fgets(line, sizeof(line), file) == NULL) {
fclose(file);
return NULL;
}
}
const char* needed_begin = "&kml_set_name<";
const char* needed_end = ">&";
char* start = strstr(line, needed_begin);
char* end = strstr(line, needed_end);
if (start != NULL && end != NULL && start < end) {
start += strlen(needed_begin);
*end = '\0';
fclose(file);
return strdup(start);
}
fclose(file);
return NULL;
}
char* read_kml_description(char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
return NULL;
}
char line[256];
for (int i = 0; i < 7; i++) {
if (fgets(line, sizeof(line), file) == NULL) {
fclose(file);
return NULL;
}
}
const char* needed_begin = "&kml_set_description<";
const char* needed_end = ">&";
char* start = strstr(line, needed_begin);
char* end = strstr(line, needed_end);
if (start != NULL && end != NULL && start < end) {
start += strlen(needed_begin);
*end = '\0';
fclose(file);
return strdup(start);
}
fclose(file);
return NULL;
}
char* read_kml_author(char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
return NULL;
}
char line[256];
for (int i = 0; i < 8; i++) {
if (fgets(line, sizeof(line), file) == NULL) {
fclose(file);
return NULL;
}
}
const char* needed_begin = "&kml_set_author<";
const char* needed_end = ">&";
char* start = strstr(line, needed_begin);
char* end = strstr(line, needed_end);
if (start != NULL && end != NULL && start < end) {
start += strlen(needed_begin);
*end = '\0';
fclose(file);
return strdup(start);
}
fclose(file);
return NULL;
}
char* read_kml_depends(char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
return NULL;
}
char line[256];
for (int i = 0; i < 9; i++) {
if (fgets(line, sizeof(line), file) == NULL) {
fclose(file);
return NULL;
}
}
const char* needed_begin = "&kml_set_depends<";
const char* needed_end = ">&";
char* start = strstr(line, needed_begin);
char* end = strstr(line, needed_end);
if (start != NULL && end != NULL && start < end) {
start += strlen(needed_begin);
*end = '\0';
fclose(file);
return strdup(start);
}
fclose(file);
return NULL;
}
char* read_kml_file(char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
return NULL;
}
fseek(file, 0, SEEK_END);
long file_size = ftell(file);
rewind(file);
char* content = (char*)malloc((file_size + 1) * sizeof(char));
if (content == NULL) {
fclose(file);
return NULL;
}
size_t read_size = fread(content, sizeof(char), file_size, file);
content[read_size] = '\0';
fclose(file);
return content;
}
bool validate_kml_file(char* filename) {
bool val1 = _suffix_check(filename);
bool val2 = _file_exists(filename);
bool val3 = (read_kml_version(filename) != 0.0);
bool val4 = (read_kml_name(filename) != NULL);
bool val5 = (read_kml_description(filename) != NULL);
bool val6 = (read_kml_author(filename) != NULL);
bool val7 = (read_kml_depends(filename) != NULL);
if (val1 && val2 && val3 && val4 && val5 && val6 && val7) {
return true;
} else {
return false;
}
}