37 #include "config_ff.h"
48 #include <InternalErr.h>
50 #include "FreeFormCPP.h"
51 #include "FFRequestHandler.h"
56 #define ATTR_STRING_QUOTE_FIX
60 static void header_to_attributes(AttrTable *at,
DATA_BIN_PTR dbin)
67 int error = db_ask(dbin, DBASK_PROCESS_INFO, FFF_INPUT | FFF_FILE | FFF_HEADER, &pinfo_list);
71 if (error == ERR_GENERAL) {
75 string msg =
"Cannot get attribute values. FreeForm error code: ";
76 append_long_to_string((
long) error, 10, msg);
81 pinfo_list = dll_first(pinfo_list);
87 vlist = FFV_FIRST_VARIABLE(PINFO_FORMAT(hd_pinfo));
92 vlist = (vlist)->next;
98 switch (FFV_DATA_TYPE(var)) {
100 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_TEXT, text);
101 #ifndef ATTR_STRING_QUOTE_FIX
103 if (strpbrk(text,
" \r\t")) {
105 quoted_text = (string)
"\"" + text +
"\"";
106 at->append_attr(var->name,
"STRING",
107 quoted_text.c_str());
110 at->append_attr(var->name,
"STRING", text);
116 at->append_attr(var->name,
"STRING", text);
122 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_INT8, &int8);
123 snprintf(text,
sizeof(text),
"%d", int8);
124 at->append_attr(var->name,
"BYTE", text);
129 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_INT16, &int16);
130 snprintf(text,
sizeof(text),
"%d", int16);
131 at->append_attr(var->name,
"INT16", text);
136 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_INT32, &int32);
137 snprintf(text,
sizeof(text),
"%d", int32);
138 at->append_attr(var->name,
"INT32", text);
143 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_INT64, &int64);
144 snprintf(text,
sizeof(text),
"%ld", int64);
145 at->append_attr(var->name,
"INT32", text);
150 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_UINT8, &uint8);
151 snprintf(text,
sizeof(text),
"%d", uint8);
152 at->append_attr(var->name,
"BYTE", text);
156 unsigned short uint16;
157 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_UINT16, &uint16);
158 snprintf(text,
sizeof(text),
"%d", uint16);
159 at->append_attr(var->name,
"UINT16", text);
164 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_UINT32, &uint32);
165 snprintf(text,
sizeof(text),
"%u", uint32);
166 at->append_attr(var->name,
"UINT32", text);
170 unsigned long uint64;
171 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_UINT64, &uint64);
172 snprintf(text,
sizeof(text),
"%lu", uint64);
173 at->append_attr(var->name,
"UINT32", text);
178 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_FLOAT32, &float32);
179 snprintf(text,
sizeof(text),
"%f", float32);
180 at->append_attr(var->name,
"FLOAT32", text);
185 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_FLOAT64, &float64);
186 snprintf(text,
sizeof(text),
"%f", float64);
187 at->append_attr(var->name,
"FLOAT64", text);
192 nt_ask(dbin, FFF_FILE | FFF_HEADER, var->name, FFV_ENOTE, &enote);
193 snprintf(text,
sizeof(text),
"%e", enote);
194 at->append_attr(var->name,
"FLOAT64", text);
198 throw InternalErr(__FILE__, __LINE__,
"Unknown FreeForm type!");
200 vlist = (vlist)->next;
210 void read_attributes(
string filename, AttrTable *at)
217 if (!file_exist(filename.c_str()))
218 throw Error((
string)
"Could not open file " + path_to_filename(filename) +
".");
222 SetUps = ff_create_std_args();
224 throw Error(
"ff_das: Insufficient memory");
227 SetUps->user.is_stdin_redirected = 0;
232 SetUps->input_file = const_cast<char*>(filename.c_str());
235 if (FFRequestHandler::get_RSS_format_support()) {
236 iff = find_ancillary_rss_formats(filename);
237 SetUps->input_format_file = const_cast<char*>(iff.c_str());
240 if (FFRequestHandler::get_Regex_format_support()) {
241 iff = get_Regex_format_file(filename);
243 SetUps->input_format_file = const_cast<char*>(iff.c_str());
246 SetUps->output_file = NULL;
249 error = SetDodsDB(SetUps, &dbin, Msgt);
250 if (error && error < ERR_WARNING_ONLY) {
253 ff_destroy_std_args(SetUps);
257 ff_destroy_std_args(SetUps);
260 error = db_ask(dbin, DBASK_FORMAT_SUMMARY, FFF_INPUT, &bufsize);
262 string msg =
"Cannot get Format Summary. FreeForm error code: ";
263 append_long_to_string((
long) error, 10, msg);
267 #ifndef ATTR_STRING_QUOTE_FIX
268 at->append_attr(
"Server",
"STRING",
269 "\"DODS FreeFrom based on FFND release " + FFND_LIB_VER +
"\"");
271 at->append_attr(
"Server",
"STRING",
string(
"DODS FreeFrom based on FFND release ") + FFND_LIB_VER);
274 header_to_attributes(at, dbin);
278 ff_destroy_bufsize(bufsize);
285 ff_destroy_bufsize(bufsize);
289 static void add_variable_containers(DAS &das,
const string &filename)
throw (
Error)
291 if (!file_exist(filename.c_str()))
292 throw Error(
string(
"ff_dds: Could not open file ") + path_to_filename(filename) +
string(
"."));
297 throw Error(
"Insufficient memory");
299 SetUps->user.is_stdin_redirected = 0;
301 SetUps->input_file = const_cast<char*>(filename.c_str());
304 if (FFRequestHandler::get_RSS_format_support()) {
305 iff = find_ancillary_rss_formats(filename);
306 SetUps->input_format_file = const_cast<char*>(iff.c_str());
310 if (FFRequestHandler::get_Regex_format_support()) {
311 iff = get_Regex_format_file(filename);
313 SetUps->input_format_file = const_cast<char*>(iff.c_str());
316 SetUps->output_file = NULL;
321 int error = SetDodsDB(SetUps, &dbin, Msgt);
322 if (error && error < ERR_WARNING_ONLY) {
325 ff_destroy_std_args(SetUps);
326 string msg = string(Msgt) +
" FreeForm error code: ";
327 append_long_to_string((
long) error, 10, msg);
331 ff_destroy_std_args(SetUps);
335 char **var_names_vector = NULL;
337 char **dim_names_vector = NULL;
342 error = db_ask(dbin, DBASK_VAR_NAMES, FFF_INPUT | FFF_DATA, &num_names, &var_names_vector);
344 string msg =
"Could not get varible list from the input file. FreeForm error code: ";
345 append_long_to_string((
long) error, 10, msg);
353 error = db_ask(dbin, DBASK_PROCESS_INFO, FFF_INPUT | FFF_DATA, &pinfo_list);
355 string msg =
"Could not get process info for the input file. FreeForm error code: ";
356 append_long_to_string((
long) error, 10, msg);
362 for (
int i = 0; i < num_names; i++) {
363 int num_dim_names = 0;
364 error = db_ask(dbin, DBASK_ARRAY_DIM_NAMES, var_names_vector[i], &num_dim_names, &dim_names_vector);
366 string msg =
"Could not get array dimension names for variable: " + string(var_names_vector[i])
367 + string(
", FreeForm error code: ");
368 append_long_to_string((
long) error, 10, msg);
375 if (num_dim_names == 0)
376 cp = var_names_vector[i];
378 cp = strstr(var_names_vector[i],
"::");
387 pinfo_list = dll_first(pinfo_list);
395 das.add_table(cp,
new AttrTable);
397 memFree(dim_names_vector,
"**dim_names_vector");
398 dim_names_vector = NULL;
402 if (var_names_vector)
403 memFree(var_names_vector,
"**var_names_vector");
405 ff_destroy_process_info_list(pinfo_list);
406 if (dim_names_vector)
407 memFree(dim_names_vector,
"**dim_names_vector");
414 memFree(var_names_vector,
"**var_names_vector");
415 var_names_vector = NULL;
417 ff_destroy_process_info_list(pinfo_list);
428 void ff_get_attributes(DAS &das,
string filename)
throw (
Error)
430 AttrTable *attr_table_p =
new AttrTable;
432 das.add_table(
"FF_GLOBAL", attr_table_p);
433 read_attributes(filename, attr_table_p);
438 add_variable_containers(das, filename);