libdap Updated for version 3.21.1
libdap4 is an implementation of OPeNDAP's DAP protocol.
RValue.cc
Go to the documentation of this file.
1
2// -*- mode: c++; c-basic-offset:4 -*-
3
4// This file is part of libdap, A C++ implementation of the OPeNDAP Data
5// Access Protocol.
6
7// Copyright (c) 2002,2003 OPeNDAP, Inc.
8// Author: James Gallagher <jgallagher@opendap.org>
9//
10// This library is free software; you can redistribute it and/or
11// modify it under the terms of the GNU Lesser General Public
12// License as published by the Free Software Foundation; either
13// version 2.1 of the License, or (at your option) any later version.
14//
15// This library is distributed in the hope that it will be useful,
16// but WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18// Lesser General Public License for more details.
19//
20// You should have received a copy of the GNU Lesser General Public
21// License along with this library; if not, write to the Free Software
22// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23//
24// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
25
26// (c) COPYRIGHT URI/MIT 1996-1999
27// Please read the full copyright statement in the file COPYRIGHT_URI.
28//
29// Authors:
30// jhrg,jimg James Gallagher <jgallagher@gso.uri.edu>
31
32// This file contains mfuncs defined for struct rvalue (see expr.h) that
33// *cannot* be included in that struct's declaration because their
34// definitions must follow *both* rvalue's and func_rvalue's declarations.
35// jhrg 3/4/96
36
37#include "config.h"
38
39#include <cassert>
40#include <iostream>
41
42#include "BaseType.h"
43#include "DDS.h"
44#include "RValue.h"
45#include "dods-limits.h"
46#include "expr.h"
47#include "util.h"
48
49using namespace std;
50
51namespace libdap {
52
54 assert(rv);
55
56 rvalue_list *rvals = new rvalue_list;
57
58 return append_rvalue_list(rvals, rv);
59}
60
61// Given a rvalue_list pointer RVALS and a value pointer VAL, make a variable
62// to hold VAL and append that variable to the list RVALS.
63//
64// Returns: A pointer to the updated rvalue_list.
65
67 rvals->push_back(rv);
68
69 return rvals;
70}
71
82BaseType **build_btp_args(const rvalue_list *args, DDS &dds) {
83 int argc = 0;
84
85 if (args)
86 argc = args->size();
87
88 // Sanitize allocation size
89 if (!size_ok(sizeof(BaseType *), argc + 1))
90 throw Error(malformed_expr, string("Malformed argument list (") + long_to_string(argc) + string(")."));
91
92 // Add space for a null terminator
93 BaseType **argv = new BaseType *[argc + 1];
94 argv[argc] = nullptr;
95
96 if (argc) {
97 int i = 0;
98 for (auto btp : *args) {
99 argv[i++] = btp->bvalue(dds);
100 }
101
102 assert(i == argc);
103 }
104
105 return argv;
106}
107
108#if 0
109 int index = 0;
110 if (argv && argc) {
111 for (rvalue::Args_iter i = args->begin(); i != args->end() && index < argc + 1; ++i)
112 argv[index++] = (*i)->bvalue(dds);
113
114 argv[index] = 0; // Add the null terminator.
115 }
116
117 if (index != argc) {
118 delete[] argv;
119 throw InternalErr(__FILE__, __LINE__, "index out of range.");
120 }
121
122 return argv;
123#endif
124
125rvalue::rvalue(BaseType *bt) : d_value(bt), d_func(0), d_args(0) {}
126
127rvalue::rvalue(btp_func f, vector<rvalue *> *a) : d_value(0), d_func(f), d_args(a) {}
128
129rvalue::rvalue() : d_value(0), d_func(0), d_args(0) {}
130
132 // Deleting the BaseType pointers in value and args is a bad idea since
133 // those might be variables in the dataset. The DDS dtor will take care
134 // of deleting them. The constants wrapped in BaseType objects should be
135 // pushed on the list of CE-allocated temp objects which the CE frees.
136
137 // ADB: the d_args vector still needs to be deleted
138 if (d_args != 0) {
139 for (std::vector<rvalue *>::iterator iter = d_args->begin(); iter != d_args->end(); ++iter) {
140 delete *iter;
141 }
142 delete d_args;
143 }
144}
145
147 assert(d_value);
148
149 return d_value->name();
150}
151
160 if (d_value) { // i.e., if this RValue is a BaseType
161 return d_value;
162 } else if (d_func) {
163 // If func is true, then args must be set. See the constructor.
164 // 12/23/04 jhrg
165 BaseType **argv = build_btp_args(d_args, dds);
166 BaseType *ret_val;
167 (*d_func)(d_args->size(), argv, dds, &ret_val);
168 delete[] argv;
169 return ret_val;
170 } else {
171 return 0;
172 }
173}
174
175} // namespace libdap
#define malformed_expr
(400)
Definition Error.h:66
The basic data type for the DODS DAP types.
Definition BaseType.h:118
A class for error processing.
Definition Error.h:92
A class for software fault reporting.
Definition InternalErr.h:61
BaseType * bvalue(DDS &dds)
Definition RValue.cc:159
std::vector< rvalue * >::iterator Args_iter
Definition RValue.h:54
virtual ~rvalue()
Definition RValue.cc:131
std::string value_name()
Definition RValue.cc:146
top level DAP object to house generic methods
Definition AISConnect.cc:30
rvalue_list * append_rvalue_list(rvalue_list *rvals, rvalue *rv)
Definition RValue.cc:66
string long_to_string(long val, int base)
Definition util.cc:946
bool size_ok(unsigned int sz, unsigned int nelem)
sanitize the size of an array. Test for integer overflow when dynamically allocating an array.
Definition util.cc:1138
std::vector< rvalue * > rvalue_list
Definition RValue.h:69
BaseType ** build_btp_args(const rvalue_list *args, DDS &dds)
Definition RValue.cc:82
rvalue_list * make_rvalue_list(rvalue *rv)
Definition RValue.cc:53