1 /*
2 This file is part of CDO. CDO is a collection of Operators to manipulate and analyse Climate model Data.
3
4 Author: Uwe Schulzweida
5
6 */
7
8 #include <cdi.h>
9
10 #include "process_int.h"
11 #include "readline.h"
12 #include "cdo_default_values.h"
13
14 static int
readInstitution(const char * instfile)15 readInstitution(const char *instfile)
16 {
17 char line[1024];
18 int lnr = 0;
19 int nvar = 0, maxvar = 4;
20 char name[1024], longname[1024];
21 int center = CDI_UNDEFID, subcenter = CDI_UNDEFID;
22
23 auto instfp = fopen(instfile, "r");
24 if (instfp == nullptr) return CDI_UNDEFID;
25
26 while (cdo::readline(instfp, line, 1024))
27 {
28 lnr++;
29 if (line[0] == '#') continue;
30 if (nvar == maxvar) break;
31 nvar++;
32
33 char *pline = line;
34 while (isspace((int) *pline)) pline++;
35
36 if (nvar == 1) maxvar = isdigit((int) pline[0]) ? 4 : 2;
37
38 if (nvar == 1 && maxvar == 4) center = atoi(pline);
39
40 if (nvar == 2 && maxvar == 4)
41 {
42 if (!isdigit((int) pline[0])) cdo_abort("wrong format in line %d. Missing subcenter!", lnr);
43
44 subcenter = atoi(pline);
45 }
46
47 if ((nvar == 3 && maxvar == 4) || (nvar == 1 && maxvar == 2)) strcpy(name, pline);
48
49 if ((nvar == 4 && maxvar == 4) || (nvar == 2 && maxvar == 2)) strcpy(longname, pline);
50 }
51
52 fclose(instfp);
53
54 auto instID = institutInq(center, subcenter, name, longname);
55 if (instID == CDI_UNDEFID) instID = institutDef(center, subcenter, name, longname);
56
57 return instID;
58 }
59
60 void
define_institution(const char * instarg)61 define_institution(const char *instarg)
62 {
63 const char *instname = instarg;
64 int instID = readInstitution(instname);
65
66 if (instID == CDI_UNDEFID) instID = institutInq(0, 0, instname, nullptr);
67
68 if (instID == CDI_UNDEFID) cdo_abort("institution <%s> not found", instname);
69
70 CdoDefault::InstID = instID;
71 }
72