-/* ------------------------------------------------
-Copyright 2014 AT&T Intellectual Property
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- ------------------------------------------- */
-
-#include"type_objects.h"
-
-#include <stdio.h>
-
-using namespace std;
-
-void data_type::assign_schema_type(){
- char tmps[100];
- switch(type){
- case bool_t:
- schema_type = "BOOL";
- break;
- case u_short_t:
- schema_type = "USHORT";
- break;
- case u_int_t:
- schema_type = "UINT";
- break;
- case int_t:
- schema_type = "INT";
- break;
- case u_llong_t:
- schema_type = "ULLONG";
- break;
- case llong_t:
- schema_type = "LLONG";
- break;
- case floating_t:
- schema_type = "FLOAT";
- break;
- case v_str_t:
- schema_type = "V_STR";
- break;
- case timeval_t:
- schema_type = "TIMEVAL";
- break;
- case ip_t:
- schema_type = "IP";
- break;
- case ipv6_t:
- schema_type = "IPV6";
- break;
- case fstring_t:
- sprintf(tmps,"FSTRING%d",size);
- schema_type = tmps;
- break;
- default:
- schema_type = "UNDEFINED_TYPE";
- break;
- }
-}
-
-
-data_type::data_type(string st){
- size=0;
- temporal = varying_t;
- subtype = "";
- assign_type_from_string(st);
-}
-
-
-// Assign data type of a colref using information about
-// modifiers as well as data type. This should be made robust.
-data_type::data_type(string st, param_list *modifiers){
- size=0;
- temporal = varying_t;
- subtype="";
- assign_type_from_string(st);
-
- if(modifiers != NULL){
- int i;
- for(i=0;i<modifiers->size();i++){
- if( modifiers->contains_key("increasing") ||
- modifiers->contains_key("Increasing") ||
- modifiers->contains_key("INCREASING")){
- temporal = increasing_t;
- }
- if( modifiers->contains_key("decreasing") ||
- modifiers->contains_key("Decreasing") ||
- modifiers->contains_key("DECREASING")){
- temporal = decreasing_t;
- }
- if(modifiers->contains_key("subtype")){
- subtype = modifiers->val_of("subtype");
- }
- }
- }
-}
-
-
-void data_type::assign_type_from_string(string st){
- if(st == "bool" || st == "Bool" || st == "BOOL"){
- type = bool_t;
- assign_schema_type();
- return;
- }
- if(st == "ushort" || st == "Ushort" || st == "USHORT"){
- type = u_short_t;
- assign_schema_type();
- return;
- }
- if(st == "uint" || st == "Uint" || st == "UINT"){
- type = u_int_t;
- assign_schema_type();
- return;
- }
- if(st == "int" || st == "Int" || st == "INT"){
- type = int_t;
- assign_schema_type();
- return;
- }
- if(st == "ullong" || st == "Ullong" || st == "ULLONG"){
- type = u_llong_t;
- assign_schema_type();
- return;
- }
- if(st == "llong" || st == "llong" || st == "LLONG"){
- type = llong_t;
- assign_schema_type();
- return;
- }
- if(st == "float" || st == "Float" || st == "FLOAT"){
- type = floating_t;
- assign_schema_type();
- return;
- }
- if(st == "string" || st == "String" || st == "STRING" ||
- st == "v_str" || st == "V_str" || st == "V_STR"){
- type = v_str_t;
- assign_schema_type();
- return;
- }
- if(st == "timeval" || st == "Timeval" || st == "TIMEVAL"){
- type = timeval_t;
- assign_schema_type();
- return;
- }
- if(st == "IP"){
- type = ip_t;
- assign_schema_type();
- return;
- }
- if(st == "IPV6" || st == "IPv6"){
- type = ipv6_t;
- assign_schema_type();
- return;
- }
- if(sscanf(st.c_str(),"fstring%d",&size)>0){
- type = fstring_t;
- assign_schema_type();
- return;
- }
- if(sscanf(st.c_str(),"Fstring%d",&size)>0){
- type = fstring_t;
- assign_schema_type();
- return;
- }
- if(sscanf(st.c_str(),"FSTRING%d",&size)>0){
- type = fstring_t;
- assign_schema_type();
- return;
- }
-
- type = undefined_t;
- assign_schema_type();
-}
-
-
-data_type::data_type(data_type *lhs, string &op){
-
-// type = undefined_t;
-// temporal_type l_tempo = lhs->get_temporal();;
-// if(l_tempo == constant_t) temporal = constant_t;
-// else temporal = varying_t;
- size=0;
- temporal = compute_temporal_type(lhs->get_temporal(),op);
-
- if(op == "-"){
- switch(lhs->get_type()){
- case int_t:
- type = int_t;
- break;
- case u_int_t:
- case u_short_t:
- type = int_t;
-// if(l_tempo == increasing_t) temporal = decreasing_t;
-// if(l_tempo == decreasing_t) temporal = increasing_t;
- break;
- case u_llong_t:
- case llong_t:
- type = llong_t;
-// if(l_tempo == increasing_t) temporal = decreasing_t;
-// if(l_tempo == decreasing_t) temporal = increasing_t;
- break;
- case floating_t:
- type = floating_t;
-// if(l_tempo == increasing_t) temporal = decreasing_t;
-// if(l_tempo == decreasing_t) temporal = increasing_t;
- break;
- default:
- break;
- }
- }
-
- if(op == "!"){
- switch(lhs->get_type()){
- case int_t:
- case u_int_t:
- case u_short_t:
- case u_llong_t:
- case llong_t:
- case bool_t:
- case ip_t:
- type = lhs->get_type();
- break;
- default:
- break;
- }
- }
-
- if(op == "~"){
- switch(lhs->get_type()){
- case int_t:
- case u_int_t:
- case u_short_t:
- case u_llong_t:
- case llong_t:
- case ip_t:
- type = lhs->get_type();
- break;
- default:
- break;
- }
- }
-
- subtype = lhs->subtype;
- assign_schema_type();
-}
-
-temporal_type data_type::compute_temporal_type(temporal_type l_tempo, string &op){
- temporal_type ret;
-
- if(l_tempo == constant_t) ret = constant_t;
- else ret = varying_t;
-
- if(op == "-"){
- if(l_tempo == increasing_t) ret = decreasing_t;
- else if(l_tempo == decreasing_t) ret = increasing_t;
- }
- return ret;
-
-}
-
-data_type::data_type(data_type *lhs, data_type *rhs, const string &op){
- size=0;
-
- type = undefined_t;
- dtype l_type = lhs->get_type();
- dtype r_type = rhs->get_type();
-
-// First, deduce the type of the result.
- if( (op=="-")||(op=="+")||(op=="/")||(op=="*")||(op=="%")||(op==">>")||(op=="<<") ){
- switch(lhs->get_type()){
- case u_short_t:
- switch(rhs->get_type()){
- case u_short_t:
- case u_int_t:
- case int_t:
- type = rhs->get_type();
- break;
- case llong_t:
- case u_llong_t:
- if(op != ">>" && op != "<<")
- type = rhs->get_type();
- break;
- case floating_t:
- if(op != "%" && op != ">>" && op != "<<")
- type = floating_t;
- break;
- case timeval_t:
- if(op == "+") type = timeval_t;
- break;
- default:
- break;
- }
- break;
- case u_int_t:
- switch(rhs->get_type()){
- case u_short_t:
- case int_t:
- case u_int_t:
- type = u_int_t;
- break;
- case llong_t:
- case u_llong_t:
- if(op != ">>" && op != "<<")
- type = rhs->get_type();
- break;
- case floating_t:
- if(op != "%" && op != ">>" && op != "<<")
- type = floating_t;
- break;
- case timeval_t:
- if(op == "+") type = timeval_t;
- break;
- default:
- break;
- }
- break;
- case int_t:
- switch(rhs->get_type()){
- case int_t:
- case u_short_t:
- type = int_t;
- break;
- case u_int_t:
- type = rhs->get_type();
- break;
- case llong_t:
- case u_llong_t:
- if(op != ">>" && op != "<<")
- type = rhs->get_type();
- break;
- case floating_t:
- if(op != "%" && op != ">>" && op != "<<")
- type = floating_t;
- break;
- case timeval_t:
- if(op == "+") type = timeval_t;
- break;
- default:
- break;
- }
- break;
- case llong_t:
- switch(rhs->get_type()){
- case int_t:
- case u_int_t:
- case u_short_t:
- type = llong_t;
- break;
- case llong_t:
- if(op != ">>" && op != "<<")
- type = llong_t;
- break;
- case u_llong_t:
- if(op != ">>" && op != "<<")
- type = u_llong_t;
- break;
- case floating_t:
- if(op != "%" && op != ">>" && op != "<<")
- type = floating_t;
- break;
- default:
- break;
- }
- break;
- case u_llong_t:
- switch(rhs->get_type()){
- case int_t:
- case u_int_t:
- case u_short_t:
- type = u_llong_t;
- break;
- case u_llong_t:
- case llong_t:
- if(op != ">>" && op != "<<")
- type = u_llong_t;
- break;
- case floating_t:
- if(op != "%" && op != ">>" && op != "<<")
- type = floating_t;
- break;
- default:
- break;
- }
- break;
- case floating_t:
- if(op != "%" && op != ">>" && op != "<<"){
- switch(rhs->get_type()){
- case int_t:
- case floating_t:
- case u_int_t:
- case u_short_t:
- case llong_t:
- case u_llong_t:
- type = floating_t;
- break;
- default:
- break;
- }
- }
- break;
-
- case timeval_t:
- switch(rhs->get_type()){
- case int_t:
- case u_int_t:
- case u_short_t:
- if(op == "+" || op == "-" || op == "/"){
- type = timeval_t;
- }
- break;
- case timeval_t:
- if(op == "-"){
- type = int_t;
- }
- break;
- default:
- break;
- }
- default:
- break;
-
- }
- }
-
- if( (op == "|") || (op == "&") ){
- switch(lhs->get_type()){
- case u_short_t:
- switch(rhs->get_type()){
- case u_short_t:
- case u_int_t:
- case int_t:
- case llong_t:
- case u_llong_t:
- type = rhs->get_type();
- break;
- case bool_t:
- type = bool_t;
- break;
- default:
- break;
- }
- break;
- case u_int_t:
- switch(rhs->get_type()){
- case u_short_t:
- case u_int_t:
- case int_t:
- type = u_int_t;
- break;
- case llong_t:
- case u_llong_t:
- type = rhs->get_type();
- break;
- case bool_t:
- type = bool_t;
- break;
- case ip_t:
- type = ip_t;
- break;
- default:
- break;
- }
- break;
- case int_t:
- switch(rhs->get_type()){
- case int_t:
- case u_short_t:
- type = int_t;
- break;
- case bool_t:
- type = bool_t;
- break;
- case u_int_t:
- case llong_t:
- case u_llong_t:
- type = rhs->get_type();
- break;
- case ip_t:
- type = ip_t;
- break;
- default:
- break;
- }
- break;
- case llong_t:
- switch(rhs->get_type()){
- case int_t:
- case u_int_t:
- case u_short_t:
- case llong_t:
- type = llong_t;
- break;
- case u_llong_t:
- type = rhs->get_type();
- break;
- case bool_t:
- type = bool_t;
- break;
- default:
- break;
- }
- break;
- case u_llong_t:
- switch(rhs->get_type()){
- case int_t:
- case u_int_t:
- case u_short_t:
- case llong_t:
- case u_llong_t:
- type = u_llong_t;
- break;
- case bool_t:
- type = bool_t;
- break;
- default:
- break;
- }
- break;
- case bool_t:
- switch(rhs->get_type()){
- case int_t:
- case u_int_t:
- case u_short_t:
- case llong_t:
- case u_llong_t:
- case bool_t:
- type = bool_t;
- break;
- default:
- break;
- }
- break;
- case ip_t:
- switch(rhs->get_type()){
- case int_t:
- case u_int_t:
- case ip_t:
- type = ip_t;
- break;
- default:
- break;
- }
- break;
- case ipv6_t:
- if(rhs->get_type() == ipv6_t)
- type = ipv6_t;
- break;
- default:
- break;
- }
- }
- assign_schema_type();
- temporal = compute_temporal_type(lhs->get_temporal(),rhs->get_temporal(),lhs->get_type(), rhs->get_type(), op);
- if(lhs->subtype == rhs->subtype){
- subtype = lhs->subtype;
- }else{
- subtype = "";
- }
-}
-
-
-temporal_type data_type::compute_temporal_type(temporal_type l_tempo, temporal_type r_tempo, dtype l_type, dtype r_type, const string &op){
- temporal_type ret;
-
-// Next, deduce the temporalness of the result.
-// One complication : if the value of the RHS or LHS is
-// negative, we can't deduce anything about the temporality
-// of the result.
- ret = varying_t;
-// temporal_type l_tempo = lhs->get_temporal();
-// temporal_type r_tempo = rhs->get_temporal();
-// dtype l_type = lhs->get_type();
-// dtype r_type = rhs->get_type();
-
- if(op == "+"){
- if(l_tempo == constant_t) ret = r_tempo;
- if(r_tempo == constant_t) ret = l_tempo;
- if(l_tempo == r_tempo) ret = r_tempo;
- }
- if(op == "-"){
- if(l_tempo == constant_t && r_tempo == constant_t) ret = constant_t;
- if((l_tempo == constant_t || l_tempo ==decreasing_t) &&
- r_tempo == increasing_t &&
- (r_type != int_t && r_type != floating_t) ) ret = decreasing_t;
- if((l_tempo == constant_t || l_tempo ==increasing_t) &&
- r_tempo == decreasing_t &&
- (r_type != int_t && r_type != floating_t) ) ret = increasing_t;
- }
-
-// If the value might be negative, can't deduce anything
-// However Java doesn't have unsigned types so the logic which forbids int has to be relaxed.
- if(op == "*"){
-// if((l_type!=int_t && l_type!=floating_t && l_type!=llong_t) && (r_type!=int_t && r_type!=floating_t && r_type!=llong_t)){
- if(!((l_type==int_t || l_type==floating_t || l_type==llong_t) && (r_type==int_t || r_type==floating_t || r_type==llong_t))){
- if(l_tempo == constant_t) ret = r_tempo;
- if(r_tempo == constant_t) ret = l_tempo;
- if(l_tempo == r_tempo) ret = r_tempo;
- }
- }
- if(op == "/"){
-// if((l_type!=int_t && l_type!=floating_t && l_type!=llong_t) && (r_type!=int_t && r_type!=floating_t && r_type!=llong_t)){
- if(!((l_type==int_t || l_type==floating_t || l_type==llong_t) && (r_type==int_t || r_type==floating_t || r_type==llong_t))){
- if((l_tempo == constant_t || l_tempo ==decreasing_t) &&
- (r_tempo == increasing_t)) ret = decreasing_t;
- if((l_tempo == constant_t || l_tempo ==increasing_t) &&
- (r_tempo == decreasing_t )) ret = increasing_t;
- if(r_tempo == constant_t) ret = l_tempo;
- }
- }
-
- return(ret);
-
-}
-
-
-data_type *data_type::duplicate(){
- data_type *ret = new data_type();
- ret->schema_type = schema_type;
- ret->size = size;
- ret->type = type;
- ret->temporal = temporal;
- ret->subtype = subtype;
-
- return(ret);
-}
-
-field_entry *data_type::make_field_entry(string n){
- field_entry *fe = new field_entry(n, schema_type);
- if(temporal == increasing_t)
- fe->add_modifier("INCREASING");
- if(temporal == decreasing_t)
- fe->add_modifier("DECREASING");
- if(subtype != "") fe->add_modifier("subtype",subtype.c_str());
- return fe;
-}
-
-bool data_type::fta_legal_operation(
- data_type *lhs, data_type *rhs, string &op){
-
- dtype l_type = lhs->get_type();
- dtype r_type = rhs->get_type();
-
-
-// Currently, anything goes. Should be controlled by
-// a config file.
-
- return(true);
-
-// Only +, -, *, /, |, & are legal in the fta.
-// The only ops on a llong or ullong are +, -
-// no ops on float, timeval permitted, but these
-// are illegal data types in the FTA and are handled elsewhere.
-
- if(!( (op == "-") || (op == "+") || (op == "/") || (op == "*") || (op == "|") || (op == "&")))
- return(false);
-
- if( (l_type == llong_t) || (l_type == u_llong_t) || (r_type == llong_t) || (r_type == u_llong_t)){
- if(op == "*" || op == "/")
- return(false);
- }
-
- return(true);
-
-}
-
-
-bool data_type::fta_legal_operation(data_type *lhs, string &op){
-
-
-// negation and not are as legal at the fta on all fta-legal types
-// as at the user level.
- return(true);
-}
-
-bool data_type::fta_legal_type(){
-
-// Currently, anything goes.
-// Should control by a config file.
-// Currently, only the float and the timeval are not legal at the fta.
-// if(type == floating_t || type == timeval_t) return(false);
-
- return(true);
-}
-
-
-// The data type of a literal
-
-data_type::data_type(int it){
- temporal = constant_t;
- subtype = "";
- switch(it){
- case LITERAL_INT:
- type = u_int_t;
- break;
- case LITERAL_LONGINT:
- type = u_llong_t;
- break;
- case LITERAL_FLOAT:
- type = floating_t;
- break;
- case LITERAL_STRING:
- type = v_str_t;
- break;
- case LITERAL_BOOL:
- type = bool_t;
- break;
- case LITERAL_TIMEVAL:
- type = timeval_t;
- break;
- case LITERAL_IP:
- type = ip_t;
- break;
- case LITERAL_IPV6:
- type = ipv6_t;
- break;
- default:
- type = undefined_t;
- break;
- }
-
- assign_schema_type();
-}
-
-void data_type::set_aggr_data_type(const string &op, data_type *dt){
- dtype se_type = dt->type;
- type = undefined_t;
- temporal = varying_t;
-
- if(op == "AVG"){
- if((se_type == u_int_t)||(se_type == u_short_t)||(se_type == int_t)||
- (se_type == u_llong_t)||(se_type == llong_t)||(se_type == floating_t))
- type = floating_t;
- }
-
-
- if(op == "SUM"){
- if((se_type == u_int_t) || (se_type == u_short_t) || (se_type == bool_t))
- type = u_int_t;
- if((se_type == int_t) || (se_type == u_llong_t) ||
- (se_type == llong_t) || (se_type == floating_t) )
- type = se_type;
-// temporal = dt->temporal; // temporal not preserved by sum.
- subtype = dt->subtype;
- }
- if(op == "MIN" || op == "MAX"){
- type = se_type;
-// temporal = dt->temporal; // temporal not preserved by min or max.
- subtype = dt->subtype;
- }
- if(op == "AND_AGGR" || op == "OR_AGGR" || op == "XOR_AGGR"){
- if( (se_type == u_int_t) || (se_type == u_short_t) ||
- (se_type == int_t) || (se_type == llong_t) ||
- (se_type == u_llong_t) || (se_type == bool_t) )
- type = se_type;
- subtype = dt->subtype;
- }
- assign_schema_type();
-}
-
-
-
-
-bool data_type::is_comparable(data_type *rhs, string op){
-
- switch(type){
- case u_short_t:
- case int_t:
- case u_int_t:
- case u_llong_t:
- case llong_t:
- case floating_t:
- case ip_t:
- switch(rhs->type){
- case int_t:
- case floating_t:
- case u_short_t:
- case u_int_t:
- case u_llong_t:
- case llong_t:
- case ip_t:
- return(true);
- default:
- return(false);
- }
-
- case v_str_t:
- switch(rhs->type){
- case v_str_t:
- return(true);
- default:
- return(false);
- }
-
- case bool_t:
- switch(rhs->type){
- case bool_t:
- return(true);
- default:
- return(false);
- }
- case timeval_t:
- switch(rhs->type){
- case timeval_t:
- return(true);
- default:
- return(false);
- }
- case ipv6_t:
- if(rhs->type == ipv6_t)
- return true;
- else
- return false;
- default:
- return(false);
- }
-
- return(false);
-}
-
-
-// type string to get val from pass-by-ref fcn.
-// (Does not seem to be used ?)
-string data_type::get_CC_accessor_type(){
- switch(type){
- case int_t:
- return("gs_int32_t *");
- case bool_t:
- case u_short_t:
- case u_int_t:
- case ip_t:
- return("gs_uint32_t *");
- case u_llong_t:
- return("gs_uint64_t *");
- case llong_t:
- return("gs_int64_t *");
- case floating_t:
- return("gs_float_t *");
- case v_str_t:
- return("struct gs_string *");
- case fstring_t:
- return("gs_int8_t *");
- case timeval_t:
- return("struct timeval *");
- case ipv6_t:
- return("struct ipv6_str *");
- default:
- return("ERROR: Unknown type in data_type::get_CC_accessor_type\n");
- }
-}
-
-// type of a variable holding this value.
-string data_type::get_cvar_type(){
- char tmps[100];
- switch(type){
- case int_t:
- return("gs_int32_t ");
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("gs_uint32_t ");
- case u_llong_t:
- return("gs_uint64_t ");
- case llong_t:
- return("gs_int64_t ");
- case floating_t:
- return("gs_float_t ");
- case v_str_t:
- return("struct gs_string");
- case ipv6_t:
- return("struct ipv6_str");
- case fstring_t:
- sprintf(tmps,"gs_int8_t[%d] ",size);
- return(tmps);
- case timeval_t:
- return("struct timeval ");
- default:
- return("ERROR: Unknown type in data_type::get_cvar_type\n");
- }
-}
-
-// type of a variable holding this value.
-string data_type::get_tuple_cvar_type(){
- char tmps[100];
- switch(type){
- case int_t:
- return("gs_int32_t ");
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("gs_uint32_t ");
- case u_llong_t:
- return("gs_uint64_t ");
- case llong_t:
- return("gs_int64_t ");
- case floating_t:
- return("gs_float_t ");
- case v_str_t:
- return("struct string32");
- case ipv6_t:
- return("struct ipv6_str");
- case fstring_t:
- sprintf(tmps,"gs_int8_t[%d] ",size);
- return(tmps);
- case timeval_t:
- return("struct timeval ");
- default:
- return("ERROR: Unknown type in data_type::get_cvar_type\n");
- }
-}
-
-
-
-// type of an in-memory variable holding this value.
-// TODO: use get_cvar_type as a subroutine
-string data_type::make_cvar(std::string v){
- char tmps[100];
- switch(type){
- case int_t:
- return("gs_int32_t "+v);
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("gs_uint32_t "+v);
- case u_llong_t:
- return("gs_uint64_t "+v);
- case llong_t:
- return("gs_int64_t "+v);
- case floating_t:
- return("gs_float_t "+v);
- case v_str_t:
- return("struct gs_string "+v);
- case ipv6_t:
- return("struct ipv6_str "+v);
- case fstring_t:
- sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);
- return(tmps);
- case timeval_t:
- return("struct timeval "+v);
- default:
- return("ERROR: Unknown type in data_type::make_cvar\n");
- }
-}
-
-// type of a tuple variable holding this value.
-// TODO: use get_tuple_cvar_type as a subroutine
-string data_type::make_tuple_cvar(std::string v){
- char tmps[100];
- switch(type){
- case int_t:
- return("gs_int32_t "+v);
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("gs_uint32_t "+v);
- case u_llong_t:
- return("gs_uint64_t "+v);
- case llong_t:
- return("gs_int64_t "+v);
- case floating_t:
- return("gs_float_t "+v);
- case v_str_t:
- return("struct string32 "+v);
- case ipv6_t:
- return("struct ipv6_str "+v);
- case fstring_t:
- sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);
- return(tmps);
- case timeval_t:
- return("struct timeval "+v);
- default:
- return("ERROR: Unknown type in data_type::make_cvar\n");
- }
-}
-
-
-// type of a variable holding this value.
-// The type at the host might be different (esp. string vs. vstring)
-string data_type::get_host_cvar_type(){
- char tmps[100];
- switch(type){
- case int_t:
- return("gs_int32_t ");
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("gs_uint32_t ");
- case u_llong_t:
- return("gs_uint64_t ");
- case llong_t:
- return("gs_int64_t ");
- case floating_t:
- return("gs_float_t ");
- case v_str_t:
- return("struct vstring");
- case ipv6_t:
- return("struct hfta_ipv6_str");
- case fstring_t:
- sprintf(tmps,"gs_int8_t[%d] ",size);
- return(tmps);
- case timeval_t:
- return("struct timeval ");
- default:
- return("ERROR: Unknown type in data_type::get_host_cvar_type\n");
- }
-}
-
-
-// type of a variable holding this value.
-// The type at the host might be different (esp. string vs. vstring)
-string data_type::make_host_cvar(std::string v){
- char tmps[100];
- switch(type){
- case int_t:
- return("gs_int32_t "+v);
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("gs_uint32_t "+v);
- case u_llong_t:
- return("gs_uint64_t "+v);
- case llong_t:
- return("gs_int64_t "+v);
- case floating_t:
- return("gs_float_t "+v);
- case v_str_t:
- return("struct vstring "+v);
- case ipv6_t:
- return("struct hfta_ipv6_str "+v);
- case fstring_t:
- sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);
- return(tmps);
- case timeval_t:
- return("struct timeval "+v);
- default:
- return("ERROR: Unknown type in data_type::make_host_cvar\n");
- }
-}
-
-string data_type::make_host_tuple_cvar(std::string v){
- char tmps[100];
- switch(type){
- case int_t:
- return("gs_int32_t "+v);
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("gs_uint32_t "+v);
- case u_llong_t:
- return("gs_uint64_t "+v);
- case llong_t:
- return("gs_int64_t "+v);
- case floating_t:
- return("gs_float_t "+v);
- case v_str_t:
- return("struct vstring32 "+v);
- case ipv6_t:
- return("struct hfta_ipv6_str "+v);
- case fstring_t:
- sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);
- return(tmps);
- case timeval_t:
- return("struct timeval "+v);
- default:
- return("ERROR: Unknown type in data_type::make_host_cvar\n");
- }
-}
-
-
-
-string data_type::get_hfta_unpack_fcn(){
- switch(type){
- case int_t:
- return("fta_unpack_int");
- case u_int_t:
- case ip_t:
- return("fta_unpack_uint");
- case u_short_t:
- return("fta_unpack_ushort");
- case bool_t:
- return("fta_unpack_bool");
- case u_llong_t:
- return("fta_unpack_ullong");
- case llong_t:
- return("fta_unpack_llong");
- case floating_t:
- return("fta_unpack_float");
- case v_str_t:
- return("fta_unpack_vstr");
- case fstring_t:
- return("fta_unpack_fstring");
- case timeval_t:
- return("fta_unpack_timeval");
- case ipv6_t:
- return("fta_unpack_ipv6");
- default:
- return("ERROR: Unknown type in dtype::get_hfta_unpack_fcn\n");
- }
-}
-
-string data_type::get_hfta_unpack_fcn_noxf(){
- switch(type){
- case int_t:
- return("fta_unpack_int_noxf");
- case u_int_t:
- case ip_t:
- return("fta_unpack_uint_noxf");
- case u_short_t:
- return("fta_unpack_ushort_noxf");
- case bool_t:
- return("fta_unpack_bool_noxf");
- case u_llong_t:
- return("fta_unpack_ullong_noxf");
- case llong_t:
- return("fta_unpack_llong_noxf");
- case floating_t:
- return("fta_unpack_float_noxf");
- case v_str_t:
- return("fta_unpack_vstr_noxf");
- case fstring_t:
- return("fta_unpack_fstring_noxf");
- case timeval_t:
- return("fta_unpack_timeval_noxf");
- case ipv6_t:
- return("fta_unpack_ipv6_noxf");
- default:
- return("ERROR: Unknown type in dtype::get_hfta_unpack_fcn_noxf\n");
- }
-}
-
-
-// Return true if comparing these types requires
-// a special function.
-// Note:
-// 1) the function should act like strcmp (-1, 0, 1)
-// 2) this fcn assumes that type checking
-// has already been done.
-bool data_type::complex_comparison(data_type *dt){
- switch(type){
- case timeval_t:
- case ipv6_t:
- case v_str_t:
- case fstring_t:
- return(true);
- default:
- return(false);
- }
-}
-
-string data_type::get_comparison_fcn(data_type *dt){
- switch(type){
- case timeval_t:
- return("Compare_Timeval");
- case v_str_t:
- return("str_compare");
- case ipv6_t:
- return("ipv6_compare");
- default:
- return("ERROR_NO_SUCH_COMPARISON_FCN");
- }
-
-
-}
-
-string data_type::get_hfta_comparison_fcn(data_type *dt){
- switch(type){
- case timeval_t:
- return("hfta_Compare_Timeval");
- case v_str_t:
- return("hfta_vstr_compare");
- case ipv6_t:
- return("hfta_ipv6_compare");
- default:
- return("ERROR_NO_SUCH_COMPARISON_FCN");
- }
-}
-
-// Return true if operating on these types requires
-// a special function for this operator.
-// Note:
-// 1) the function should act like
-// int operator_fcn(*retun_val, *lhs, *rhs)
-// 2) this fcn assumes that type checking
-// has already been done.
-bool data_type::complex_operator(data_type *dt, string &op){
- switch(type){
- case int_t:
- switch(dt->type){
- case timeval_t:
- if(op == "+")
- return(true);
- break;
- default:
- break;
- }
- break;
- case timeval_t:
- switch(dt->type){
- case int_t:
- case u_int_t:
- case u_short_t:
- if(op == "+" || op == "-" || op == "/")
- return(true);
- break;
- case timeval_t:
- if(op == "-")
- return(true);
- break;
- default:
- break;
- }
- case ipv6_t:
- if((op=="&" || op=="|") && dt->type == ipv6_t)
- return true;
- break;
- default:
- break;
- }
-
- return(false);
-}
-
-bool data_type::complex_operator(string &op){
- return(false);
-}
-
-string data_type::get_complex_operator(data_type *dt, string &op){
- switch(type){
- case int_t:
- switch(dt->type){
- case timeval_t:
- if(op == "+")
- return("Add_Int_Timeval");
- break;
- default:
- break;
- }
- break;
- case timeval_t:
- switch(dt->type){
- case int_t:
- case u_int_t:
- case u_short_t:
- if(op == "+")
- return("Add_Timeval_Int");
- if(op == "-")
- return("Subtract_Timeval_Int");
- if(op == "/")
- return("Divide_Timeval_Int");
- break;
- case timeval_t:
- if(op == "-")
- return("Subtract_Timeval_Timeval");
- break;
- default:
- break;
- }
- break;
- case ipv6_t:
- if(dt->type == ipv6_t){
- if(op == "&")
- return("And_Ipv6");
- if(op == "|")
- return("Or_Ipv6");
- }
- break;
- default:
- break;
- }
-
- return("ERROR_NO_COMPLEX_BINARY_OPERATOR");
-}
-
-string data_type::get_complex_operator(string &op){
-
- return("ERROR_NO_COMPLEX_UNARY_OPERATOR");
-}
-
-
-bool data_type::use_hashfunc(){
- switch(type){
- case int_t:
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return(false);
- case u_llong_t:
- case llong_t:
- case floating_t:
- case timeval_t:
- case ipv6_t:
- case v_str_t:
- return(true);
- default:
- fprintf(stderr,"ERROR: Unknown type in data_type::use_hashfunc\n");
- exit(1);
- return(false);
- }
-}
-string data_type::get_hfta_hashfunc(){
- switch(type){
- case int_t:
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("ERROR NO HFTA HASHFUNC");
-
- case u_llong_t:
- //return("hfta_ullong_hashfunc");
- return("hfta_ULLONG_to_hash");
- case llong_t:
- //return("hfta_ullong_hashfunc");
- return("hfta_LLONG_to_hash");
- case floating_t:
- //return("hfta_float_hashfunc");
- return("hfta_FLOAT_to_hash");
-
- case ipv6_t:
- return("hfta_IPV6_to_hash");
- case timeval_t:
- return("hfta_timeval_hashfunc");
- case v_str_t:
- return("hfta_vstr_hashfunc");
- default:
- fprintf(stderr,"ERROR: Unknown type in data_type::get_hfta_hashfunc\n");
- exit(1);
- return("false"); // to make compiler happy
- }
-}
-
-// Return true if the data type contains a ptr to a
-// memory buffer. (copying sometimes requires special cate).
-// ASSUMPTION:
-bool data_type::is_buffer_type(){
- switch(type){
- case int_t:
- case u_int_t:
- case u_short_t:
- case bool_t:
- case u_llong_t:
- case llong_t:
- case floating_t:
- case timeval_t:
- case ipv6_t:
- case ip_t:
- case fstring_t:
- return(false);
- case v_str_t:
- return(true);
- default:
- fprintf(stderr,"ERROR: Unknown type in dtype::is_buffer_type\n");
- exit(1);
- return(false);
- }
-}
-
-// Fcns which return the names of functions for
-// handling complex types.
-
-//-----------------------------
-// LFTA functions
-
-string data_type::get_buffer_assign_copy(){
- switch(type){
- case v_str_t:
- return("str_assign_with_copy");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_assign_copy_FCN");
-}
-
-string data_type::get_buffer_tuple_copy(){
- switch(type){
- case v_str_t:
- return("str_assign_with_copy_in_tuple");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_tuple_copy_FCN");
-}
-
-string data_type::get_buffer_replace(){
- switch(type){
- case v_str_t:
- return("str_replace");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_replace_FCN");
-}
-
-string data_type::get_buffer_size(){
- switch(type){
- case v_str_t:
- return("str_length");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_size_FCN");
-}
-
-string data_type::get_buffer_destroy(){
- switch(type){
- case v_str_t:
- return("str_destroy");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_destroy_FCN");
-}
-
-//-----------------------------
-// HFTA fcns
-
-string data_type::get_hfta_buffer_assign_copy(){
- switch(type){
- case v_str_t:
- return("hfta_vstr_assign_with_copy");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_assign_copy_FCN");
-}
-
-string data_type::get_hfta_buffer_tuple_copy(){
- switch(type){
- case v_str_t:
- return("hfta_vstr_assign_with_copy_in_tuple");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_tuple_copy_FCN");
-}
-
-string data_type::get_hfta_buffer_replace(){
- switch(type){
- case v_str_t:
- return("hfta_vstr_replace");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_replace_FCN");
-}
-
-string data_type::get_hfta_buffer_size(){
- switch(type){
- case v_str_t:
- return("hfta_vstr_length");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_size_FCN");
-}
-
-string data_type::get_hfta_buffer_destroy(){
- switch(type){
- case v_str_t:
- return("hfta_vstr_destroy");
- default:
- break;
- }
-
- return("ERROR_NO_SUCH_buffer_destroy_FCN");
-}
-//-----------------------------
-
-
-// Return true if the data type is represented by a strucutre.
-bool data_type::is_structured_type(){
- switch(type){
- case int_t:
- case u_int_t:
- case u_short_t:
- case bool_t:
- case u_llong_t:
- case llong_t:
- case floating_t:
- case ip_t:
- return(false);
- case timeval_t:
- case ipv6_t:
- case v_str_t:
- case fstring_t:
- return(true);
- default:
- fprintf(stderr,"ERROR: Unknown type in dtype::is_structured_type\n");
- exit(1);
- return(false);
- }
-}
-
-
-// type of a variable holding this value.
-// Seems to be a relic
-/*
-string data_type::get_interface_type(){
- char tmps[100];
- switch(type){
- case int_t:
- return("int ");
- case u_int_t:
- return("unsigned int ");
- case u_short_t:
- return("unsigned short int ");
- case bool_t:
- return("int ");
- case u_llong_t:
- return("unsigned long long int ");
- case llong_t:
- return("long long int ");
- case floating_t:
- return("double ");
- case v_str_t:
- return("ERROR");
- case fstring_t:
- sprintf(tmps,"char[%d] ",size);
- return(tmps);
- case timeval_t:
- return("ERROR ");
- case ipv6_t:
- return "ERROR";
- default:
- return("ERROR: Unknown type in dtype::get_interface_type\n");
- }
-}
-*/
-
-
-// This type of handle registration is obsolete
-
-string data_type::handle_registration_name(){
-
- switch(type){
- case v_str_t:
- return("str_register_search_string");
- default:
- return("");
- }
- return("ERROR UNKNOWN LITERAL");
- };
-
-string data_type::hfta_handle_registration_name(){
-
- switch(type){
- case v_str_t:
- return("vstr_register_search_string");
- default:
- return("");
- }
- return("ERROR UNKNOWN LITERAL");
- };
-
-
-string data_type::get_handle_destructor(){
-
- switch(type){
- case v_str_t:
- return("str_release_search_string");
- default:
- return("");
- }
- return("ERROR UNKNOWN LITERAL");
- };
-
-
-// should be the inverse of
-// data_type::data_type(string st, param_list *modifiers)
-vector<string> data_type::get_param_keys(){
- vector<string> retval;
-
- if(temporal == increasing_t)
- retval.push_back("INCREASING");
- if(temporal == decreasing_t)
- retval.push_back("DECREASING");
- if(subtype != "") retval.push_back("subtype");
-
- return(retval);
-}
-
-string data_type::get_param_val(string k){
- if(k=="subtype") return subtype;
- return "";
-}
-
-std::string data_type::get_temporal_string(){
- if(temporal == increasing_t)
- return("INCREASING");
- if(temporal == decreasing_t)
- return("DECREASING");
- return("");
-}
-
-
-bool data_type::needs_hn_translation(){
- switch(type){
- case int_t:
- case u_int_t:
- case u_short_t:
- case bool_t:
- case u_llong_t:
- case llong_t:
- case floating_t:
- case timeval_t:
- case ipv6_t:
- case v_str_t:
- case ip_t:
- return(true);
- case fstring_t:
- return(false);
- default:
- fprintf(stderr,"INTERNAL ERROR: Unknown type in dtype::needs_hn_translation\n");
- exit(1);
- return(false);
- }
-}
-
-std::string data_type::hton_translation(){
-fprintf(stderr,"INTERNAL ERROR, hton_translation called.\n");
-return("");
-
- switch(type){
- case int_t:
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("htonl");
- break;
- case u_llong_t:
- case llong_t:
- return("htonll");
- break;
- case floating_t:
- return("htonf");
- break;
- case timeval_t:
- return("htontv");
- break;
- case ipv6_t:
- return("hton_ipv6");
- break;
- case v_str_t:
- return("INTERNAL ERROR, net translation for buffered types needs special handling.\n");
- default:
- fprintf(stderr,"INTERNAL ERROR: Unknown type in dtype::hton_translation\n");
- exit(1);
- return("INTERNAL ERROR: NO SUCH TYPE IN hton_translation");
- }
-}
-
-std::string data_type::ntoh_translation(){
-fprintf(stderr,"INTERNAL ERROR, ntoh_translation called.\n");
-return("");
-
- switch(type){
- case int_t:
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return("ntohl");
- break;
- case u_llong_t:
- case llong_t:
- return("ntohll");
- break;
- case floating_t:
- return("ntohf");
- break;
- case timeval_t:
- return("ntohtv");
- break;
- case ipv6_t:
- return("ntoh_ipv6");
- break;
- case v_str_t:
- return("INTERNAL ERROR, net translation for buffered types needs special handling.\n");
- default:
- fprintf(stderr,"INTERNAL ERROR: Unknown type in dtype::ntoh_translation\n");
- exit(1);
- return("INTERNAL ERROR: NO SUCH TYPE IN ntoh_translation");
- }
-}
-
-int data_type::type_indicator(){
- switch(type){
- case int_t:
- return(INT_TYPE);
- case u_int_t:
- return(UINT_TYPE);
- case u_short_t:
- return(USHORT_TYPE);
- case bool_t:
- return(BOOL_TYPE);
- case u_llong_t:
- return(ULLONG_TYPE);
- case llong_t:
- return(LLONG_TYPE);
- case floating_t:
- return(FLOAT_TYPE);
- case timeval_t:
- return(TIMEVAL_TYPE);
- case ipv6_t:
- return(IPV6_TYPE);
- case ip_t:
- return(IP_TYPE);
- case v_str_t:
- return(VSTR_TYPE);
- case fstring_t:
- return(FSTRING_TYPE);
- default:
- return(UNDEFINED_TYPE);
- }
- return(UNDEFINED_TYPE);
-}
-
-// for schemaparser
-
-int data_type::type_size(){
- switch(type){
- case int_t:
- return(sizeof(gs_int32_t));
- case u_int_t:
- case u_short_t:
- case bool_t:
- case ip_t:
- return(sizeof(gs_uint32_t));
- case u_llong_t:
- return(sizeof(gs_uint64_t));
- case llong_t:
- return(sizeof(gs_int64_t));
- case floating_t:
- return(sizeof(gs_float_t));
- case timeval_t:
- return(sizeof(timeval)); // IMPLEMENTATION DEPENDENT
- case ipv6_t:
- return(sizeof(hfta_ipv6_str)); // IMPLEMENTATION DEPENDENT
- case v_str_t:
- return(sizeof(vstring32)); // IMPLEMENTATION DEPENDENT
- case fstring_t:
- return(size);
- default:
- return(0);
- }
- return(0);
-}
-
-// for external functions and predicates
-
-/*
-bool data_type::call_compatible(data_type *o){
- if(type != o->get_type()) return(false);
- if(type == fstring_t){
- if(size != 0 && size != o->type_size()) return(false);
- }
- return(true);
-}
-
-// test for equality : used by bind_to_schema and by testing for
-// mergability.
-
-bool data_type::equal(data_type *o){
- if(type != o->get_type()) return(false);
- if(type == fstring_t){
- if(size != o->type_size()) return(false);
- }
- return(true);
-}
-*/
-
-bool data_type::subsumes_type(data_type *o){
- if(type != o->get_type()) return(false);
- if(type == fstring_t){
- if(size != o->type_size()) return(false);
- }
- if(this->is_temporal() && temporal != o->get_temporal()) return false;
- if(subtype != "" && subtype != o->subtype) return false;
-
- return(true);
-}
-
-bool data_type::equals(data_type *o){
- if(type != o->get_type()) return(false);
- if(type == fstring_t){
- if(size != o->type_size()) return(false);
- }
- if(temporal != o->get_temporal()) return false;
- if(subtype != o->subtype) return false;
-
- return(true);
-}
-
-bool data_type::equal_subtypes(data_type *o){
- if(type != o->get_type()) return(false);
- if(type == fstring_t){
- if(size != o->type_size()) return(false);
- }
- if(subtype != o->subtype) return false;
-
- return(true);
-}
-
-
-string data_type::to_string(){
- string ret = schema_type;
- if(this->is_temporal() || subtype != ""){
- ret += " (";
- if(temporal == increasing_t)
- ret += "INCREASING";
- if(temporal == decreasing_t)
- ret += "DECREASING";
- if(this->is_temporal() && subtype != "")
- ret += ", ";
- if(subtype != "")
- ret += "subtype "+subtype;
- ret += ")";
- }
- return ret;
-}
-
-
-
-string data_type::get_min_literal() {
- switch(type){
- case int_t:
- return("INT_MIN");
- case bool_t:
- case u_short_t:
- case u_int_t:
- case ip_t:
- return("0");
- case u_llong_t:
- return("0");
- case llong_t:
- return("LLONG_MIN");
- case floating_t:
- return("DBL_MIN");
- case timeval_t:
- return("{0,0}");
- case ipv6_t:
- return("0000:0000:0000:0000:0000:0000:0000:0000");
- case v_str_t:
- case fstring_t:
- return("ERROR: Min literal is undefined for strings\n");
- default:
- return("ERROR: Unknown type in data_type::get_min_literal\n");
- }
-}
-
-string data_type::get_max_literal() {
- switch(type){
- case int_t:
- return("INT_MAX");
- case bool_t:
- case u_short_t:
- case u_int_t:
- case ip_t:
- return("UINT_MAX");
- case u_llong_t:
- return("ULLONG_MAX");
- case llong_t:
- return("LLONG_MAX");
- case floating_t:
- return("DBL_MAX");
- case timeval_t:
- return("{UINT_MAX,UINT_MAX}");
- case ipv6_t:
- return("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
- case v_str_t:
- case fstring_t:
- return("ERROR: Max literal is undefined for strings\n");
- default:
- return("ERROR: Unknown type in data_type::get_max_literal\n");
- }
-
-}
-
+/* ------------------------------------------------\r
+Copyright 2014 AT&T Intellectual Property\r
+ Licensed under the Apache License, Version 2.0 (the "License");\r
+ you may not use this file except in compliance with the License.\r
+ You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+ ------------------------------------------- */\r
+\r
+#include"type_objects.h"\r
+\r
+#include <stdio.h>\r
+\r
+using namespace std;\r
+\r
+void data_type::assign_schema_type(){\r
+ char tmps[100];\r
+ switch(type){\r
+ case bool_t:\r
+ schema_type = "BOOL";\r
+ break;\r
+ case u_short_t:\r
+ schema_type = "USHORT";\r
+ break;\r
+ case u_int_t:\r
+ schema_type = "UINT";\r
+ break;\r
+ case int_t:\r
+ schema_type = "INT";\r
+ break;\r
+ case u_llong_t:\r
+ schema_type = "ULLONG";\r
+ break;\r
+ case llong_t:\r
+ schema_type = "LLONG";\r
+ break;\r
+ case floating_t:\r
+ schema_type = "FLOAT";\r
+ break;\r
+ case v_str_t:\r
+ schema_type = "V_STR";\r
+ break;\r
+ case timeval_t:\r
+ schema_type = "TIMEVAL";\r
+ break;\r
+ case ip_t:\r
+ schema_type = "IP";\r
+ break;\r
+ case ipv6_t:\r
+ schema_type = "IPV6";\r
+ break;\r
+ case fstring_t:\r
+ sprintf(tmps,"FSTRING%d",size);\r
+ schema_type = tmps;\r
+ break;\r
+ default:\r
+ schema_type = "UNDEFINED_TYPE";\r
+ break;\r
+ }\r
+}\r
+\r
+\r
+data_type::data_type(string st){\r
+ size=0;\r
+ temporal = varying_t;\r
+ subtype = "";\r
+ assign_type_from_string(st);\r
+}\r
+\r
+\r
+// Assign data type of a colref using information about\r
+// modifiers as well as data type. This should be made robust.\r
+data_type::data_type(string st, param_list *modifiers){\r
+ size=0;\r
+ temporal = varying_t;\r
+ subtype="";\r
+ assign_type_from_string(st);\r
+\r
+ if(modifiers != NULL){\r
+ int i;\r
+ for(i=0;i<modifiers->size();i++){\r
+ if( modifiers->contains_key("increasing") ||\r
+ modifiers->contains_key("Increasing") ||\r
+ modifiers->contains_key("INCREASING")){\r
+ temporal = increasing_t;\r
+ }\r
+ if( modifiers->contains_key("decreasing") ||\r
+ modifiers->contains_key("Decreasing") ||\r
+ modifiers->contains_key("DECREASING")){\r
+ temporal = decreasing_t;\r
+ }\r
+ if(modifiers->contains_key("subtype")){\r
+ subtype = modifiers->val_of("subtype");\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+\r
+void data_type::assign_type_from_string(string st){\r
+ if(st == "bool" || st == "Bool" || st == "BOOL"){\r
+ type = bool_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "ushort" || st == "Ushort" || st == "USHORT"){\r
+ type = u_short_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "uint" || st == "Uint" || st == "UINT"){\r
+ type = u_int_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "int" || st == "Int" || st == "INT"){\r
+ type = int_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "ullong" || st == "Ullong" || st == "ULLONG"){\r
+ type = u_llong_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "llong" || st == "llong" || st == "LLONG"){\r
+ type = llong_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "float" || st == "Float" || st == "FLOAT"){\r
+ type = floating_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "string" || st == "String" || st == "STRING" ||\r
+ st == "v_str" || st == "V_str" || st == "V_STR"){\r
+ type = v_str_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "timeval" || st == "Timeval" || st == "TIMEVAL"){\r
+ type = timeval_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "IP"){\r
+ type = ip_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(st == "IPV6" || st == "IPv6"){\r
+ type = ipv6_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(sscanf(st.c_str(),"fstring%d",&size)>0){\r
+ type = fstring_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(sscanf(st.c_str(),"Fstring%d",&size)>0){\r
+ type = fstring_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+ if(sscanf(st.c_str(),"FSTRING%d",&size)>0){\r
+ type = fstring_t;\r
+ assign_schema_type();\r
+ return;\r
+ }\r
+\r
+ type = undefined_t;\r
+ assign_schema_type();\r
+}\r
+\r
+\r
+data_type::data_type(data_type *lhs, string &op){\r
+\r
+// type = undefined_t;\r
+// temporal_type l_tempo = lhs->get_temporal();;\r
+// if(l_tempo == constant_t) temporal = constant_t;\r
+// else temporal = varying_t;\r
+ size=0;\r
+ temporal = compute_temporal_type(lhs->get_temporal(),op);\r
+\r
+ if(op == "-"){\r
+ switch(lhs->get_type()){\r
+ case int_t:\r
+ type = int_t;\r
+ break;\r
+ case u_int_t:\r
+ case u_short_t:\r
+ type = int_t;\r
+// if(l_tempo == increasing_t) temporal = decreasing_t;\r
+// if(l_tempo == decreasing_t) temporal = increasing_t;\r
+ break;\r
+ case u_llong_t:\r
+ case llong_t:\r
+ type = llong_t;\r
+// if(l_tempo == increasing_t) temporal = decreasing_t;\r
+// if(l_tempo == decreasing_t) temporal = increasing_t;\r
+ break;\r
+ case floating_t:\r
+ type = floating_t;\r
+// if(l_tempo == increasing_t) temporal = decreasing_t;\r
+// if(l_tempo == decreasing_t) temporal = increasing_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+\r
+ if(op == "!"){\r
+ switch(lhs->get_type()){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case u_llong_t:\r
+ case llong_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ type = lhs->get_type();\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+\r
+ if(op == "~"){\r
+ switch(lhs->get_type()){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case u_llong_t:\r
+ case llong_t:\r
+ case ip_t:\r
+ type = lhs->get_type();\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+\r
+ subtype = lhs->subtype;\r
+ assign_schema_type();\r
+}\r
+\r
+temporal_type data_type::compute_temporal_type(temporal_type l_tempo, string &op){\r
+ temporal_type ret;\r
+\r
+ if(l_tempo == constant_t) ret = constant_t;\r
+ else ret = varying_t;\r
+\r
+ if(op == "-"){\r
+ if(l_tempo == increasing_t) ret = decreasing_t;\r
+ else if(l_tempo == decreasing_t) ret = increasing_t;\r
+ }\r
+ return ret;\r
+\r
+}\r
+\r
+data_type::data_type(data_type *lhs, data_type *rhs, const string &op){\r
+ size=0;\r
+\r
+ type = undefined_t;\r
+ dtype l_type = lhs->get_type();\r
+ dtype r_type = rhs->get_type();\r
+\r
+// First, deduce the type of the result.\r
+ if( (op=="-")||(op=="+")||(op=="/")||(op=="*")||(op=="%")||(op==">>")||(op=="<<") ){\r
+ switch(lhs->get_type()){\r
+ case u_short_t:\r
+ switch(rhs->get_type()){\r
+ case u_short_t:\r
+ case u_int_t:\r
+ case int_t:\r
+ type = rhs->get_type();\r
+ break;\r
+ case llong_t:\r
+ case u_llong_t:\r
+ if(op != ">>" && op != "<<")\r
+ type = rhs->get_type();\r
+ break;\r
+ case floating_t:\r
+ if(op != "%" && op != ">>" && op != "<<")\r
+ type = floating_t;\r
+ break;\r
+ case timeval_t:\r
+ if(op == "+") type = timeval_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case u_int_t:\r
+ switch(rhs->get_type()){\r
+ case u_short_t:\r
+ case int_t:\r
+ case u_int_t:\r
+ type = u_int_t;\r
+ break;\r
+ case llong_t:\r
+ case u_llong_t:\r
+ if(op != ">>" && op != "<<")\r
+ type = rhs->get_type();\r
+ break;\r
+ case floating_t:\r
+ if(op != "%" && op != ">>" && op != "<<")\r
+ type = floating_t;\r
+ break;\r
+ case timeval_t:\r
+ if(op == "+") type = timeval_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case int_t:\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case u_short_t:\r
+ type = int_t;\r
+ break;\r
+ case u_int_t:\r
+ type = rhs->get_type();\r
+ break;\r
+ case llong_t:\r
+ case u_llong_t:\r
+ if(op != ">>" && op != "<<")\r
+ type = rhs->get_type();\r
+ break;\r
+ case floating_t:\r
+ if(op != "%" && op != ">>" && op != "<<")\r
+ type = floating_t;\r
+ break;\r
+ case timeval_t:\r
+ if(op == "+") type = timeval_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case llong_t:\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ type = llong_t;\r
+ break;\r
+ case llong_t:\r
+ if(op != ">>" && op != "<<")\r
+ type = llong_t;\r
+ break;\r
+ case u_llong_t:\r
+ if(op != ">>" && op != "<<")\r
+ type = u_llong_t;\r
+ break;\r
+ case floating_t:\r
+ if(op != "%" && op != ">>" && op != "<<")\r
+ type = floating_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case u_llong_t:\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ type = u_llong_t;\r
+ break;\r
+ case u_llong_t:\r
+ case llong_t:\r
+ if(op != ">>" && op != "<<")\r
+ type = u_llong_t;\r
+ break;\r
+ case floating_t:\r
+ if(op != "%" && op != ">>" && op != "<<")\r
+ type = floating_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case floating_t:\r
+ if(op != "%" && op != ">>" && op != "<<"){\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case floating_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case llong_t:\r
+ case u_llong_t:\r
+ type = floating_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+\r
+ case timeval_t:\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ if(op == "+" || op == "-" || op == "/"){\r
+ type = timeval_t;\r
+ }\r
+ break;\r
+ case timeval_t:\r
+ if(op == "-"){\r
+ type = int_t;\r
+ }\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ default:\r
+ break;\r
+\r
+ }\r
+ }\r
+\r
+ if( (op == "|") || (op == "&") ){\r
+ switch(lhs->get_type()){\r
+ case u_short_t:\r
+ switch(rhs->get_type()){\r
+ case u_short_t:\r
+ case u_int_t:\r
+ case int_t:\r
+ case llong_t:\r
+ case u_llong_t:\r
+ type = rhs->get_type();\r
+ break;\r
+ case bool_t:\r
+ type = bool_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case u_int_t:\r
+ switch(rhs->get_type()){\r
+ case u_short_t:\r
+ case u_int_t:\r
+ case int_t:\r
+ type = u_int_t;\r
+ break;\r
+ case llong_t:\r
+ case u_llong_t:\r
+ type = rhs->get_type();\r
+ break;\r
+ case bool_t:\r
+ type = bool_t;\r
+ break;\r
+ case ip_t:\r
+ type = ip_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case int_t:\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case u_short_t:\r
+ type = int_t;\r
+ break;\r
+ case bool_t:\r
+ type = bool_t;\r
+ break;\r
+ case u_int_t:\r
+ case llong_t:\r
+ case u_llong_t:\r
+ type = rhs->get_type();\r
+ break;\r
+ case ip_t:\r
+ type = ip_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case llong_t:\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case llong_t:\r
+ type = llong_t;\r
+ break;\r
+ case u_llong_t:\r
+ type = rhs->get_type();\r
+ break;\r
+ case bool_t:\r
+ type = bool_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case u_llong_t:\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case llong_t:\r
+ case u_llong_t:\r
+ type = u_llong_t;\r
+ break;\r
+ case bool_t:\r
+ type = bool_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case bool_t:\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case llong_t:\r
+ case u_llong_t:\r
+ case bool_t:\r
+ type = bool_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case ip_t:\r
+ switch(rhs->get_type()){\r
+ case int_t:\r
+ case u_int_t:\r
+ case ip_t:\r
+ type = ip_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case ipv6_t:\r
+ if(rhs->get_type() == ipv6_t)\r
+ type = ipv6_t;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ assign_schema_type();\r
+ temporal = compute_temporal_type(lhs->get_temporal(),rhs->get_temporal(),lhs->get_type(), rhs->get_type(), op);\r
+ if(lhs->subtype == rhs->subtype){\r
+ subtype = lhs->subtype;\r
+ }else{\r
+ subtype = "";\r
+ }\r
+}\r
+\r
+\r
+temporal_type data_type::compute_temporal_type(temporal_type l_tempo, temporal_type r_tempo, dtype l_type, dtype r_type, const string &op){\r
+ temporal_type ret;\r
+\r
+// Next, deduce the temporalness of the result.\r
+// One complication : if the value of the RHS or LHS is\r
+// negative, we can't deduce anything about the temporality\r
+// of the result.\r
+ ret = varying_t;\r
+// temporal_type l_tempo = lhs->get_temporal();\r
+// temporal_type r_tempo = rhs->get_temporal();\r
+// dtype l_type = lhs->get_type();\r
+// dtype r_type = rhs->get_type();\r
+\r
+ if(op == "+"){\r
+ if(l_tempo == constant_t) ret = r_tempo;\r
+ if(r_tempo == constant_t) ret = l_tempo;\r
+ if(l_tempo == r_tempo) ret = r_tempo;\r
+ }\r
+ if(op == "-"){\r
+ if(l_tempo == constant_t && r_tempo == constant_t) ret = constant_t;\r
+ if((l_tempo == constant_t || l_tempo ==decreasing_t) &&\r
+ r_tempo == increasing_t &&\r
+ (r_type != int_t && r_type != floating_t) ) ret = decreasing_t;\r
+ if((l_tempo == constant_t || l_tempo ==increasing_t) &&\r
+ r_tempo == decreasing_t &&\r
+ (r_type != int_t && r_type != floating_t) ) ret = increasing_t;\r
+ }\r
+\r
+// If the value might be negative, can't deduce anything\r
+// However Java doesn't have unsigned types so the logic which forbids int has to be relaxed.\r
+ if(op == "*"){\r
+// if((l_type!=int_t && l_type!=floating_t && l_type!=llong_t) && (r_type!=int_t && r_type!=floating_t && r_type!=llong_t)){\r
+ if(!((l_type==int_t || l_type==floating_t || l_type==llong_t) && (r_type==int_t || r_type==floating_t || r_type==llong_t))){\r
+ if(l_tempo == constant_t) ret = r_tempo;\r
+ if(r_tempo == constant_t) ret = l_tempo;\r
+ if(l_tempo == r_tempo) ret = r_tempo;\r
+ }\r
+ }\r
+ if(op == "/"){\r
+// if((l_type!=int_t && l_type!=floating_t && l_type!=llong_t) && (r_type!=int_t && r_type!=floating_t && r_type!=llong_t)){\r
+ if(!((l_type==int_t || l_type==floating_t || l_type==llong_t) && (r_type==int_t || r_type==floating_t || r_type==llong_t))){\r
+ if((l_tempo == constant_t || l_tempo ==decreasing_t) &&\r
+ (r_tempo == increasing_t)) ret = decreasing_t;\r
+ if((l_tempo == constant_t || l_tempo ==increasing_t) &&\r
+ (r_tempo == decreasing_t )) ret = increasing_t;\r
+ if(r_tempo == constant_t) ret = l_tempo;\r
+ }\r
+ }\r
+\r
+ return(ret);\r
+\r
+}\r
+\r
+\r
+data_type *data_type::duplicate(){\r
+ data_type *ret = new data_type();\r
+ ret->schema_type = schema_type;\r
+ ret->size = size;\r
+ ret->type = type;\r
+ ret->temporal = temporal;\r
+ ret->subtype = subtype;\r
+\r
+ return(ret);\r
+}\r
+\r
+field_entry *data_type::make_field_entry(string n){\r
+ field_entry *fe = new field_entry(n, schema_type);\r
+ if(temporal == increasing_t)\r
+ fe->add_modifier("INCREASING");\r
+ if(temporal == decreasing_t)\r
+ fe->add_modifier("DECREASING");\r
+ if(subtype != "") fe->add_modifier("subtype",subtype.c_str());\r
+ return fe;\r
+}\r
+\r
+bool data_type::fta_legal_operation(\r
+ data_type *lhs, data_type *rhs, string &op){\r
+\r
+ dtype l_type = lhs->get_type();\r
+ dtype r_type = rhs->get_type();\r
+\r
+\r
+// Currently, anything goes. Should be controlled by\r
+// a config file.\r
+\r
+ return(true);\r
+\r
+// Only +, -, *, /, |, & are legal in the fta.\r
+// The only ops on a llong or ullong are +, -\r
+// no ops on float, timeval permitted, but these\r
+// are illegal data types in the FTA and are handled elsewhere.\r
+\r
+ if(!( (op == "-") || (op == "+") || (op == "/") || (op == "*") || (op == "|") || (op == "&")))\r
+ return(false);\r
+\r
+ if( (l_type == llong_t) || (l_type == u_llong_t) || (r_type == llong_t) || (r_type == u_llong_t)){\r
+ if(op == "*" || op == "/")\r
+ return(false);\r
+ }\r
+\r
+ return(true);\r
+\r
+}\r
+\r
+\r
+bool data_type::fta_legal_operation(data_type *lhs, string &op){\r
+\r
+\r
+// negation and not are as legal at the fta on all fta-legal types\r
+// as at the user level.\r
+ return(true);\r
+}\r
+\r
+bool data_type::fta_legal_type(){\r
+\r
+// Currently, anything goes.\r
+// Should control by a config file.\r
+// Currently, only the float and the timeval are not legal at the fta.\r
+// if(type == floating_t || type == timeval_t) return(false);\r
+\r
+ return(true);\r
+}\r
+\r
+\r
+// The data type of a literal\r
+\r
+data_type::data_type(int it){\r
+ temporal = constant_t;\r
+ subtype = "";\r
+ switch(it){\r
+ case LITERAL_INT:\r
+ type = u_int_t;\r
+ break;\r
+ case LITERAL_LONGINT:\r
+ type = u_llong_t;\r
+ break;\r
+ case LITERAL_FLOAT:\r
+ type = floating_t;\r
+ break;\r
+ case LITERAL_STRING:\r
+ type = v_str_t;\r
+ break;\r
+ case LITERAL_BOOL:\r
+ type = bool_t;\r
+ break;\r
+ case LITERAL_TIMEVAL:\r
+ type = timeval_t;\r
+ break;\r
+ case LITERAL_IP:\r
+ type = ip_t;\r
+ break;\r
+ case LITERAL_IPV6:\r
+ type = ipv6_t;\r
+ break;\r
+ default:\r
+ type = undefined_t;\r
+ break;\r
+ }\r
+\r
+ assign_schema_type();\r
+}\r
+\r
+void data_type::set_aggr_data_type(const string &op, data_type *dt){\r
+ dtype se_type = dt->type;\r
+ type = undefined_t;\r
+ temporal = varying_t;\r
+\r
+ if(op == "AVG"){\r
+ if((se_type == u_int_t)||(se_type == u_short_t)||(se_type == int_t)||\r
+ (se_type == u_llong_t)||(se_type == llong_t)||(se_type == floating_t))\r
+ type = floating_t;\r
+ }\r
+\r
+\r
+ if(op == "SUM"){\r
+ if((se_type == u_int_t) || (se_type == u_short_t) || (se_type == bool_t))\r
+ type = u_int_t;\r
+ if((se_type == int_t) || (se_type == u_llong_t) ||\r
+ (se_type == llong_t) || (se_type == floating_t) )\r
+ type = se_type;\r
+// temporal = dt->temporal; // temporal not preserved by sum.\r
+ subtype = dt->subtype;\r
+ }\r
+ if(op == "MIN" || op == "MAX"){\r
+ type = se_type;\r
+// temporal = dt->temporal; // temporal not preserved by min or max.\r
+ subtype = dt->subtype;\r
+ }\r
+ if(op == "AND_AGGR" || op == "OR_AGGR" || op == "XOR_AGGR"){\r
+ if( (se_type == u_int_t) || (se_type == u_short_t) ||\r
+ (se_type == int_t) || (se_type == llong_t) ||\r
+ (se_type == u_llong_t) || (se_type == bool_t) )\r
+ type = se_type;\r
+ subtype = dt->subtype;\r
+ }\r
+ assign_schema_type();\r
+}\r
+\r
+\r
+\r
+\r
+bool data_type::is_comparable(data_type *rhs, string op){\r
+\r
+ switch(type){\r
+ case u_short_t:\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_llong_t:\r
+ case llong_t:\r
+ case floating_t:\r
+ case ip_t:\r
+ switch(rhs->type){\r
+ case int_t:\r
+ case floating_t:\r
+ case u_short_t:\r
+ case u_int_t:\r
+ case u_llong_t:\r
+ case llong_t:\r
+ case ip_t:\r
+ return(true);\r
+ default:\r
+ return(false);\r
+ }\r
+\r
+ case v_str_t:\r
+ switch(rhs->type){\r
+ case v_str_t:\r
+ return(true);\r
+ default:\r
+ return(false);\r
+ }\r
+\r
+ case bool_t:\r
+ switch(rhs->type){\r
+ case bool_t:\r
+ return(true);\r
+ default:\r
+ return(false);\r
+ }\r
+ case timeval_t:\r
+ switch(rhs->type){\r
+ case timeval_t:\r
+ return(true);\r
+ default:\r
+ return(false);\r
+ }\r
+ case ipv6_t:\r
+ if(rhs->type == ipv6_t)\r
+ return true;\r
+ else\r
+ return false;\r
+ default:\r
+ return(false);\r
+ }\r
+\r
+ return(false);\r
+}\r
+\r
+\r
+// type string to get val from pass-by-ref fcn.\r
+// (Does not seem to be used ?)\r
+string data_type::get_CC_accessor_type(){\r
+ switch(type){\r
+ case int_t:\r
+ return("gs_int32_t *");\r
+ case bool_t:\r
+ case u_short_t:\r
+ case u_int_t:\r
+ case ip_t:\r
+ return("gs_uint32_t *");\r
+ case u_llong_t:\r
+ return("gs_uint64_t *");\r
+ case llong_t:\r
+ return("gs_int64_t *");\r
+ case floating_t:\r
+ return("gs_float_t *");\r
+ case v_str_t:\r
+ return("struct gs_string *");\r
+ case fstring_t:\r
+ return("gs_int8_t *");\r
+ case timeval_t:\r
+ return("struct timeval *");\r
+ case ipv6_t:\r
+ return("struct ipv6_str *");\r
+ default:\r
+ return("ERROR: Unknown type in data_type::get_CC_accessor_type\n");\r
+ }\r
+}\r
+\r
+// type of a variable holding this value.\r
+string data_type::get_cvar_type(){\r
+ char tmps[100];\r
+ switch(type){\r
+ case int_t:\r
+ return("gs_int32_t ");\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("gs_uint32_t ");\r
+ case u_llong_t:\r
+ return("gs_uint64_t ");\r
+ case llong_t:\r
+ return("gs_int64_t ");\r
+ case floating_t:\r
+ return("gs_float_t ");\r
+ case v_str_t:\r
+ return("struct gs_string");\r
+ case ipv6_t:\r
+ return("struct ipv6_str");\r
+ case fstring_t:\r
+ sprintf(tmps,"gs_int8_t[%d] ",size);\r
+ return(tmps);\r
+ case timeval_t:\r
+ return("struct timeval ");\r
+ default:\r
+ return("ERROR: Unknown type in data_type::get_cvar_type\n");\r
+ }\r
+}\r
+\r
+// type of a variable holding this value.\r
+string data_type::get_tuple_cvar_type(){\r
+ char tmps[100];\r
+ switch(type){\r
+ case int_t:\r
+ return("gs_int32_t ");\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("gs_uint32_t ");\r
+ case u_llong_t:\r
+ return("gs_uint64_t ");\r
+ case llong_t:\r
+ return("gs_int64_t ");\r
+ case floating_t:\r
+ return("gs_float_t ");\r
+ case v_str_t:\r
+ return("struct string32");\r
+ case ipv6_t:\r
+ return("struct ipv6_str");\r
+ case fstring_t:\r
+ sprintf(tmps,"gs_int8_t[%d] ",size);\r
+ return(tmps);\r
+ case timeval_t:\r
+ return("struct timeval ");\r
+ default:\r
+ return("ERROR: Unknown type in data_type::get_cvar_type\n");\r
+ }\r
+}\r
+\r
+\r
+\r
+// type of an in-memory variable holding this value.\r
+// TODO: use get_cvar_type as a subroutine\r
+string data_type::make_cvar(std::string v){\r
+ char tmps[100];\r
+ switch(type){\r
+ case int_t:\r
+ return("gs_int32_t "+v);\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("gs_uint32_t "+v);\r
+ case u_llong_t:\r
+ return("gs_uint64_t "+v);\r
+ case llong_t:\r
+ return("gs_int64_t "+v);\r
+ case floating_t:\r
+ return("gs_float_t "+v);\r
+ case v_str_t:\r
+ return("struct gs_string "+v);\r
+ case ipv6_t:\r
+ return("struct ipv6_str "+v);\r
+ case fstring_t:\r
+ sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);\r
+ return(tmps);\r
+ case timeval_t:\r
+ return("struct timeval "+v);\r
+ default:\r
+ return("ERROR: Unknown type in data_type::make_cvar\n");\r
+ }\r
+}\r
+\r
+// type of a tuple variable holding this value.\r
+// TODO: use get_tuple_cvar_type as a subroutine\r
+string data_type::make_tuple_cvar(std::string v){\r
+ char tmps[100];\r
+ switch(type){\r
+ case int_t:\r
+ return("gs_int32_t "+v);\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("gs_uint32_t "+v);\r
+ case u_llong_t:\r
+ return("gs_uint64_t "+v);\r
+ case llong_t:\r
+ return("gs_int64_t "+v);\r
+ case floating_t:\r
+ return("gs_float_t "+v);\r
+ case v_str_t:\r
+ return("struct string32 "+v);\r
+ case ipv6_t:\r
+ return("struct ipv6_str "+v);\r
+ case fstring_t:\r
+ sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);\r
+ return(tmps);\r
+ case timeval_t:\r
+ return("struct timeval "+v);\r
+ default:\r
+ return("ERROR: Unknown type in data_type::make_cvar\n");\r
+ }\r
+}\r
+\r
+\r
+// type of a variable holding this value.\r
+// The type at the host might be different (esp. string vs. vstring)\r
+string data_type::get_host_cvar_type(){\r
+ char tmps[100];\r
+ switch(type){\r
+ case int_t:\r
+ return("gs_int32_t ");\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("gs_uint32_t ");\r
+ case u_llong_t:\r
+ return("gs_uint64_t ");\r
+ case llong_t:\r
+ return("gs_int64_t ");\r
+ case floating_t:\r
+ return("gs_float_t ");\r
+ case v_str_t:\r
+ return("struct vstring");\r
+ case ipv6_t:\r
+ return("struct hfta_ipv6_str");\r
+ case fstring_t:\r
+ sprintf(tmps,"gs_int8_t[%d] ",size);\r
+ return(tmps);\r
+ case timeval_t:\r
+ return("struct timeval ");\r
+ default:\r
+ return("ERROR: Unknown type in data_type::get_host_cvar_type\n");\r
+ }\r
+}\r
+\r
+\r
+// type of a variable holding this value.\r
+// The type at the host might be different (esp. string vs. vstring)\r
+string data_type::make_host_cvar(std::string v){\r
+ char tmps[100];\r
+ switch(type){\r
+ case int_t:\r
+ return("gs_int32_t "+v);\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("gs_uint32_t "+v);\r
+ case u_llong_t:\r
+ return("gs_uint64_t "+v);\r
+ case llong_t:\r
+ return("gs_int64_t "+v);\r
+ case floating_t:\r
+ return("gs_float_t "+v);\r
+ case v_str_t:\r
+ return("struct vstring "+v);\r
+ case ipv6_t:\r
+ return("struct hfta_ipv6_str "+v);\r
+ case fstring_t:\r
+ sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);\r
+ return(tmps);\r
+ case timeval_t:\r
+ return("struct timeval "+v);\r
+ default:\r
+ return("ERROR: Unknown type in data_type::make_host_cvar\n");\r
+ }\r
+}\r
+\r
+string data_type::make_host_tuple_cvar(std::string v){\r
+ char tmps[100];\r
+ switch(type){\r
+ case int_t:\r
+ return("gs_int32_t "+v);\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("gs_uint32_t "+v);\r
+ case u_llong_t:\r
+ return("gs_uint64_t "+v);\r
+ case llong_t:\r
+ return("gs_int64_t "+v);\r
+ case floating_t:\r
+ return("gs_float_t "+v);\r
+ case v_str_t:\r
+ return("struct vstring32 "+v);\r
+ case ipv6_t:\r
+ return("struct hfta_ipv6_str "+v);\r
+ case fstring_t:\r
+ sprintf(tmps,"gs_int8_t %s[%d] ",v.c_str(),size);\r
+ return(tmps);\r
+ case timeval_t:\r
+ return("struct timeval "+v);\r
+ default:\r
+ return("ERROR: Unknown type in data_type::make_host_cvar\n");\r
+ }\r
+}\r
+\r
+\r
+\r
+string data_type::get_hfta_unpack_fcn(){\r
+ switch(type){\r
+ case int_t:\r
+ return("fta_unpack_int");\r
+ case u_int_t:\r
+ case ip_t:\r
+ return("fta_unpack_uint");\r
+ case u_short_t:\r
+ return("fta_unpack_ushort");\r
+ case bool_t:\r
+ return("fta_unpack_bool");\r
+ case u_llong_t:\r
+ return("fta_unpack_ullong");\r
+ case llong_t:\r
+ return("fta_unpack_llong");\r
+ case floating_t:\r
+ return("fta_unpack_float");\r
+ case v_str_t:\r
+ return("fta_unpack_vstr");\r
+ case fstring_t:\r
+ return("fta_unpack_fstring");\r
+ case timeval_t:\r
+ return("fta_unpack_timeval");\r
+ case ipv6_t:\r
+ return("fta_unpack_ipv6");\r
+ default:\r
+ return("ERROR: Unknown type in dtype::get_hfta_unpack_fcn\n");\r
+ }\r
+}\r
+\r
+string data_type::get_hfta_unpack_fcn_noxf(){\r
+ switch(type){\r
+ case int_t:\r
+ return("fta_unpack_int_noxf");\r
+ case u_int_t:\r
+ case ip_t:\r
+ return("fta_unpack_uint_noxf");\r
+ case u_short_t:\r
+ return("fta_unpack_ushort_noxf");\r
+ case bool_t:\r
+ return("fta_unpack_bool_noxf");\r
+ case u_llong_t:\r
+ return("fta_unpack_ullong_noxf");\r
+ case llong_t:\r
+ return("fta_unpack_llong_noxf");\r
+ case floating_t:\r
+ return("fta_unpack_float_noxf");\r
+ case v_str_t:\r
+ return("fta_unpack_vstr_noxf");\r
+ case fstring_t:\r
+ return("fta_unpack_fstring_noxf");\r
+ case timeval_t:\r
+ return("fta_unpack_timeval_noxf");\r
+ case ipv6_t:\r
+ return("fta_unpack_ipv6_noxf");\r
+ default:\r
+ return("ERROR: Unknown type in dtype::get_hfta_unpack_fcn_noxf\n");\r
+ }\r
+}\r
+\r
+\r
+// Return true if comparing these types requires\r
+// a special function.\r
+// Note:\r
+// 1) the function should act like strcmp (-1, 0, 1)\r
+// 2) this fcn assumes that type checking\r
+// has already been done.\r
+bool data_type::complex_comparison(data_type *dt){\r
+ switch(type){\r
+ case timeval_t:\r
+ case ipv6_t:\r
+ case v_str_t:\r
+ case fstring_t:\r
+ return(true);\r
+ default:\r
+ return(false);\r
+ }\r
+}\r
+\r
+string data_type::get_comparison_fcn(data_type *dt){\r
+ switch(type){\r
+ case timeval_t:\r
+ return("Compare_Timeval");\r
+ case v_str_t:\r
+ return("str_compare");\r
+ case ipv6_t:\r
+ return("ipv6_compare");\r
+ default:\r
+ return("ERROR_NO_SUCH_COMPARISON_FCN");\r
+ }\r
+\r
+\r
+}\r
+\r
+string data_type::get_hfta_comparison_fcn(data_type *dt){\r
+ switch(type){\r
+ case timeval_t:\r
+ return("hfta_Compare_Timeval");\r
+ case v_str_t:\r
+ return("hfta_vstr_compare");\r
+ case ipv6_t:\r
+ return("hfta_ipv6_compare");\r
+ default:\r
+ return("ERROR_NO_SUCH_COMPARISON_FCN");\r
+ }\r
+}\r
+\r
+// Return true if operating on these types requires\r
+// a special function for this operator.\r
+// Note:\r
+// 1) the function should act like\r
+// int operator_fcn(*retun_val, *lhs, *rhs)\r
+// 2) this fcn assumes that type checking\r
+// has already been done.\r
+bool data_type::complex_operator(data_type *dt, string &op){\r
+ switch(type){\r
+ case int_t:\r
+ switch(dt->type){\r
+ case timeval_t:\r
+ if(op == "+")\r
+ return(true);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case timeval_t:\r
+ switch(dt->type){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ if(op == "+" || op == "-" || op == "/")\r
+ return(true);\r
+ break;\r
+ case timeval_t:\r
+ if(op == "-")\r
+ return(true);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ case ipv6_t:\r
+ if((op=="&" || op=="|") && dt->type == ipv6_t)\r
+ return true;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return(false);\r
+}\r
+\r
+bool data_type::complex_operator(string &op){\r
+ return(false);\r
+}\r
+\r
+string data_type::get_complex_operator(data_type *dt, string &op){\r
+ switch(type){\r
+ case int_t:\r
+ switch(dt->type){\r
+ case timeval_t:\r
+ if(op == "+")\r
+ return("Add_Int_Timeval");\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case timeval_t:\r
+ switch(dt->type){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ if(op == "+")\r
+ return("Add_Timeval_Int");\r
+ if(op == "-")\r
+ return("Subtract_Timeval_Int");\r
+ if(op == "/")\r
+ return("Divide_Timeval_Int");\r
+ break;\r
+ case timeval_t:\r
+ if(op == "-")\r
+ return("Subtract_Timeval_Timeval");\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ break;\r
+ case ipv6_t:\r
+ if(dt->type == ipv6_t){\r
+ if(op == "&")\r
+ return("And_Ipv6");\r
+ if(op == "|")\r
+ return("Or_Ipv6");\r
+ }\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_COMPLEX_BINARY_OPERATOR");\r
+}\r
+\r
+string data_type::get_complex_operator(string &op){\r
+\r
+ return("ERROR_NO_COMPLEX_UNARY_OPERATOR");\r
+}\r
+\r
+\r
+bool data_type::use_hashfunc(){\r
+ switch(type){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return(false);\r
+ case u_llong_t:\r
+ case llong_t:\r
+ case floating_t:\r
+ case timeval_t:\r
+ case ipv6_t:\r
+ case v_str_t:\r
+ return(true);\r
+ default:\r
+ fprintf(stderr,"ERROR: Unknown type in data_type::use_hashfunc\n");\r
+ exit(1);\r
+ return(false);\r
+ }\r
+}\r
+string data_type::get_hfta_hashfunc(){\r
+ switch(type){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("ERROR NO HFTA HASHFUNC");\r
+\r
+ case u_llong_t:\r
+ //return("hfta_ullong_hashfunc");\r
+ return("hfta_ULLONG_to_hash");\r
+ case llong_t:\r
+ //return("hfta_ullong_hashfunc");\r
+ return("hfta_LLONG_to_hash");\r
+ case floating_t:\r
+ //return("hfta_float_hashfunc");\r
+ return("hfta_FLOAT_to_hash");\r
+\r
+ case ipv6_t:\r
+ return("hfta_IPV6_to_hash");\r
+ case timeval_t:\r
+ return("hfta_timeval_hashfunc");\r
+ case v_str_t:\r
+ return("hfta_vstr_hashfunc");\r
+ default:\r
+ fprintf(stderr,"ERROR: Unknown type in data_type::get_hfta_hashfunc\n");\r
+ exit(1);\r
+ return("false"); // to make compiler happy\r
+ }\r
+}\r
+\r
+// Return true if the data type contains a ptr to a\r
+// memory buffer. (copying sometimes requires special cate).\r
+// ASSUMPTION:\r
+bool data_type::is_buffer_type(){\r
+ switch(type){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case u_llong_t:\r
+ case llong_t:\r
+ case floating_t:\r
+ case timeval_t:\r
+ case ipv6_t:\r
+ case ip_t:\r
+ case fstring_t:\r
+ return(false);\r
+ case v_str_t:\r
+ return(true);\r
+ default:\r
+ fprintf(stderr,"ERROR: Unknown type in dtype::is_buffer_type\n");\r
+ exit(1);\r
+ return(false);\r
+ }\r
+}\r
+\r
+// Fcns which return the names of functions for\r
+// handling complex types.\r
+\r
+//-----------------------------\r
+// LFTA functions\r
+\r
+string data_type::get_buffer_assign_copy(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("str_assign_with_copy");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_assign_copy_FCN");\r
+}\r
+\r
+string data_type::get_buffer_tuple_copy(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("str_assign_with_copy_in_tuple");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_tuple_copy_FCN");\r
+}\r
+\r
+string data_type::get_buffer_replace(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("str_replace");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_replace_FCN");\r
+}\r
+\r
+string data_type::get_buffer_size(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("str_length");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_size_FCN");\r
+}\r
+\r
+string data_type::get_buffer_destroy(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("str_destroy");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_destroy_FCN");\r
+}\r
+\r
+//-----------------------------\r
+// HFTA fcns\r
+\r
+string data_type::get_hfta_buffer_assign_copy(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("hfta_vstr_assign_with_copy");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_assign_copy_FCN");\r
+}\r
+\r
+string data_type::get_hfta_buffer_tuple_copy(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("hfta_vstr_assign_with_copy_in_tuple");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_tuple_copy_FCN");\r
+}\r
+\r
+string data_type::get_hfta_buffer_replace(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("hfta_vstr_replace");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_replace_FCN");\r
+}\r
+\r
+string data_type::get_hfta_buffer_size(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("hfta_vstr_length");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_size_FCN");\r
+}\r
+\r
+string data_type::get_hfta_buffer_destroy(){\r
+ switch(type){\r
+ case v_str_t:\r
+ return("hfta_vstr_destroy");\r
+ default:\r
+ break;\r
+ }\r
+\r
+ return("ERROR_NO_SUCH_buffer_destroy_FCN");\r
+}\r
+//-----------------------------\r
+\r
+\r
+// Return true if the data type is represented by a strucutre.\r
+bool data_type::is_structured_type(){\r
+ switch(type){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case u_llong_t:\r
+ case llong_t:\r
+ case floating_t:\r
+ case ip_t:\r
+ return(false);\r
+ case timeval_t:\r
+ case ipv6_t:\r
+ case v_str_t:\r
+ case fstring_t:\r
+ return(true);\r
+ default:\r
+ fprintf(stderr,"ERROR: Unknown type in dtype::is_structured_type\n");\r
+ exit(1);\r
+ return(false);\r
+ }\r
+}\r
+\r
+\r
+// type of a variable holding this value.\r
+// Seems to be a relic\r
+/*\r
+string data_type::get_interface_type(){\r
+ char tmps[100];\r
+ switch(type){\r
+ case int_t:\r
+ return("int ");\r
+ case u_int_t:\r
+ return("unsigned int ");\r
+ case u_short_t:\r
+ return("unsigned short int ");\r
+ case bool_t:\r
+ return("int ");\r
+ case u_llong_t:\r
+ return("unsigned long long int ");\r
+ case llong_t:\r
+ return("long long int ");\r
+ case floating_t:\r
+ return("double ");\r
+ case v_str_t:\r
+ return("ERROR");\r
+ case fstring_t:\r
+ sprintf(tmps,"char[%d] ",size);\r
+ return(tmps);\r
+ case timeval_t:\r
+ return("ERROR ");\r
+ case ipv6_t:\r
+ return "ERROR";\r
+ default:\r
+ return("ERROR: Unknown type in dtype::get_interface_type\n");\r
+ }\r
+}\r
+*/\r
+\r
+\r
+// This type of handle registration is obsolete\r
+\r
+string data_type::handle_registration_name(){\r
+\r
+ switch(type){\r
+ case v_str_t:\r
+ return("str_register_search_string");\r
+ default:\r
+ return("");\r
+ }\r
+ return("ERROR UNKNOWN LITERAL");\r
+ };\r
+\r
+string data_type::hfta_handle_registration_name(){\r
+\r
+ switch(type){\r
+ case v_str_t:\r
+ return("vstr_register_search_string");\r
+ default:\r
+ return("");\r
+ }\r
+ return("ERROR UNKNOWN LITERAL");\r
+ };\r
+\r
+\r
+string data_type::get_handle_destructor(){\r
+\r
+ switch(type){\r
+ case v_str_t:\r
+ return("str_release_search_string");\r
+ default:\r
+ return("");\r
+ }\r
+ return("ERROR UNKNOWN LITERAL");\r
+ };\r
+\r
+\r
+// should be the inverse of\r
+// data_type::data_type(string st, param_list *modifiers)\r
+vector<string> data_type::get_param_keys(){\r
+ vector<string> retval;\r
+\r
+ if(temporal == increasing_t)\r
+ retval.push_back("INCREASING");\r
+ if(temporal == decreasing_t)\r
+ retval.push_back("DECREASING");\r
+ if(subtype != "") retval.push_back("subtype");\r
+\r
+ return(retval);\r
+}\r
+\r
+string data_type::get_param_val(string k){\r
+ if(k=="subtype") return subtype;\r
+ return "";\r
+}\r
+\r
+std::string data_type::get_temporal_string(){\r
+ if(temporal == increasing_t)\r
+ return("INCREASING");\r
+ if(temporal == decreasing_t)\r
+ return("DECREASING");\r
+ return("");\r
+}\r
+\r
+\r
+bool data_type::needs_hn_translation(){\r
+ switch(type){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case u_llong_t:\r
+ case llong_t:\r
+ case floating_t:\r
+ case timeval_t:\r
+ case ipv6_t:\r
+ case v_str_t:\r
+ case ip_t:\r
+ return(true);\r
+ case fstring_t:\r
+ return(false);\r
+ default:\r
+ fprintf(stderr,"INTERNAL ERROR: Unknown type in dtype::needs_hn_translation\n");\r
+ exit(1);\r
+ return(false);\r
+ }\r
+}\r
+\r
+std::string data_type::hton_translation(){\r
+fprintf(stderr,"INTERNAL ERROR, hton_translation called.\n");\r
+return("");\r
+\r
+ switch(type){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("htonl");\r
+ break;\r
+ case u_llong_t:\r
+ case llong_t:\r
+ return("htonll");\r
+ break;\r
+ case floating_t:\r
+ return("htonf");\r
+ break;\r
+ case timeval_t:\r
+ return("htontv");\r
+ break;\r
+ case ipv6_t:\r
+ return("hton_ipv6");\r
+ break;\r
+ case v_str_t:\r
+ return("INTERNAL ERROR, net translation for buffered types needs special handling.\n");\r
+ default:\r
+ fprintf(stderr,"INTERNAL ERROR: Unknown type in dtype::hton_translation\n");\r
+ exit(1);\r
+ return("INTERNAL ERROR: NO SUCH TYPE IN hton_translation");\r
+ }\r
+}\r
+\r
+std::string data_type::ntoh_translation(){\r
+fprintf(stderr,"INTERNAL ERROR, ntoh_translation called.\n");\r
+return("");\r
+\r
+ switch(type){\r
+ case int_t:\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return("ntohl");\r
+ break;\r
+ case u_llong_t:\r
+ case llong_t:\r
+ return("ntohll");\r
+ break;\r
+ case floating_t:\r
+ return("ntohf");\r
+ break;\r
+ case timeval_t:\r
+ return("ntohtv");\r
+ break;\r
+ case ipv6_t:\r
+ return("ntoh_ipv6");\r
+ break;\r
+ case v_str_t:\r
+ return("INTERNAL ERROR, net translation for buffered types needs special handling.\n");\r
+ default:\r
+ fprintf(stderr,"INTERNAL ERROR: Unknown type in dtype::ntoh_translation\n");\r
+ exit(1);\r
+ return("INTERNAL ERROR: NO SUCH TYPE IN ntoh_translation");\r
+ }\r
+}\r
+\r
+int data_type::type_indicator(){\r
+ switch(type){\r
+ case int_t:\r
+ return(INT_TYPE);\r
+ case u_int_t:\r
+ return(UINT_TYPE);\r
+ case u_short_t:\r
+ return(USHORT_TYPE);\r
+ case bool_t:\r
+ return(BOOL_TYPE);\r
+ case u_llong_t:\r
+ return(ULLONG_TYPE);\r
+ case llong_t:\r
+ return(LLONG_TYPE);\r
+ case floating_t:\r
+ return(FLOAT_TYPE);\r
+ case timeval_t:\r
+ return(TIMEVAL_TYPE);\r
+ case ipv6_t:\r
+ return(IPV6_TYPE);\r
+ case ip_t:\r
+ return(IP_TYPE);\r
+ case v_str_t:\r
+ return(VSTR_TYPE);\r
+ case fstring_t:\r
+ return(FSTRING_TYPE);\r
+ default:\r
+ return(UNDEFINED_TYPE);\r
+ }\r
+ return(UNDEFINED_TYPE);\r
+}\r
+\r
+// for schemaparser\r
+\r
+int data_type::type_size(){\r
+ switch(type){\r
+ case int_t:\r
+ return(sizeof(gs_int32_t));\r
+ case u_int_t:\r
+ case u_short_t:\r
+ case bool_t:\r
+ case ip_t:\r
+ return(sizeof(gs_uint32_t));\r
+ case u_llong_t:\r
+ return(sizeof(gs_uint64_t));\r
+ case llong_t:\r
+ return(sizeof(gs_int64_t));\r
+ case floating_t:\r
+ return(sizeof(gs_float_t));\r
+ case timeval_t:\r
+ return(sizeof(timeval)); // IMPLEMENTATION DEPENDENT\r
+ case ipv6_t:\r
+ return(sizeof(hfta_ipv6_str)); // IMPLEMENTATION DEPENDENT\r
+ case v_str_t:\r
+ return(sizeof(vstring32)); // IMPLEMENTATION DEPENDENT\r
+ case fstring_t:\r
+ return(size);\r
+ default:\r
+ return(0);\r
+ }\r
+ return(0);\r
+}\r
+\r
+// for external functions and predicates\r
+\r
+/*\r
+bool data_type::call_compatible(data_type *o){\r
+ if(type != o->get_type()) return(false);\r
+ if(type == fstring_t){\r
+ if(size != 0 && size != o->type_size()) return(false);\r
+ }\r
+ return(true);\r
+}\r
+\r
+// test for equality : used by bind_to_schema and by testing for\r
+// mergability.\r
+\r
+bool data_type::equal(data_type *o){\r
+ if(type != o->get_type()) return(false);\r
+ if(type == fstring_t){\r
+ if(size != o->type_size()) return(false);\r
+ }\r
+ return(true);\r
+}\r
+*/\r
+\r
+bool data_type::subsumes_type(data_type *o){\r
+ if(type != o->get_type()) return(false);\r
+ if(type == fstring_t){\r
+ if(size != o->type_size()) return(false);\r
+ }\r
+ if(this->is_temporal() && temporal != o->get_temporal()) return false;\r
+ if(subtype != "" && subtype != o->subtype) return false;\r
+\r
+ return(true);\r
+}\r
+\r
+bool data_type::equals(data_type *o){\r
+ if(type != o->get_type()) return(false);\r
+ if(type == fstring_t){\r
+ if(size != o->type_size()) return(false);\r
+ }\r
+ if(temporal != o->get_temporal()) return false;\r
+ if(subtype != o->subtype) return false;\r
+\r
+ return(true);\r
+}\r
+\r
+bool data_type::equal_subtypes(data_type *o){\r
+ if(type != o->get_type()) return(false);\r
+ if(type == fstring_t){\r
+ if(size != o->type_size()) return(false);\r
+ }\r
+ if(subtype != o->subtype) return false;\r
+\r
+ return(true);\r
+}\r
+\r
+\r
+string data_type::to_string(){\r
+ string ret = schema_type;\r
+ if(this->is_temporal() || subtype != ""){\r
+ ret += " (";\r
+ if(temporal == increasing_t)\r
+ ret += "INCREASING";\r
+ if(temporal == decreasing_t)\r
+ ret += "DECREASING";\r
+ if(this->is_temporal() && subtype != "")\r
+ ret += ", ";\r
+ if(subtype != "")\r
+ ret += "subtype "+subtype;\r
+ ret += ")";\r
+ }\r
+ return ret;\r
+}\r
+\r
+\r
+\r
+string data_type::get_min_literal() {\r
+ switch(type){\r
+ case int_t:\r
+ return("INT_MIN");\r
+ case bool_t:\r
+ case u_short_t:\r
+ case u_int_t:\r
+ case ip_t:\r
+ return("0");\r
+ case u_llong_t:\r
+ return("0");\r
+ case llong_t:\r
+ return("LLONG_MIN");\r
+ case floating_t:\r
+ return("DBL_MIN");\r
+ case timeval_t:\r
+ return("{0,0}");\r
+ case ipv6_t:\r
+ return("0000:0000:0000:0000:0000:0000:0000:0000");\r
+ case v_str_t:\r
+ case fstring_t:\r
+ return("ERROR: Min literal is undefined for strings\n");\r
+ default:\r
+ return("ERROR: Unknown type in data_type::get_min_literal\n");\r
+ }\r
+}\r
+\r
+string data_type::get_max_literal() {\r
+ switch(type){\r
+ case int_t:\r
+ return("INT_MAX");\r
+ case bool_t:\r
+ case u_short_t:\r
+ case u_int_t:\r
+ case ip_t:\r
+ return("UINT_MAX");\r
+ case u_llong_t:\r
+ return("ULLONG_MAX");\r
+ case llong_t:\r
+ return("LLONG_MAX");\r
+ case floating_t:\r
+ return("DBL_MAX");\r
+ case timeval_t:\r
+ return("{UINT_MAX,UINT_MAX}");\r
+ case ipv6_t:\r
+ return("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");\r
+ case v_str_t:\r
+ case fstring_t:\r
+ return("ERROR: Max literal is undefined for strings\n");\r
+ default:\r
+ return("ERROR: Unknown type in data_type::get_max_literal\n");\r
+ }\r
+\r
+}\r
+\r