1 5184 ek110237 /* 2 5184 ek110237 * CDDL HEADER START 3 5184 ek110237 * 4 5184 ek110237 * The contents of this file are subject to the terms of the 5 5184 ek110237 * Common Development and Distribution License (the "License"). 6 5184 ek110237 * You may not use this file except in compliance with the License. 7 5184 ek110237 * 8 5184 ek110237 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 5184 ek110237 * or http://www.opensolaris.org/os/licensing. 10 5184 ek110237 * See the License for the specific language governing permissions 11 5184 ek110237 * and limitations under the License. 12 5184 ek110237 * 13 5184 ek110237 * When distributing Covered Code, include this CDDL HEADER in each 14 5184 ek110237 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 5184 ek110237 * If applicable, add the following below this CDDL HEADER, with the 16 5184 ek110237 * fields enclosed by brackets "[]" replaced with your own identifying 17 5184 ek110237 * information: Portions Copyright [yyyy] [name of copyright owner] 18 5184 ek110237 * 19 5184 ek110237 * CDDL HEADER END 20 5184 ek110237 */ 21 5184 ek110237 /* 22 9801 Andrew * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 5184 ek110237 * Use is subject to license terms. 24 5184 ek110237 */ 25 5184 ek110237 26 5184 ek110237 #ifndef _FB_VARS_H 27 5184 ek110237 #define _FB_VARS_H 28 5184 ek110237 29 5184 ek110237 #include "config.h" 30 5184 ek110237 31 5184 ek110237 #include <stdio.h> 32 5184 ek110237 #include <sys/types.h> 33 5184 ek110237 #ifdef HAVE_STDINT_H 34 5184 ek110237 #include <stdint.h> 35 5184 ek110237 #endif 36 5184 ek110237 37 5184 ek110237 #ifdef __cplusplus 38 5184 ek110237 extern "C" { 39 5184 ek110237 #endif 40 5184 ek110237 41 6212 aw148015 /* Attribute Value Descriptor types */ 42 6212 aw148015 typedef enum avd_type { 43 6212 aw148015 AVD_INVALID = 0, /* avd is empty */ 44 6212 aw148015 AVD_VAL_BOOL, /* avd contains a boolean_t */ 45 6212 aw148015 AVD_VARVAL_BOOL, /* avd points to the boolean_t in a var_t */ 46 6212 aw148015 AVD_VAL_INT, /* avd contains an fbint_t */ 47 6212 aw148015 AVD_VARVAL_INT, /* avd points to the fbint_t in a var_t */ 48 6212 aw148015 AVD_VAL_STR, /* avd contains a sting (*char) */ 49 6212 aw148015 AVD_VARVAL_STR, /* avd points to a string in a var_t */ 50 6212 aw148015 AVD_VAL_DBL, /* avd contains a double float */ 51 6212 aw148015 AVD_VARVAL_DBL, /* avd points to the double in a var_t */ 52 6212 aw148015 AVD_IND_VAR, /* avd points a var_t */ 53 6212 aw148015 AVD_IND_RANDVAR /* avd points to the randdist_t associated */ 54 6212 aw148015 /* with a random type var_t */ 55 6212 aw148015 } avd_type_t; 56 6212 aw148015 57 6212 aw148015 typedef uint64_t fbint_t; 58 6212 aw148015 59 6212 aw148015 /* Attribute Value Descriptor */ 60 6212 aw148015 typedef struct avd { 61 6212 aw148015 avd_type_t avd_type; 62 6212 aw148015 union { 63 6212 aw148015 boolean_t boolval; 64 6212 aw148015 boolean_t *boolptr; 65 6212 aw148015 fbint_t intval; 66 6212 aw148015 fbint_t *intptr; 67 6212 aw148015 double dblval; 68 6212 aw148015 double *dblptr; 69 6212 aw148015 char *strval; 70 6212 aw148015 char **strptr; 71 6212 aw148015 struct randdist *randptr; 72 6212 aw148015 struct var *varptr; 73 6212 aw148015 } avd_val; 74 6212 aw148015 } *avd_t; 75 6212 aw148015 76 7556 Andrew #define AVD_IS_RANDOM(vp) ((vp) && ((vp)->avd_type == AVD_IND_RANDVAR)) 77 7556 Andrew #define AVD_IS_STRING(vp) ((vp) && (((vp)->avd_type == AVD_VAL_STR) || \ 78 7556 Andrew ((vp)->avd_type == AVD_VARVAL_STR))) 79 7946 Andrew #define AVD_IS_VAR(vp) ((vp) && (((vp)->avd_type == AVD_IND_VAR) || \ 80 7946 Andrew ((vp)->avd_type == AVD_VARVAL_INT) || \ 81 7946 Andrew ((vp)->avd_type == AVD_VARVAL_DBL))) 82 5184 ek110237 83 5184 ek110237 typedef struct var { 84 5184 ek110237 char *var_name; 85 5184 ek110237 int var_type; 86 5184 ek110237 struct var *var_next; 87 6212 aw148015 union { 88 6212 aw148015 boolean_t boolean; 89 6212 aw148015 fbint_t integer; 90 6212 aw148015 double dbl_flt; 91 6212 aw148015 char *string; 92 6212 aw148015 struct randdist *randptr; 93 9801 Andrew struct var *varptr2; 94 6212 aw148015 } var_val; 95 9801 Andrew struct var *var_varptr1; 96 5184 ek110237 } var_t; 97 5184 ek110237 98 9801 Andrew /* basic var types */ 99 9801 Andrew #define VAR_TYPE_GLOBAL 0x0000 /* global variable */ 100 9801 Andrew #define VAR_TYPE_DYNAMIC 0x1000 /* Dynamic variable */ 101 9801 Andrew #define VAR_TYPE_RANDOM 0x2000 /* random variable */ 102 9801 Andrew #define VAR_TYPE_LOCAL 0x3000 /* Local variable */ 103 9801 Andrew #define VAR_TYPE_MASK 0xf000 104 9801 Andrew 105 9801 Andrew /* various var subtypes that a var can be set to */ 106 9801 Andrew #define VAR_TYPE_BOOL_SET 0x0100 /* var contains a boolean */ 107 9801 Andrew #define VAR_TYPE_INT_SET 0x0200 /* var contains an integer */ 108 9801 Andrew #define VAR_TYPE_STR_SET 0x0300 /* var contains a string */ 109 9801 Andrew #define VAR_TYPE_DBL_SET 0x0400 /* var contains a double */ 110 9801 Andrew #define VAR_TYPE_RAND_SET 0x0500 /* var contains a randdist pointer */ 111 9801 Andrew #define VAR_TYPE_INDVAR_SET 0x0700 /* var points to another variable(s) */ 112 9801 Andrew #define VAR_TYPE_SET_MASK 0x0f00 113 9801 Andrew 114 9801 Andrew /* indirection to another variable or variables with binary op */ 115 9801 Andrew #define VAR_IND_ASSIGN 0x0000 /* just assignment to another var */ 116 9801 Andrew #define VAR_IND_BINOP_INT 0x0010 /* binary op with an integer */ 117 9801 Andrew #define VAR_IND_BINOP_DBL 0x0020 /* binary op with a double float */ 118 9801 Andrew #define VAR_IND_BINOP_VAR 0x0030 /* binary op with another var */ 119 9801 Andrew #define VAR_INDBINOP_MASK 0x00f0 120 9801 Andrew 121 9801 Andrew 122 9801 Andrew #define VAR_IND_VAR_SUM_VC 0x0001 /* var sums var | cnst and *varptr1 */ 123 9801 Andrew #define VAR_IND_VAR_DIF_VC 0x0002 /* var subs var | cnst and *varptr1 */ 124 9801 Andrew #define VAR_IND_C_DIF_VAR 0x0003 /* var subs *varptr1 and constant */ 125 9801 Andrew #define VAR_IND_VAR_MUL_VC 0x0005 /* var muls var | cnst and *varptr1 */ 126 9801 Andrew #define VAR_IND_VAR_DIV_VC 0x0006 /* var divs var | cnst by *varptr1 */ 127 9801 Andrew #define VAR_IND_C_DIV_VAR 0x0007 /* var divs *varptr1 by constant */ 128 9801 Andrew #define VAR_INDVAR_MASK 0x000f 129 9801 Andrew 130 9801 Andrew /* Binary ops between an integer and a variable */ 131 9801 Andrew #define VAR_IND_INT_SUM_IV (VAR_IND_BINOP_INT | VAR_IND_VAR_SUM_VC) 132 9801 Andrew #define VAR_IND_IV_DIF_INT (VAR_IND_BINOP_INT | VAR_IND_VAR_DIF_VC) 133 9801 Andrew #define VAR_IND_INT_DIF_IV (VAR_IND_BINOP_INT | VAR_IND_C_DIF_VAR) 134 9801 Andrew #define VAR_IND_INT_MUL_IV (VAR_IND_BINOP_INT | VAR_IND_VAR_MUL_VC) 135 9801 Andrew #define VAR_IND_IV_DIV_INT (VAR_IND_BINOP_INT | VAR_IND_VAR_DIV_VC) 136 9801 Andrew #define VAR_IND_INT_DIV_IV (VAR_IND_BINOP_INT | VAR_IND_C_DIV_VAR) 137 9801 Andrew 138 9801 Andrew /* Binary ops between a double float and a variable */ 139 9801 Andrew #define VAR_IND_DBL_SUM_IV (VAR_IND_BINOP_DBL | VAR_IND_VAR_SUM_VC) 140 9801 Andrew #define VAR_IND_IV_DIF_DBL (VAR_IND_BINOP_DBL | VAR_IND_VAR_DIF_VC) 141 9801 Andrew #define VAR_IND_DBL_DIF_IV (VAR_IND_BINOP_DBL | VAR_IND_C_DIF_VAR) 142 9801 Andrew #define VAR_IND_DBL_MUL_IV (VAR_IND_BINOP_DBL | VAR_IND_VAR_MUL_VC) 143 9801 Andrew #define VAR_IND_IV_DIV_DBL (VAR_IND_BINOP_DBL | VAR_IND_VAR_DIV_VC) 144 9801 Andrew #define VAR_IND_DBL_DIV_IV (VAR_IND_BINOP_DBL | VAR_IND_C_DIV_VAR) 145 9801 Andrew 146 9801 Andrew /* Binary ops between two variables: varptr2 op varptr1 */ 147 9801 Andrew #define VAR_IND_IV_SUM_IV (VAR_IND_BINOP_VAR | VAR_IND_VAR_SUM_VC) 148 9801 Andrew #define VAR_IND_IV_DIF_IV (VAR_IND_BINOP_VAR | VAR_IND_VAR_DIF_VC) 149 9801 Andrew #define VAR_IND_IV_MUL_IV (VAR_IND_BINOP_VAR | VAR_IND_VAR_MUL_VC) 150 9801 Andrew #define VAR_IND_IV_DIV_IV (VAR_IND_BINOP_VAR | VAR_IND_VAR_DIV_VC) 151 5184 ek110237 152 6212 aw148015 #define VAR_HAS_BOOLEAN(vp) \ 153 6212 aw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_BOOL_SET) 154 6212 aw148015 155 6212 aw148015 #define VAR_HAS_INTEGER(vp) \ 156 6212 aw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_INT_SET) 157 6212 aw148015 158 6212 aw148015 #define VAR_HAS_DOUBLE(vp) \ 159 6212 aw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_DBL_SET) 160 6212 aw148015 161 6212 aw148015 #define VAR_HAS_STRING(vp) \ 162 6212 aw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_STR_SET) 163 6212 aw148015 164 6212 aw148015 #define VAR_HAS_RANDDIST(vp) \ 165 6212 aw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_RAND_SET) 166 6550 aw148015 167 6550 aw148015 #define VAR_HAS_INDVAR(vp) \ 168 9801 Andrew ((((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_INDVAR_SET) && \ 169 9801 Andrew (((vp)->var_type & VAR_INDBINOP_MASK) == VAR_IND_ASSIGN)) 170 9801 Andrew 171 9801 Andrew #define VAR_HAS_BINOP(vp) \ 172 9801 Andrew ((((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_INDVAR_SET) && \ 173 9801 Andrew (((vp)->var_type & VAR_INDBINOP_MASK) != VAR_IND_ASSIGN)) 174 6212 aw148015 175 6212 aw148015 #define VAR_SET_BOOL(vp, val) \ 176 6212 aw148015 { \ 177 6212 aw148015 (vp)->var_val.boolean = (val); \ 178 6212 aw148015 (vp)->var_type = \ 179 6212 aw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | VAR_TYPE_BOOL_SET);\ 180 6212 aw148015 } 181 6212 aw148015 182 6212 aw148015 #define VAR_SET_INT(vp, val) \ 183 6212 aw148015 { \ 184 6212 aw148015 (vp)->var_val.integer = (val); \ 185 6212 aw148015 (vp)->var_type = \ 186 6212 aw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | VAR_TYPE_INT_SET); \ 187 6212 aw148015 } 188 6212 aw148015 189 6212 aw148015 #define VAR_SET_DBL(vp, val) \ 190 6212 aw148015 { \ 191 6212 aw148015 (vp)->var_val.dbl_flt = (val); \ 192 6212 aw148015 (vp)->var_type = \ 193 6550 aw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | \ 194 6550 aw148015 VAR_TYPE_DBL_SET); \ 195 6212 aw148015 } 196 6212 aw148015 197 6212 aw148015 #define VAR_SET_STR(vp, val) \ 198 6212 aw148015 { \ 199 6212 aw148015 (vp)->var_val.string = (val); \ 200 6212 aw148015 (vp)->var_type = \ 201 6550 aw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | \ 202 6550 aw148015 VAR_TYPE_STR_SET); \ 203 6212 aw148015 } 204 6212 aw148015 205 6212 aw148015 #define VAR_SET_RAND(vp, val) \ 206 6212 aw148015 { \ 207 6212 aw148015 (vp)->var_val.randptr = (val); \ 208 6212 aw148015 (vp)->var_type = \ 209 6550 aw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | \ 210 6550 aw148015 VAR_TYPE_RAND_SET); \ 211 6550 aw148015 } 212 6550 aw148015 213 6550 aw148015 #define VAR_SET_INDVAR(vp, val) \ 214 6550 aw148015 { \ 215 9801 Andrew (vp)->var_varptr1 = (val); \ 216 6550 aw148015 (vp)->var_type = \ 217 9801 Andrew (((vp)->var_type & (~(VAR_TYPE_SET_MASK | \ 218 9801 Andrew VAR_INDVAR_MASK))) | \ 219 6550 aw148015 VAR_TYPE_INDVAR_SET); \ 220 9801 Andrew } 221 9801 Andrew 222 9801 Andrew #define VAR_SET_BINOP_INDVAR(vp, val, st) \ 223 9801 Andrew { \ 224 9801 Andrew (vp)->var_varptr1 = (val); \ 225 9801 Andrew (vp)->var_type = \ 226 9801 Andrew (((vp)->var_type & (~(VAR_TYPE_SET_MASK | \ 227 9801 Andrew VAR_INDVAR_MASK))) | \ 228 9801 Andrew (VAR_TYPE_INDVAR_SET | st)); \ 229 6212 aw148015 } 230 6212 aw148015 231 6212 aw148015 avd_t avd_bool_alloc(boolean_t bool); 232 6212 aw148015 avd_t avd_int_alloc(fbint_t integer); 233 6212 aw148015 avd_t avd_str_alloc(char *string); 234 6550 aw148015 boolean_t avd_get_bool(avd_t); 235 6550 aw148015 fbint_t avd_get_int(avd_t); 236 6550 aw148015 double avd_get_dbl(avd_t); 237 6550 aw148015 char *avd_get_str(avd_t); 238 6550 aw148015 void avd_update(avd_t *avdp, var_t *lvar_list); 239 6212 aw148015 avd_t var_ref_attr(char *name); 240 6212 aw148015 int var_assign_boolean(char *name, boolean_t bool); 241 6212 aw148015 int var_assign_integer(char *name, fbint_t integer); 242 6550 aw148015 int var_assign_double(char *name, double dbl); 243 5184 ek110237 int var_assign_string(char *name, char *string); 244 5184 ek110237 int var_assign_var(char *name, char *string); 245 9801 Andrew int var_assign_op_var_int(char *name, int optype, char *src1, fbint_t src2); 246 9801 Andrew int var_assign_op_var_var(char *name, int optype, char *src1, char *src2); 247 6550 aw148015 void var_update_comp_lvars(var_t *newlvar, var_t *proto_comp_vars, 248 6550 aw148015 var_t *mstr_lvars); 249 6212 aw148015 var_t *var_define_randvar(char *name); 250 6212 aw148015 var_t *var_find_randvar(char *name); 251 6212 aw148015 boolean_t var_to_boolean(char *name); 252 6212 aw148015 fbint_t var_to_integer(char *name); 253 9801 Andrew double var_to_double(char *name); 254 6550 aw148015 var_t *var_lvar_alloc_local(char *name); 255 6550 aw148015 var_t *var_lvar_assign_boolean(char *name, boolean_t); 256 6550 aw148015 var_t *var_lvar_assign_integer(char *name, fbint_t); 257 6550 aw148015 var_t *var_lvar_assign_double(char *name, double); 258 6550 aw148015 var_t *var_lvar_assign_string(char *name, char *string); 259 6550 aw148015 var_t *var_lvar_assign_var(char *name, char *src_name); 260 5184 ek110237 char *var_to_string(char *name); 261 6212 aw148015 char *var_randvar_to_string(char *name, int param); 262 6212 aw148015 int var_is_set4_randvar(char *name); 263 5184 ek110237 264 5184 ek110237 #ifdef __cplusplus 265 5184 ek110237 } 266 5184 ek110237 #endif 267 5184 ek110237 268 5184 ek110237 #endif /* _FB_VARS_H */ 269