1 /*
2  * Copyright 2005-2018 ECMWF.
3  *
4  * This software is licensed under the terms of the Apache Licence Version 2.0
5  * 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 granted to it by
8  * virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
9  */
10 
11 /**************************************
12  *  Enrico Fucile
13  **************************************/
14 
15 
16 #include "grib_api_internal.h"
17 
18 
init_dumpers(grib_dumper_class * c,grib_dumper * d)19 static void init_dumpers(grib_dumper_class* c,grib_dumper* d)
20 {
21   if(c) {
22     grib_dumper_class *s = c->super ? *(c->super) : NULL;
23     if(!c->inited)
24     {
25       if(c->init_class) c->init_class(c);
26       c->inited = 1;
27     }
28     init_dumpers(s,d);
29     if(c->init) c->init(d);
30   }
31 }
32 
grib_init_dumper(grib_dumper * d)33 void grib_init_dumper(grib_dumper* d)
34 {
35   init_dumpers(d->cclass,d);
36 }
37 
grib_dumper_delete(grib_dumper * d)38 void grib_dumper_delete(grib_dumper* d)
39 {
40   grib_dumper_class *c = d->cclass;
41   grib_context *ctx = d->handle->context;
42   while(c)
43   {
44     grib_dumper_class *s = c->super ? *(c->super) : NULL;
45     if(c->destroy) c->destroy(d);
46     c = s;
47   }
48   grib_context_free(ctx,d);
49 }
50 
51 
grib_dump_long(grib_dumper * d,grib_accessor * a,const char * comment)52 void  grib_dump_long(grib_dumper* d, grib_accessor* a, const char* comment)
53 {
54   grib_dumper_class *c = d->cclass;
55   while(c)
56   {
57     if(c->dump_long)
58     {
59       c->dump_long(d, a, comment);
60       return;
61     }
62     c = c->super ? *(c->super) : NULL;
63   }
64   Assert(0);
65 }
66 
grib_dump_double(grib_dumper * d,grib_accessor * a,const char * comment)67 void  grib_dump_double(grib_dumper* d,grib_accessor* a,const char* comment)
68 {
69   grib_dumper_class *c = d->cclass;
70   while(c)
71   {
72     if(c->dump_double)
73     {
74       c->dump_double(d, a, comment);
75       return;
76     }
77     c = c->super ? *(c->super) : NULL;
78   }
79   Assert(0);
80 }
81 
grib_dump_string(grib_dumper * d,grib_accessor * a,const char * comment)82 void  grib_dump_string(grib_dumper* d,grib_accessor* a,const char* comment)
83 {
84   grib_dumper_class *c = d->cclass;
85   while(c)
86   {
87     if(c->dump_string)
88     {
89       c->dump_string(d, a, comment);
90       return;
91     }
92     c = c->super ? *(c->super) : NULL;
93   }
94   Assert(0);
95 }
96 
grib_dump_label(grib_dumper * d,grib_accessor * a,const char * comment)97 void  grib_dump_label(grib_dumper* d,grib_accessor* a,const char* comment)
98 {
99   grib_dumper_class *c = d->cclass;
100   while(c)
101   {
102     if(c->dump_label)
103     {
104       c->dump_label(d, a, comment);
105       return;
106     }
107     c = c->super ? *(c->super) : NULL;
108   }
109   Assert(0);
110 }
111 
grib_dump_bytes(grib_dumper * d,grib_accessor * a,const char * comment)112 void  grib_dump_bytes(grib_dumper* d,grib_accessor* a,const char* comment)
113 {
114   grib_dumper_class *c = d->cclass;
115   while(c)
116   {
117     if(c->dump_bytes)
118     {
119       c->dump_bytes(d, a, comment);
120       return;
121     }
122     c = c->super ? *(c->super) : NULL;
123   }
124   Assert(0);
125 }
126 
grib_dump_bits(grib_dumper * d,grib_accessor * a,const char * comment)127 void  grib_dump_bits(grib_dumper* d,grib_accessor* a,const char* comment)
128 {
129   grib_dumper_class *c = d->cclass;
130   while(c)
131   {
132     if(c->dump_bits)
133     {
134       c->dump_bits(d, a, comment);
135       return;
136     }
137     c = c->super ? *(c->super) : NULL;
138   }
139   Assert(0);
140 }
141 
142 
grib_dump_section(grib_dumper * d,grib_accessor * a,grib_block_of_accessors * block)143 void  grib_dump_section(grib_dumper* d,grib_accessor* a,grib_block_of_accessors* block)
144 {
145   grib_dumper_class *c = d->cclass;
146   while(c)
147   {
148     if(c->dump_section)
149     {
150       c->dump_section(d, a, block);
151       return;
152     }
153     c = c->super ? *(c->super) : NULL;
154   }
155   Assert(0);
156 }
157 
grib_dump_values(grib_dumper * d,grib_accessor * a)158 void  grib_dump_values(grib_dumper* d,grib_accessor* a)
159 {
160   grib_dumper_class *c = d->cclass;
161   while(c)
162   {
163     if(c->dump_values)
164     {
165       c->dump_values(d, a);
166       return;
167     }
168     c = c->super ? *(c->super) : NULL;
169   }
170   Assert(0);
171 }
172 
grib_dump_header(grib_dumper * d,grib_handle * h)173 void  grib_dump_header(grib_dumper* d,grib_handle* h)
174 {
175   grib_dumper_class *c = d->cclass;
176   while(c)
177   {
178     if(c->header)
179     {
180       c->header(d,h);
181       return;
182     }
183     c = c->super ? *(c->super) : NULL;
184   }
185 }
186 
grib_dump_footer(grib_dumper * d,grib_handle * h)187 void  grib_dump_footer(grib_dumper* d,grib_handle* h)
188 {
189   grib_dumper_class *c = d->cclass;
190   while(c)
191   {
192     if(c->footer)
193     {
194       c->footer(d,h);
195       return;
196     }
197     c = c->super ? *(c->super) : NULL;
198   }
199 }
200