00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include "config.h"
00038
00039 static char rcsid[] not_used =
00040 {"$Id: RValue.cc 17156 2007-09-21 17:44:27Z jimg $"
00041 };
00042
00043 #include <assert.h>
00044
00045 #include <iostream>
00046
00047 #include "BaseType.h"
00048 #include "expr.h"
00049 #include "RValue.h"
00050 #include "DDS.h"
00051 #include "dods-limits.h"
00052 #include "util.h"
00053
00054 using namespace std;
00055
00056 rvalue_list *
00057 make_rvalue_list(rvalue *rv)
00058 {
00059 assert(rv);
00060
00061 rvalue_list *rvals = new rvalue_list;
00062
00063 return append_rvalue_list(rvals, rv);
00064 }
00065
00066
00067
00068
00069
00070
00071 rvalue_list *
00072 append_rvalue_list(rvalue_list *rvals, rvalue *rv)
00073 {
00074 assert(rvals);
00075 assert(rv);
00076
00077 rvals->push_back(rv);
00078
00079 return rvals;
00080 }
00081
00082
00094 BaseType **
00095 build_btp_args(rvalue_list *args, DDS &dds, const string &dataset)
00096 {
00097 int argc = 0;
00098
00099 if (args)
00100 argc = args->size();
00101
00102
00103 if (!size_ok(sizeof(BaseType*), argc+1))
00104 throw Error(malformed_expr,
00105 string("Malformed argument list (")
00106 + long_to_string(argc)
00107 + string(")."));
00108
00109
00110 BaseType **argv = new BaseType*[argc + 1];
00111
00112 int index = 0;
00113 if (argv && argc) {
00114 for (rvalue::Args_iter i = args->begin(); i != args->end() && index < argc+1; ++i) {
00115 argv[index++] = (*i)->bvalue(dataset, dds);
00116 }
00117 }
00118
00119 if (index > argc)
00120 throw InternalErr(__FILE__, __LINE__, "index out of range.");
00121
00122 argv[index] = 0;
00123
00124 return argv;
00125 }
00126
00127 rvalue::rvalue(BaseType *bt): d_value(bt), d_func(0), d_args(0)
00128 {}
00129
00130 rvalue::rvalue(btp_func f, vector<rvalue *> *a) : d_value(0), d_func(f), d_args(a)
00131 {}
00132
00133 rvalue::rvalue(): d_value(0), d_func(0), d_args(0)
00134 {}
00135
00136 rvalue::~rvalue()
00137 {
00138
00139
00140
00141
00142 }
00143
00144 string
00145 rvalue::value_name()
00146 {
00147 assert(d_value);
00148
00149 return d_value->name();
00150 }
00151
00161 BaseType *
00162 rvalue::bvalue(const string &dataset, DDS &dds)
00163 {
00164 if (d_value) {
00165 return d_value;
00166 }
00167 else if (d_func) {
00168
00169
00170 BaseType **argv = build_btp_args(d_args, dds, dataset);
00171 BaseType *ret_val = (*d_func)(d_args->size(), argv, dds, dataset);
00172 delete[] argv;
00173 return ret_val;
00174 }
00175 else {
00176 return 0;
00177 }
00178 }
00179