#include #include #include #include #include "cnames.h" #define START -1 static int user_center = 0, user_subcenter = 0, user_ptable = 0; static enum {filled, not_found, not_checked, no_file, init} status = init; struct ParmTable parm_table_user[256]; /* * sets up user parameter table */ int setup_user_table(int center, int subcenter, int ptable) { int i, j, c0, c1, c2; static FILE *input; static int file_open = 0; char *filename, line[300]; if (status == init) { for (i = 0; i < 256; i++) { parm_table_user[i].name = parm_table_user[i].comment = NULL; } status = not_checked; } if (status == no_file) return 0; if ((user_center == -1 || center == user_center) && (user_subcenter == -1 || subcenter == user_subcenter) && (user_ptable == -1 || ptable == user_ptable)) { if (status == filled) return 1; if (status == not_found) return 0; } /* open gribtab file if not open */ if (!file_open) { filename = getenv("GRIBTAB"); if (filename == NULL) filename = getenv("gribtab"); if (filename == NULL) filename = "gribtab"; if ((input = fopen(filename,"r")) == NULL) { status = no_file; return 0; } file_open = 1; } else { rewind(input); } user_center = center; user_subcenter = subcenter; user_ptable = ptable; /* scan for center & subcenter and ptable */ for (;;) { if (fgets(line, 299, input) == NULL) { status = not_found; return 0; } if (atoi(line) != START) continue; i = sscanf(line,"%d:%d:%d:%d", &j, ¢er, &subcenter, &ptable); if (i != 4) { fprintf(stderr,"illegal gribtab center/subcenter/ptable line: %s\n", line); continue; } if ((center == -1 || center == user_center) && (subcenter == -1 || subcenter == user_subcenter) && (ptable == -1 || ptable == user_ptable)) break; } user_center = center; user_subcenter = subcenter; user_ptable = ptable; /* free any used memory */ if (parm_table_user[i].name != NULL) { for (i = 0; i < 256; i++) { free(parm_table_user[i].name); free(parm_table_user[i].comment); } } /* read definitions */ for (;;) { if (fgets(line, 299, input) == NULL) break; if ((i = atoi(line)) == START) break; line[299] = 0; /* find the colons and end-of-line */ for (c0 = 0; line[c0] != ':' && line[c0] != 0; c0++) ; /* skip blank lines */ if (line[c0] == 0) continue; for (c1 = c0 + 1; line[c1] != ':' && line[c1] != 0; c1++) ; c2 = strlen(line); if (line[c2-1] == '\n') line[--c2] = '\0'; if (c2 <= c1) { fprintf(stderr,"illegal gribtab line:%s\n", line); continue; } line[c0] = 0; line[c1] = 0; parm_table_user[i].name = (char *) malloc(c1 - c0); parm_table_user[i].comment = (char *) malloc(c2 - c1); strcpy(parm_table_user[i].name, line+c0+1); strcpy(parm_table_user[i].comment, line+c1+1); } /* now to fill in undefined blanks */ for (i = 0; i < 255; i++) { if (parm_table_user[i].name == NULL) { parm_table_user[i].name = (char *) malloc(7); sprintf(parm_table_user[i].name, "var%d", i); parm_table_user[i].comment = (char *) malloc(strlen("undefined")+1); strcpy(parm_table_user[i].comment, "undefined"); } } status = filled; return 1; }