diff --git a/Makefile b/Makefile old mode 100644 new mode 100755 diff --git a/README.md b/README.md old mode 100644 new mode 100755 diff --git a/dataset_1.csv b/dataset_1.csv old mode 100644 new mode 100755 diff --git a/dataset_10.csv b/dataset_10.csv old mode 100644 new mode 100755 diff --git a/dataset_100.csv b/dataset_100.csv old mode 100644 new mode 100755 diff --git a/dataset_2.csv b/dataset_2.csv old mode 100644 new mode 100755 diff --git a/dataset_full.csv b/dataset_full.csv old mode 100644 new mode 100755 diff --git a/output.txt b/output.txt old mode 100644 new mode 100755 diff --git a/poly_1split.txt b/poly_1split.txt old mode 100644 new mode 100755 diff --git a/poly_2split.txt b/poly_2split.txt old mode 100644 new mode 100755 diff --git a/poly_3split.txt b/poly_3split.txt old mode 100644 new mode 100755 diff --git a/poly_4split.txt b/poly_4split.txt old mode 100644 new mode 100755 diff --git a/poly_5split.txt b/poly_5split.txt old mode 100644 new mode 100755 diff --git a/polygon_irregular.txt b/polygon_irregular.txt old mode 100644 new mode 100755 diff --git a/polygon_square.txt b/polygon_square.txt old mode 100644 new mode 100755 diff --git a/square_1split.txt b/square_1split.txt old mode 100644 new mode 100755 diff --git a/square_2split.txt b/square_2split.txt old mode 100644 new mode 100755 diff --git a/voronoi.c b/voronoi.c old mode 100644 new mode 100755 index 12daee2..a6c9356 --- a/voronoi.c +++ b/voronoi.c @@ -14,10 +14,17 @@ #define NUM_FILE_ERROR "Error: Incorrect number of inputs (3 required).\n" #define MALLOC_ERROR "Error: Cannot allocate memory.\n" +#define ARGC_CORRECT_LEN 4 +#define NUM_CSV_FIELDS 6 +#define MAX_FIELD_LEN 128 +#define MAX_CSV_ENTRY_LEN 512 + int main(int argc, char **argv) { + /* Input and output files */ FILE *dataset = NULL, *polygonData = NULL, *output = NULL; checkInputArgs(argc, argv, &dataset, &polygonData, &output); + /* Stores information about the watchtowers given in dataset file */ watchtower_t *watchtowers = (watchtower_t *) malloc(sizeof(watchtower_t)); if (watchtowers == NULL) { fputs(MALLOC_ERROR, stderr); @@ -26,7 +33,7 @@ int main(int argc, char **argv) { readWatchtowers(watchtowers, dataset); - // Cleaning up data + /* Cleaning up data */ free(watchtowers); fclose(dataset); fclose(polygonData); @@ -34,9 +41,10 @@ int main(int argc, char **argv) { return 0; } +/* Checks the validity of the command line input arguments */ void checkInputArgs(int argc, char **argv, FILE **datasetFile, \ -FILE **polygonFile, FILE **outputFile) { - if (argc != 4) { + FILE **polygonFile, FILE **outputFile) { + if (argc != ARGC_CORRECT_LEN) { fputs(NUM_FILE_ERROR, stderr); exit(EXIT_FAILURE); } @@ -60,25 +68,83 @@ FILE **polygonFile, FILE **outputFile) { } } +/* Reads the CSV file and stores the information in the watchtowers array */ void readWatchtowers(watchtower_t *watchtowers, FILE* datasetFile) { - char *lineBuffer; - int lineCount = 0; - size_t lineBufferSize = 512; - size_t numberCharsRead; + /* Maximum length of a single CSV line */ + size_t lineBufferSize = MAX_CSV_ENTRY_LEN; - lineBuffer = (char *) malloc(lineBufferSize * sizeof(char)); + /* Stores the current line from the CSV */ + char *lineBuffer = (char *) malloc(lineBufferSize * sizeof(char)); if (lineBuffer == NULL) { fprintf(stderr, MALLOC_ERROR); exit(EXIT_FAILURE); } - numberCharsRead = getline(&lineBuffer, &lineBufferSize, datasetFile); - while (numberCharsRead > 0) { - lineCount += 1; - printf("line[%06d]: chars=%06zd, buf size=%06zu, contents: %s",\ - lineCount, numberCharsRead, lineBufferSize, lineBuffer); - numberCharsRead = getline(&lineBuffer, &lineBufferSize, datasetFile); + int numWatchtowers = 1; + + /* Discard the header line, then read the rest of the CSV */ + getline(&lineBuffer, &lineBufferSize, datasetFile); + while (getline(&lineBuffer, &lineBufferSize, datasetFile) > 0) { + /* The current tower being filled in with information */ + watchtower_t *currTower = (watchtower_t *) malloc(sizeof(watchtower_t)); + + /* Stores the current CSV field for the current line */ + char *token = strtok(lineBuffer, ","); + size_t tokenLength; + + /* Read the line in to currTower */ + for (int i = 0; i < NUM_CSV_FIELDS; i++) { + tokenLength = strlen(token); + switch(i) { + /* Case 0, 1, and 3 deal with strings in the CSV + * Case 2 deals with an integer + * Case 4 and 5 deal with doubles + * Each case is handled seperately to fill in the + * watchtower with no space wasted. + */ + case 0: + currTower->id = (char *) malloc(sizeof(char) * \ + tokenLength + 1); + strcpy(currTower->id, token); + currTower->id[tokenLength] = '\0'; + break; + case 1: + currTower->postcode = (char *) malloc(sizeof(char) * \ + tokenLength + 1); + strcpy(currTower->postcode, token); + currTower->postcode[tokenLength] = '\0'; + break; + case 3: + currTower->manager = (char *) malloc(sizeof(char) * \ + tokenLength + 1); + strcpy(currTower->manager, token); + currTower->manager[tokenLength] = '\0'; + break; + case 2: + currTower->population = strtol(token, NULL, 10); + break; + case 4: + currTower->x = strtod(token, NULL); + break; + case 5: + currTower->y = strtod(token, NULL); + break; + } + token = strtok(NULL, ","); + } + // printf("ID: %s\nPostcode: %s\nManager: %s\n", \ + // currTower->id, currTower->postcode, currTower->manager); + // printf("Population: %d\nx: %f\ny: %f\n", \ + // currTower->population, currTower->x, currTower->y); + + /* Add currTower to the watchtowers array */ + + + /* Clean up currTower before reading next CSV line */ + free(currTower->id); + free(currTower->manager); + free(currTower->postcode); + free(currTower); } free(lineBuffer); - lineBuffer = NULL; } diff --git a/voronoi.h b/voronoi.h old mode 100644 new mode 100755 index ebee5ca..db6961d --- a/voronoi.h +++ b/voronoi.h @@ -1,4 +1,4 @@ -typedef struct { +typedef struct watchtower { char *id; char *postcode; char *manager; @@ -8,5 +8,5 @@ typedef struct { } watchtower_t; void checkInputArgs(int argc, char **argv, FILE **datasetFile, \ -FILE **polygonFile, FILE **outputFile); -void readWatchtowers(watchtower_t *watchtowers, FILE* datasetFile); + FILE **polygonFile, FILE **outputFile); +void readWatchtowers(watchtower_t *watchtowers, FILE* datasetFile); \ No newline at end of file diff --git a/voronoi1 b/voronoi1 index 0e46e25..d2723d6 100755 Binary files a/voronoi1 and b/voronoi1 differ