source: lmdz_wrf/trunk/WRFV3/external/io_grib1/WGRIB/gribtable.c @ 14

Last change on this file since 14 was 1, checked in by lfita, 10 years ago
  • -- --- Opening of the WRF+LMDZ coupling repository --- -- -

WRF: version v3.3
LMDZ: version v1818

More details in:

File size: 3.4 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <stddef.h>
4#include <string.h>
5#include "cnames.h"
6
7#define START -1
8
9static int user_center = 0, user_subcenter = 0, user_ptable = 0;
10static enum {filled, not_found, not_checked, no_file, init} status = init;
11
12struct ParmTable parm_table_user[256];
13
14/*
15 * sets up user parameter table
16 */
17
18int setup_user_table(int center, int subcenter, int ptable) {
19
20    int i, j, c0, c1, c2;
21    static FILE *input;
22    static int file_open = 0;
23    char *filename, line[300];
24
25    if (status == init) {
26        for (i = 0; i < 256; i++) {
27            parm_table_user[i].name = parm_table_user[i].comment = NULL;
28        }
29        status = not_checked;
30    }
31
32    if (status == no_file) return 0;
33
34    if ((user_center == -1 || center == user_center) &&
35            (user_subcenter == -1 || subcenter == user_subcenter) &&
36            (user_ptable == -1 || ptable == user_ptable)) {
37
38        if (status == filled) return 1;
39        if (status == not_found) return 0;
40    }
41
42    /* open gribtab file if not open */
43
44    if (!file_open) {
45        filename = getenv("GRIBTAB");
46        if (filename == NULL) filename = getenv("gribtab");
47        if (filename == NULL) filename = "gribtab";
48
49        if ((input = fopen(filename,"r")) == NULL) {
50            status = no_file;
51            return 0;
52        }
53        file_open = 1;
54    }
55    else {
56        rewind(input);
57    }
58
59    user_center = center;
60    user_subcenter = subcenter;
61    user_ptable = ptable;
62
63    /* scan for center & subcenter and ptable */
64    for (;;) {
65        if (fgets(line, 299, input) == NULL) {
66            status = not_found;
67            return 0;
68        }
69        if (atoi(line) != START) continue;
70        i = sscanf(line,"%d:%d:%d:%d", &j, &center, &subcenter, &ptable);
71        if (i != 4) {
72            fprintf(stderr,"illegal gribtab center/subcenter/ptable line: %s\n", line);
73            continue;
74        }
75        if ((center == -1 || center == user_center) &&
76            (subcenter == -1 || subcenter == user_subcenter) &&
77            (ptable == -1 || ptable == user_ptable)) break;
78    }
79
80    user_center = center;
81    user_subcenter = subcenter;
82    user_ptable = ptable;
83
84    /* free any used memory */
85    if (parm_table_user[i].name != NULL) {
86        for (i = 0; i < 256; i++) {
87            free(parm_table_user[i].name);
88            free(parm_table_user[i].comment);
89        }
90    }
91
92    /* read definitions */
93
94    for (;;) {
95        if (fgets(line, 299, input) == NULL) break;
96        if ((i = atoi(line)) == START) break;
97        line[299] = 0;
98
99        /* find the colons and end-of-line */
100        for (c0 = 0; line[c0] != ':' && line[c0] != 0; c0++) ;
101        /* skip blank lines */
102        if (line[c0] == 0) continue;
103
104        for (c1 = c0 + 1; line[c1] != ':' && line[c1] != 0; c1++) ;
105        c2 = strlen(line);
106        if (line[c2-1] == '\n') line[--c2] = '\0';
107        if (c2 <= c1) {
108            fprintf(stderr,"illegal gribtab line:%s\n", line);
109            continue;
110        }
111        line[c0] = 0;
112        line[c1] = 0;
113
114        parm_table_user[i].name = (char *) malloc(c1 - c0);
115        parm_table_user[i].comment = (char *) malloc(c2 - c1);
116        strcpy(parm_table_user[i].name, line+c0+1);
117        strcpy(parm_table_user[i].comment, line+c1+1);
118    }
119
120    /* now to fill in undefined blanks */
121    for (i = 0; i < 255; i++) {
122        if (parm_table_user[i].name == NULL) {
123            parm_table_user[i].name = (char *) malloc(7);
124            sprintf(parm_table_user[i].name, "var%d", i);
125            parm_table_user[i].comment = (char *) malloc(strlen("undefined")+1);
126            strcpy(parm_table_user[i].comment, "undefined");
127        }
128    }
129    status = filled;
130    return 1;
131}
Note: See TracBrowser for help on using the repository browser.