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