1 /**
2 * Copyright 1981-2016 ECMWF.
3 *
4 * This software is licensed under the terms of the Apache Licence
5 * Version 2.0 which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
6 *
7 * In applying this licence, ECMWF does not waive the privileges and immunities
8 * granted to it by virtue of its status as an intergovernmental organisation
9 * nor does it submit to any jurisdiction.
10 */
11
12 #include <stdio.h>
13 #include <string.h>
14 #include "getValues.h"
15
16 #ifdef FORTRAN_NO_UNDERSCORE
17 #define GETINT getint
18 #define GETREAL getreal
19 #else
20 #define GETINT getint_
21 #define GETREAL getreal_
22 #endif
23
getIntegerValue(gribProduct ** grib,unsigned char * request)24 fortint getIntegerValue(
25 gribProduct** grib,
26 unsigned char* request ){
27
28 return GETINT(grib,request,strlen(request));
29 }
30
copyName(unsigned char * copy,unsigned char * original,int copyLength,int originalLength)31 void copyName(
32 unsigned char* copy,
33 unsigned char* original,
34 int copyLength,
35 int originalLength) {
36 int length;
37 char *p;
38
39 length = (originalLength>copyLength)?copyLength:originalLength;
40 memcpy(copy,original,length);
41 copy[length] = '\0';
42
43 p = copy + length - 1;
44 while( *p == ' ' ) *(p--) = '\0';
45
46 return;
47 }
48
GETINT(gribProduct ** grib,unsigned char * request,long requestLength)49 fortint GETINT(
50 gribProduct** grib,
51 unsigned char* request,
52 long requestLength ) {
53 int index;
54 int listLength = sizeof(despatchInteger)/sizeof(despatchI);
55 unsigned char Request[80];
56
57 copyName(Request,request,(int)sizeof(Request),(int)requestLength);
58
59 index = binaryChopI(despatchInteger,listLength,Request);
60 if( index < 0 )
61 return -999999;
62 else {
63 return despatchInteger[index].get(grib);
64 }
65 }
66
getRealValue(gribProduct ** grib,unsigned char * request)67 fortdouble getRealValue(
68 gribProduct** grib,
69 unsigned char* request ) {
70
71 return GETREAL(grib,request,strlen(request));
72 }
73
GETREAL(gribProduct ** grib,unsigned char * request,long requestLength)74 fortdouble GETREAL(
75 gribProduct** grib,
76 unsigned char* request,
77 long requestLength ) {
78 int index;
79 int listLength = sizeof(despatchReal)/sizeof(despatchR);
80 char Request[80];
81
82 copyName(Request,request,(int)sizeof(Request),(int)requestLength);
83
84 index = binaryChopR(despatchReal,listLength,Request);
85 if( index < 0 )
86 return -999999.0;
87 else {
88 return despatchReal[index].get(grib);
89 }
90 }
91
IGNWLAT(gribProduct ** grib)92 fortint IGNWLAT(gribProduct** grib) {
93 fortdouble value = GNWLAT(grib);
94
95 if( value != -999999.0 )
96 return (fortint)(1000.0 * value);
97 else
98 return -999999;
99 }
100
IGNWLON(gribProduct ** grib)101 fortint IGNWLON(gribProduct** grib) {
102 fortdouble value = GNWLON(grib);
103
104 if( value != -999999.0 )
105 return (fortint)(1000.0 * value);
106 else
107 return -999999;
108 }
109
IGSELAT(gribProduct ** grib)110 fortint IGSELAT(gribProduct** grib) {
111 fortdouble value = GSELAT(grib);
112
113 if( value != -999999.0 )
114 return (fortint)(1000.0 * value);
115 else
116 return -999999;
117 }
118
IGSELON(gribProduct ** grib)119 fortint IGSELON(gribProduct** grib) {
120 fortdouble value = GSELON(grib);
121
122 if( value != -999999.0 )
123 return (fortint)(1000.0 * value);
124 else
125 return -999999;
126 }
127
IGDI(gribProduct ** grib)128 fortint IGDI(gribProduct** grib) {
129 fortdouble value = GDI(grib);
130
131 if( value != -999999.0 )
132 return (fortint)(1000.0 * value);
133 else
134 return -999999;
135 }
136
IGDJ(gribProduct ** grib)137 fortint IGDJ(gribProduct** grib) {
138 fortdouble value = GDJ(grib);
139
140 if( value != -999999.0 )
141 return (fortint)(1000.0 * value);
142 else
143 return -999999;
144 }
145
IGIP(gribProduct ** grib)146 fortint IGIP(gribProduct** grib) {
147 fortdouble value = GIP(grib);
148
149 if( value != -999999.0 )
150 return (fortint)(1000.0 * value);
151 else
152 return -999999;
153 }
154
IGLATRPL(gribProduct ** grib)155 fortint IGLATRPL(gribProduct** grib) {
156 fortdouble value = GLATRPL(grib);
157
158 if( value != -999999.0 )
159 return (fortint)(1000.0 * value);
160 else
161 return -999999;
162 }
163
IGLONRPL(gribProduct ** grib)164 fortint IGLONRPL(gribProduct** grib) {
165 fortdouble value = GLONRPL(grib);
166
167 if( value != -999999.0 )
168 return (fortint)(1000.0 * value);
169 else
170 return -999999;
171 }
172
IGROTATN(gribProduct ** grib)173 fortint IGROTATN(gribProduct** grib) {
174 fortdouble value = GROTATN(grib);
175
176 if( value != -999999.0 )
177 return (fortint)(1000.0 * value);
178 else
179 return -999999;
180 }
181
IGLATSPL(gribProduct ** grib)182 fortint IGLATSPL(gribProduct** grib) {
183 fortdouble value = GLATSPL(grib);
184
185 if( value != -999999.0 )
186 return (fortint)(1000.0 * value);
187 else
188 return -999999;
189 }
190
IGLONSPL(gribProduct ** grib)191 fortint IGLONSPL(gribProduct** grib) {
192 fortdouble value = GLONSPL(grib);
193
194 if( value != -999999.0 )
195 return (fortint)(1000.0 * value);
196 else
197 return -999999;
198 }
199
IGSFACTR(gribProduct ** grib)200 fortint IGSFACTR(gribProduct** grib) {
201 fortdouble value = GSFACTR(grib);
202
203 if( value != -999999.0 )
204 return (fortint)(1000000.0 * value);
205 else
206 return -999999;
207 }
208
IGREFVAL(gribProduct ** grib)209 fortint IGREFVAL(gribProduct** grib) {
210 return (fortint)(1000000.0 * GREFVAL(grib));
211 }
212
IGDSCALE(gribProduct ** grib)213 fortint IGDSCALE(gribProduct** grib) {
214 return (fortint)(1000000.0 * GDSCALE(grib));
215 }
216
RGLENGTH(gribProduct ** grib)217 fortdouble RGLENGTH(gribProduct** grib) {
218 return (fortdouble) GLENGTH(grib);
219 }
220
RGTABLE(gribProduct ** grib)221 fortdouble RGTABLE(gribProduct** grib) {
222 return (fortdouble) GTABLE(grib);
223 }
224
RGCENTRE(gribProduct ** grib)225 fortdouble RGCENTRE(gribProduct** grib) {
226 return (fortdouble) GCENTRE(grib);
227 }
228
RGPARAM(gribProduct ** grib)229 fortdouble RGPARAM(gribProduct** grib) {
230 return (fortdouble) GPARAM(grib);
231 }
232
RGLEVEL(gribProduct ** grib)233 fortdouble RGLEVEL(gribProduct** grib) {
234 return (fortdouble) GLEVEL(grib);
235 }
236
RGLEVEL1(gribProduct ** grib)237 fortdouble RGLEVEL1(gribProduct** grib) {
238 return (fortdouble) GLEVEL1(grib);
239 }
240
RGLEVEL2(gribProduct ** grib)241 fortdouble RGLEVEL2(gribProduct** grib) {
242 return (fortdouble) GLEVEL2(grib);
243 }
244
RGDATE(gribProduct ** grib)245 fortdouble RGDATE(gribProduct** grib) {
246 return (fortdouble) GDATE(grib);
247 }
248
RGTIME(gribProduct ** grib)249 fortdouble RGTIME(gribProduct** grib) {
250 return (fortdouble) GTIME(grib);
251 }
252
RGSTEP(gribProduct ** grib)253 fortdouble RGSTEP(gribProduct** grib) {
254 return (fortdouble) GSTEP(grib);
255 }
256
RGDEFIN(gribProduct ** grib)257 fortdouble RGDEFIN(gribProduct** grib) {
258 return (fortdouble) GDEFIN(grib);
259 }
260
RGCLASS(gribProduct ** grib)261 fortdouble RGCLASS(gribProduct** grib) {
262 return (fortdouble) GCLASS(grib);
263 }
264
RGTYPE(gribProduct ** grib)265 fortdouble RGTYPE(gribProduct** grib) {
266 return (fortdouble) GTYPE(grib);
267 }
268
RGSTREAM(gribProduct ** grib)269 fortdouble RGSTREAM(gribProduct** grib) {
270 return (fortdouble) GSTREAM(grib);
271 }
272
RGEXPVER(gribProduct ** grib)273 fortdouble RGEXPVER(gribProduct** grib) {
274 return (fortdouble) GEXPVER(grib);
275 }
276
RGNUMPV(gribProduct ** grib)277 fortdouble RGNUMPV(gribProduct** grib) {
278 return (fortdouble) GNUMPV(grib);
279 }
280
RGREPRES(gribProduct ** grib)281 fortdouble RGREPRES(gribProduct** grib) {
282 return (fortdouble) GREPRES(grib);
283 }
284
RGNI(gribProduct ** grib)285 fortdouble RGNI(gribProduct** grib) {
286 return (fortdouble) GNI(grib);
287 }
288
RGNJ(gribProduct ** grib)289 fortdouble RGNJ(gribProduct** grib) {
290 return (fortdouble) GNJ(grib);
291 }
292
RGRESCOM(gribProduct ** grib)293 fortdouble RGRESCOM(gribProduct** grib) {
294 return (fortdouble) GRESCOM(grib);
295 }
296
RGNUMBER(gribProduct ** grib)297 fortdouble RGNUMBER(gribProduct** grib) {
298 return (fortdouble) GNUMBER(grib);
299 }
300
RGSCAN(gribProduct ** grib)301 fortdouble RGSCAN(gribProduct** grib) {
302 return (fortdouble) GSCAN(grib);
303 }
304
RGJ(gribProduct ** grib)305 fortdouble RGJ(gribProduct** grib) {
306 return (fortdouble) GJ(grib);
307 }
308
RGK(gribProduct ** grib)309 fortdouble RGK(gribProduct** grib) {
310 return (fortdouble) GK(grib);
311 }
312
RGM(gribProduct ** grib)313 fortdouble RGM(gribProduct** grib) {
314 return (fortdouble) GM(grib);
315 }
316
RGREPMOD(gribProduct ** grib)317 fortdouble RGREPMOD(gribProduct** grib) {
318 return (fortdouble) GREPMOD(grib);
319 }
320
RGTJ(gribProduct ** grib)321 fortdouble RGTJ(gribProduct** grib) {
322 return (fortdouble) GTJ(grib);
323 }
324
RGTK(gribProduct ** grib)325 fortdouble RGTK(gribProduct** grib) {
326 return (fortdouble) GTK(grib);
327 }
328
RGTM(gribProduct ** grib)329 fortdouble RGTM(gribProduct** grib) {
330 return (fortdouble) GTM(grib);
331 }
332
RGBITSPV(gribProduct ** grib)333 fortdouble RGBITSPV(gribProduct** grib) {
334 return (fortdouble) GBITSPV(grib);
335 }
336
RGUNUSED(gribProduct ** grib)337 fortdouble RGUNUSED(gribProduct** grib) {
338 return (fortdouble) GUNUSED(grib);
339 }
340
RGNVALUE(gribProduct ** grib)341 fortdouble RGNVALUE(gribProduct** grib) {
342 return (fortdouble) GNVALUE(grib);
343 }
344
binaryChopI(despatchI * list,int listLength,unsigned char * test)345 int binaryChopI(despatchI * list, int listLength, unsigned char * test) {
346 int current, oldCurrent = -1;
347 int direction, startRange = 0, endRange = listLength;
348
349 do {
350 current = (startRange + endRange)/2;
351
352 if( current == oldCurrent) break;
353
354 direction = strcmp(test,(*(list+current)).name);
355
356 if( direction == 0 ) return current;
357
358 if( direction < 0 )
359 endRange = current;
360 else
361 startRange = current;
362
363 oldCurrent = current;
364 } while( startRange <= endRange );
365
366 return -1;
367 }
368
binaryChopR(despatchR * list,int listLength,unsigned char * test)369 int binaryChopR(despatchR * list, int listLength, unsigned char * test) {
370 int current, oldCurrent = -1;
371 int direction, startRange = 0, endRange = listLength;
372
373 do {
374 current = (startRange + endRange)/2;
375
376 if( current == oldCurrent) break;
377
378 direction = strcmp(test,(*(list+current)).name);
379
380 if( direction == 0 ) return current;
381
382 if( direction < 0 )
383 endRange = current;
384 else
385 startRange = current;
386
387 oldCurrent = current;
388 } while( startRange <= endRange );
389
390 return -1;
391 }
392