-
Notifications
You must be signed in to change notification settings - Fork 11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Switch from XML to CSV #500
Merged
Merged
Changes from 3 commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
99c9eeb
committing progress on working code
AlysonStahl-NOAA cca3294
Update g2ccsv.c
AlysonStahl-NOAA 0d24850
complete function + add test
AlysonStahl-NOAA bce0d0f
updating some comments and documentation
AlysonStahl-NOAA cab04ef
fixed test
AlysonStahl-NOAA ad95562
debug tab warning
AlysonStahl-NOAA 4d14632
updating references to g2c_xml_init()
AlysonStahl-NOAA fa90033
removed commented out lines
AlysonStahl-NOAA File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,319 @@ | ||
/** @file | ||
* | ||
* @brief This file reads the GRIB2 CSV files. | ||
* @author Ed Hartnett @date 8/25/22 | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include <string.h> | ||
#include <grib2_int.h> | ||
|
||
/** Contains the parsed CSV document. */ | ||
FILE* doc; | ||
|
||
/** Pointer to the list of code tables. */ | ||
G2C_CODE_TABLE_T *g2c_table = NULL; | ||
|
||
/** Print the table data. | ||
* | ||
* @author Ed Hartnett @date 8/28/22 | ||
*/ | ||
void | ||
g2c_print_tables() | ||
{ | ||
G2C_CODE_TABLE_T *t; | ||
|
||
for (t = g2c_table; t; t = t->next) | ||
{ | ||
G2C_CODE_ENTRY_T *e; | ||
|
||
printf("%s\n", t->title); | ||
for (e = t->entry; e; e = e->next) | ||
printf("code %s desc %s status %s\n", e->code, e->desc, e->status); | ||
|
||
} | ||
} | ||
|
||
/** Free table memory. | ||
* | ||
* @author Ed Hartnett @date 8/28/22 | ||
*/ | ||
void | ||
g2c_free_tables() | ||
{ | ||
G2C_CODE_TABLE_T *t, *the_next = NULL; | ||
|
||
/* If g2c_table is NULL, then tables have already been | ||
* freed. */ | ||
if (!g2c_table) | ||
return; | ||
|
||
/* Free each table. */ | ||
for (t = g2c_table; t; t = the_next) | ||
{ | ||
G2C_CODE_ENTRY_T *e; | ||
G2C_CODE_ENTRY_T *e_next; | ||
|
||
/* Free each entry in the table. */ | ||
the_next = t->next; | ||
for (e = t->entry; e; e = e_next) | ||
{ | ||
e_next = e->next; | ||
free(e); | ||
} | ||
|
||
free(t); | ||
} | ||
|
||
/* Set to NULL so we all know g2c_table has been freed. */ | ||
g2c_table = NULL; | ||
} | ||
|
||
/** Given a table title and a code, find a description. | ||
* | ||
* @param title Title of table. | ||
* @param code Code to search for. | ||
* @param desc Pointer that gets a copy of the description. Must be | ||
* allocated to ::G2C_MAX_GRIB_DESC_LEN + 1. | ||
* | ||
* @author Ed Hartnett @date 8/28/22 | ||
* | ||
* @return 0 for success, error code otherwise. | ||
*/ | ||
int | ||
g2c_find_desc_str(char *title, char *code, char *desc) | ||
{ | ||
G2C_CODE_TABLE_T *t = NULL; | ||
int found = 0; | ||
|
||
/* Check inputs. */ | ||
if (!title || strlen(title) > G2C_MAX_GRIB_TITLE_LEN | ||
|| !code || strlen(code) > G2C_MAX_GRIB_CODE_LEN || !desc) | ||
return G2C_EINVAL; | ||
|
||
/* Find table. */ | ||
for (t = g2c_table; !found && t; t = t->next) | ||
{ | ||
if (!strncmp(title, t->title, strlen(title))) | ||
{ | ||
G2C_CODE_ENTRY_T *e = NULL; | ||
|
||
/* Find entry. */ | ||
for (e = t->entry; e; e = e->next) | ||
{ | ||
if (!strncmp(code, e->code, strlen(code))) | ||
{ | ||
strcpy(desc, e->desc); | ||
found++; | ||
break; | ||
} | ||
} | ||
} | ||
} | ||
|
||
if (!found) | ||
return G2C_ENOTFOUND; | ||
|
||
return G2C_NOERROR; | ||
} | ||
|
||
/** Given a table title and an integer code, find a description. | ||
* | ||
* @param title Title of table. | ||
* @param code Code to search for as an int. | ||
* @param desc Pointer that gets a copy of the description. Must be | ||
* allocated to ::G2C_MAX_GRIB_DESC_LEN + 1. | ||
* | ||
* @author Ed Hartnett @date 8/28/22 | ||
* | ||
* @return 0 for success, error code otherwise. | ||
*/ | ||
int | ||
g2c_find_desc(char *title, int code, char *desc) | ||
{ | ||
char str_code[G2C_MAX_GRIB_CODE_LEN + 1]; | ||
|
||
sprintf(str_code, "%d", code); | ||
return g2c_find_desc_str(title, str_code, desc); | ||
} | ||
|
||
/** Find a table given a key. | ||
* | ||
* @param key The table title to find. | ||
* | ||
* @author Ed Hartnett @date 8/28/22 | ||
* | ||
* @return a pointer to the matching code table, or NULL if not found. | ||
*/ | ||
G2C_CODE_TABLE_T * | ||
g2c_find_table(char *key) | ||
{ | ||
G2C_CODE_TABLE_T *g; | ||
|
||
for (g = g2c_table; g; g = g->next) | ||
if (!strncmp(key, g->title, G2C_MAX_GRIB_TITLE_LEN)) | ||
return g; | ||
|
||
return NULL; | ||
} | ||
|
||
/** Find an entry in a table given a description. | ||
* | ||
* @param desc The description of the entry to find. | ||
* @param table A pointer to the table to search. | ||
* | ||
* @author Ed Hartnett @date 8/29/22 | ||
* | ||
* @return a pointer to the matching entry, or NULL if not found. | ||
*/ | ||
G2C_CODE_ENTRY_T * | ||
g2c_find_entry(char *desc, G2C_CODE_TABLE_T *table) | ||
{ | ||
G2C_CODE_ENTRY_T *e; | ||
|
||
for (e = table->entry; e; e = e->next) | ||
if (!strncmp(desc, e->desc, G2C_MAX_GRIB_DESC_LEN)) | ||
return e; | ||
|
||
return NULL; | ||
} | ||
|
||
/** | ||
* Init. | ||
* | ||
* @return | ||
* - ::G2C_NOERROR No error. | ||
* | ||
* @author Alyson Stahl @date 8/2/24 | ||
*/ | ||
int | ||
g2c_csv_init() | ||
{ | ||
const int max_line_size = 500; | ||
const int num_columns = 9; | ||
int i; | ||
char *buf, *tmp, *key; | ||
char line[max_line_size]; | ||
G2C_CODE_TABLE_T *my_table = NULL; | ||
G2C_CODE_ENTRY_T *new_entry = NULL; | ||
|
||
/* If g2c_table is not NULL, then tables have already been | ||
* initialized. */ | ||
if (g2c_table) | ||
return G2C_NOERROR; | ||
|
||
/* Ingest the CSV document. */ | ||
if (!(doc = fopen("CodeFlag.txt", "r"))) | ||
return G2C_ECSV; | ||
|
||
/* Skip header line */ | ||
fgets(line,max_line_size,doc); | ||
|
||
while((fgets(line,max_line_size,doc)) != NULL) | ||
{ | ||
buf = strdup(line); | ||
i = 0; | ||
while(buf != NULL && i < num_columns) | ||
{ | ||
G2C_CODE_TABLE_T *new_table = NULL; | ||
|
||
if (*buf == '\"') | ||
{ | ||
tmp = strsep(&buf,"\""); | ||
tmp = strsep(&buf,"\""); | ||
key = strdup((const char*)tmp); | ||
tmp = strsep(&buf,","); | ||
} | ||
else | ||
{ | ||
tmp = strsep(&buf,","); | ||
key = strdup((const char*)tmp); | ||
} | ||
|
||
if (i==0) | ||
{ | ||
if (strlen(key) > G2C_MAX_GRIB_TITLE_LEN) | ||
return G2C_ENAMETOOLONG; | ||
if (!(my_table = g2c_find_table(key))) | ||
{ | ||
if (!(new_table = calloc(1,sizeof(G2C_CODE_TABLE_T)))) | ||
return G2C_ENOMEM; | ||
strncpy(new_table->title, key,G2C_MAX_GRIB_TITLE_LEN); | ||
my_table = new_table; | ||
} | ||
} | ||
|
||
if (my_table) | ||
{ | ||
if (i==2) | ||
{ | ||
G2C_CODE_ENTRY_T *e; | ||
|
||
if (!(new_entry = calloc(1,sizeof(G2C_CODE_ENTRY_T)))) | ||
return G2C_ENOMEM; | ||
if (strlen(key) > G2C_MAX_GRIB_CODE_LEN) | ||
return G2C_ENAMETOOLONG; | ||
strncpy(new_entry->code,key,G2C_MAX_GRIB_CODE_LEN); | ||
|
||
/* Add entry at end of list. */ | ||
if (my_table->entry) | ||
{ | ||
for (e = my_table->entry; e->next; e = e->next); | ||
e->next = new_entry; | ||
} | ||
else | ||
my_table->entry = new_entry; | ||
} | ||
if (i==4) | ||
{ | ||
if (strlen(key) > G2C_MAX_GRIB_DESC_LEN) | ||
return G2C_ENAMETOOLONG; | ||
if (!new_entry) | ||
return G2C_ECSV; | ||
strncpy(new_entry->desc,key,G2C_MAX_GRIB_LEVEL_DESC_LEN); | ||
} | ||
if (i==8) | ||
{ | ||
if (strlen(key) > G2C_MAX_GRIB_STATUS_LEN) | ||
return G2C_ENAMETOOLONG; | ||
if (!new_entry) | ||
return G2C_ECSV; | ||
strncpy(new_entry->status,key,G2C_MAX_GRIB_STATUS_LEN); | ||
} | ||
} | ||
|
||
/* Add this table to our list of GRIB tables. */ | ||
if (new_table) | ||
{ | ||
if (!g2c_table) | ||
g2c_table = new_table; | ||
else | ||
{ | ||
G2C_CODE_TABLE_T *g = g2c_table; | ||
|
||
/* Go to end of list and add the table. */ | ||
if (g) | ||
{ | ||
for (; g->next; g = g->next) | ||
; | ||
g->next = new_table; | ||
} | ||
else | ||
{ | ||
g2c_table = new_table; | ||
} | ||
} | ||
new_table = NULL; | ||
} | ||
|
||
free(key); | ||
i++; | ||
} | ||
} | ||
|
||
fclose(doc); | ||
|
||
return G2C_NOERROR; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
More documentation please.