-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
53444de
commit 99c9eeb
Showing
8 changed files
with
7,124 additions
and
17 deletions.
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,258 @@ | ||
/** @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() | ||
{ | ||
size_t max_line_size = 500; | ||
const int num_columns = 9; | ||
int i,j; | ||
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); | ||
j = 1; | ||
while((fgets(line,max_line_size,doc)) != NULL && j < 2) | ||
{ | ||
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; | ||
} | ||
} | ||
|
||
free(key); | ||
i++; | ||
} | ||
|
||
j++; | ||
} | ||
|
||
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
/* This is a test for the NCEPLIBS-g2c project. This test is for | ||
* g2ccsv.c. | ||
* | ||
* Ed Hartnett, Alyson Stahl 8/5/24 | ||
*/ | ||
|
||
#include <stdio.h> | ||
#include <stdlib.h> | ||
#include "grib2_int.h" | ||
|
||
int | ||
main() | ||
{ | ||
int ret; | ||
char desc[G2C_MAX_GRIB_DESC_LEN + 1]; | ||
|
||
printf("Testing CSV ingestion...\n"); | ||
if (g2c_csv_init()) | ||
return G2C_ERROR; | ||
|
||
printf("SUCCESS!!!\n"); | ||
return G2C_NOERROR; | ||
} | ||
|