15184Sek110237 /* 25184Sek110237 * CDDL HEADER START 35184Sek110237 * 45184Sek110237 * The contents of this file are subject to the terms of the 55184Sek110237 * Common Development and Distribution License (the "License"). 65184Sek110237 * You may not use this file except in compliance with the License. 75184Sek110237 * 85184Sek110237 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 95184Sek110237 * or http://www.opensolaris.org/os/licensing. 105184Sek110237 * See the License for the specific language governing permissions 115184Sek110237 * and limitations under the License. 125184Sek110237 * 135184Sek110237 * When distributing Covered Code, include this CDDL HEADER in each 145184Sek110237 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 155184Sek110237 * If applicable, add the following below this CDDL HEADER, with the 165184Sek110237 * fields enclosed by brackets "[]" replaced with your own identifying 175184Sek110237 * information: Portions Copyright [yyyy] [name of copyright owner] 185184Sek110237 * 195184Sek110237 * CDDL HEADER END 205184Sek110237 */ 215184Sek110237 /* 22*9801SAndrew.W.Wilson@sun.com * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 235184Sek110237 * Use is subject to license terms. 245184Sek110237 */ 255184Sek110237 265184Sek110237 #ifndef _FB_VARS_H 275184Sek110237 #define _FB_VARS_H 285184Sek110237 295184Sek110237 #include "config.h" 305184Sek110237 315184Sek110237 #include <stdio.h> 325184Sek110237 #include <sys/types.h> 335184Sek110237 #ifdef HAVE_STDINT_H 345184Sek110237 #include <stdint.h> 355184Sek110237 #endif 365184Sek110237 375184Sek110237 #ifdef __cplusplus 385184Sek110237 extern "C" { 395184Sek110237 #endif 405184Sek110237 416212Saw148015 /* Attribute Value Descriptor types */ 426212Saw148015 typedef enum avd_type { 436212Saw148015 AVD_INVALID = 0, /* avd is empty */ 446212Saw148015 AVD_VAL_BOOL, /* avd contains a boolean_t */ 456212Saw148015 AVD_VARVAL_BOOL, /* avd points to the boolean_t in a var_t */ 466212Saw148015 AVD_VAL_INT, /* avd contains an fbint_t */ 476212Saw148015 AVD_VARVAL_INT, /* avd points to the fbint_t in a var_t */ 486212Saw148015 AVD_VAL_STR, /* avd contains a sting (*char) */ 496212Saw148015 AVD_VARVAL_STR, /* avd points to a string in a var_t */ 506212Saw148015 AVD_VAL_DBL, /* avd contains a double float */ 516212Saw148015 AVD_VARVAL_DBL, /* avd points to the double in a var_t */ 526212Saw148015 AVD_IND_VAR, /* avd points a var_t */ 536212Saw148015 AVD_IND_RANDVAR /* avd points to the randdist_t associated */ 546212Saw148015 /* with a random type var_t */ 556212Saw148015 } avd_type_t; 566212Saw148015 576212Saw148015 typedef uint64_t fbint_t; 586212Saw148015 596212Saw148015 /* Attribute Value Descriptor */ 606212Saw148015 typedef struct avd { 616212Saw148015 avd_type_t avd_type; 626212Saw148015 union { 636212Saw148015 boolean_t boolval; 646212Saw148015 boolean_t *boolptr; 656212Saw148015 fbint_t intval; 666212Saw148015 fbint_t *intptr; 676212Saw148015 double dblval; 686212Saw148015 double *dblptr; 696212Saw148015 char *strval; 706212Saw148015 char **strptr; 716212Saw148015 struct randdist *randptr; 726212Saw148015 struct var *varptr; 736212Saw148015 } avd_val; 746212Saw148015 } *avd_t; 756212Saw148015 767556SAndrew.W.Wilson@sun.com #define AVD_IS_RANDOM(vp) ((vp) && ((vp)->avd_type == AVD_IND_RANDVAR)) 777556SAndrew.W.Wilson@sun.com #define AVD_IS_STRING(vp) ((vp) && (((vp)->avd_type == AVD_VAL_STR) || \ 787556SAndrew.W.Wilson@sun.com ((vp)->avd_type == AVD_VARVAL_STR))) 797946SAndrew.W.Wilson@sun.com #define AVD_IS_VAR(vp) ((vp) && (((vp)->avd_type == AVD_IND_VAR) || \ 807946SAndrew.W.Wilson@sun.com ((vp)->avd_type == AVD_VARVAL_INT) || \ 817946SAndrew.W.Wilson@sun.com ((vp)->avd_type == AVD_VARVAL_DBL))) 825184Sek110237 835184Sek110237 typedef struct var { 845184Sek110237 char *var_name; 855184Sek110237 int var_type; 865184Sek110237 struct var *var_next; 876212Saw148015 union { 886212Saw148015 boolean_t boolean; 896212Saw148015 fbint_t integer; 906212Saw148015 double dbl_flt; 916212Saw148015 char *string; 926212Saw148015 struct randdist *randptr; 93*9801SAndrew.W.Wilson@sun.com struct var *varptr2; 946212Saw148015 } var_val; 95*9801SAndrew.W.Wilson@sun.com struct var *var_varptr1; 965184Sek110237 } var_t; 975184Sek110237 98*9801SAndrew.W.Wilson@sun.com /* basic var types */ 99*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_GLOBAL 0x0000 /* global variable */ 100*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_DYNAMIC 0x1000 /* Dynamic variable */ 101*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_RANDOM 0x2000 /* random variable */ 102*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_LOCAL 0x3000 /* Local variable */ 103*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_MASK 0xf000 104*9801SAndrew.W.Wilson@sun.com 105*9801SAndrew.W.Wilson@sun.com /* various var subtypes that a var can be set to */ 106*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_BOOL_SET 0x0100 /* var contains a boolean */ 107*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_INT_SET 0x0200 /* var contains an integer */ 108*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_STR_SET 0x0300 /* var contains a string */ 109*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_DBL_SET 0x0400 /* var contains a double */ 110*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_RAND_SET 0x0500 /* var contains a randdist pointer */ 111*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_INDVAR_SET 0x0700 /* var points to another variable(s) */ 112*9801SAndrew.W.Wilson@sun.com #define VAR_TYPE_SET_MASK 0x0f00 113*9801SAndrew.W.Wilson@sun.com 114*9801SAndrew.W.Wilson@sun.com /* indirection to another variable or variables with binary op */ 115*9801SAndrew.W.Wilson@sun.com #define VAR_IND_ASSIGN 0x0000 /* just assignment to another var */ 116*9801SAndrew.W.Wilson@sun.com #define VAR_IND_BINOP_INT 0x0010 /* binary op with an integer */ 117*9801SAndrew.W.Wilson@sun.com #define VAR_IND_BINOP_DBL 0x0020 /* binary op with a double float */ 118*9801SAndrew.W.Wilson@sun.com #define VAR_IND_BINOP_VAR 0x0030 /* binary op with another var */ 119*9801SAndrew.W.Wilson@sun.com #define VAR_INDBINOP_MASK 0x00f0 120*9801SAndrew.W.Wilson@sun.com 121*9801SAndrew.W.Wilson@sun.com 122*9801SAndrew.W.Wilson@sun.com #define VAR_IND_VAR_SUM_VC 0x0001 /* var sums var | cnst and *varptr1 */ 123*9801SAndrew.W.Wilson@sun.com #define VAR_IND_VAR_DIF_VC 0x0002 /* var subs var | cnst and *varptr1 */ 124*9801SAndrew.W.Wilson@sun.com #define VAR_IND_C_DIF_VAR 0x0003 /* var subs *varptr1 and constant */ 125*9801SAndrew.W.Wilson@sun.com #define VAR_IND_VAR_MUL_VC 0x0005 /* var muls var | cnst and *varptr1 */ 126*9801SAndrew.W.Wilson@sun.com #define VAR_IND_VAR_DIV_VC 0x0006 /* var divs var | cnst by *varptr1 */ 127*9801SAndrew.W.Wilson@sun.com #define VAR_IND_C_DIV_VAR 0x0007 /* var divs *varptr1 by constant */ 128*9801SAndrew.W.Wilson@sun.com #define VAR_INDVAR_MASK 0x000f 129*9801SAndrew.W.Wilson@sun.com 130*9801SAndrew.W.Wilson@sun.com /* Binary ops between an integer and a variable */ 131*9801SAndrew.W.Wilson@sun.com #define VAR_IND_INT_SUM_IV (VAR_IND_BINOP_INT | VAR_IND_VAR_SUM_VC) 132*9801SAndrew.W.Wilson@sun.com #define VAR_IND_IV_DIF_INT (VAR_IND_BINOP_INT | VAR_IND_VAR_DIF_VC) 133*9801SAndrew.W.Wilson@sun.com #define VAR_IND_INT_DIF_IV (VAR_IND_BINOP_INT | VAR_IND_C_DIF_VAR) 134*9801SAndrew.W.Wilson@sun.com #define VAR_IND_INT_MUL_IV (VAR_IND_BINOP_INT | VAR_IND_VAR_MUL_VC) 135*9801SAndrew.W.Wilson@sun.com #define VAR_IND_IV_DIV_INT (VAR_IND_BINOP_INT | VAR_IND_VAR_DIV_VC) 136*9801SAndrew.W.Wilson@sun.com #define VAR_IND_INT_DIV_IV (VAR_IND_BINOP_INT | VAR_IND_C_DIV_VAR) 137*9801SAndrew.W.Wilson@sun.com 138*9801SAndrew.W.Wilson@sun.com /* Binary ops between a double float and a variable */ 139*9801SAndrew.W.Wilson@sun.com #define VAR_IND_DBL_SUM_IV (VAR_IND_BINOP_DBL | VAR_IND_VAR_SUM_VC) 140*9801SAndrew.W.Wilson@sun.com #define VAR_IND_IV_DIF_DBL (VAR_IND_BINOP_DBL | VAR_IND_VAR_DIF_VC) 141*9801SAndrew.W.Wilson@sun.com #define VAR_IND_DBL_DIF_IV (VAR_IND_BINOP_DBL | VAR_IND_C_DIF_VAR) 142*9801SAndrew.W.Wilson@sun.com #define VAR_IND_DBL_MUL_IV (VAR_IND_BINOP_DBL | VAR_IND_VAR_MUL_VC) 143*9801SAndrew.W.Wilson@sun.com #define VAR_IND_IV_DIV_DBL (VAR_IND_BINOP_DBL | VAR_IND_VAR_DIV_VC) 144*9801SAndrew.W.Wilson@sun.com #define VAR_IND_DBL_DIV_IV (VAR_IND_BINOP_DBL | VAR_IND_C_DIV_VAR) 145*9801SAndrew.W.Wilson@sun.com 146*9801SAndrew.W.Wilson@sun.com /* Binary ops between two variables: varptr2 op varptr1 */ 147*9801SAndrew.W.Wilson@sun.com #define VAR_IND_IV_SUM_IV (VAR_IND_BINOP_VAR | VAR_IND_VAR_SUM_VC) 148*9801SAndrew.W.Wilson@sun.com #define VAR_IND_IV_DIF_IV (VAR_IND_BINOP_VAR | VAR_IND_VAR_DIF_VC) 149*9801SAndrew.W.Wilson@sun.com #define VAR_IND_IV_MUL_IV (VAR_IND_BINOP_VAR | VAR_IND_VAR_MUL_VC) 150*9801SAndrew.W.Wilson@sun.com #define VAR_IND_IV_DIV_IV (VAR_IND_BINOP_VAR | VAR_IND_VAR_DIV_VC) 1516212Saw148015 1526212Saw148015 #define VAR_HAS_BOOLEAN(vp) \ 1536212Saw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_BOOL_SET) 1546212Saw148015 1556212Saw148015 #define VAR_HAS_INTEGER(vp) \ 1566212Saw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_INT_SET) 1576212Saw148015 1586212Saw148015 #define VAR_HAS_DOUBLE(vp) \ 1596212Saw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_DBL_SET) 1606212Saw148015 1616212Saw148015 #define VAR_HAS_STRING(vp) \ 1626212Saw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_STR_SET) 1636212Saw148015 1646212Saw148015 #define VAR_HAS_RANDDIST(vp) \ 1656212Saw148015 (((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_RAND_SET) 1666212Saw148015 1676550Saw148015 #define VAR_HAS_INDVAR(vp) \ 168*9801SAndrew.W.Wilson@sun.com ((((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_INDVAR_SET) && \ 169*9801SAndrew.W.Wilson@sun.com (((vp)->var_type & VAR_INDBINOP_MASK) == VAR_IND_ASSIGN)) 170*9801SAndrew.W.Wilson@sun.com 171*9801SAndrew.W.Wilson@sun.com #define VAR_HAS_BINOP(vp) \ 172*9801SAndrew.W.Wilson@sun.com ((((vp)->var_type & VAR_TYPE_SET_MASK) == VAR_TYPE_INDVAR_SET) && \ 173*9801SAndrew.W.Wilson@sun.com (((vp)->var_type & VAR_INDBINOP_MASK) != VAR_IND_ASSIGN)) 1746550Saw148015 1756212Saw148015 #define VAR_SET_BOOL(vp, val) \ 1766212Saw148015 { \ 1776212Saw148015 (vp)->var_val.boolean = (val); \ 1786212Saw148015 (vp)->var_type = \ 1796212Saw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | VAR_TYPE_BOOL_SET);\ 1806212Saw148015 } 1815184Sek110237 1826212Saw148015 #define VAR_SET_INT(vp, val) \ 1836212Saw148015 { \ 1846212Saw148015 (vp)->var_val.integer = (val); \ 1856212Saw148015 (vp)->var_type = \ 1866212Saw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | VAR_TYPE_INT_SET); \ 1876212Saw148015 } 1886212Saw148015 1896212Saw148015 #define VAR_SET_DBL(vp, val) \ 1906212Saw148015 { \ 1916212Saw148015 (vp)->var_val.dbl_flt = (val); \ 1926212Saw148015 (vp)->var_type = \ 1936550Saw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | \ 1946550Saw148015 VAR_TYPE_DBL_SET); \ 1956212Saw148015 } 1966212Saw148015 1976212Saw148015 #define VAR_SET_STR(vp, val) \ 1986212Saw148015 { \ 1996212Saw148015 (vp)->var_val.string = (val); \ 2006212Saw148015 (vp)->var_type = \ 2016550Saw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | \ 2026550Saw148015 VAR_TYPE_STR_SET); \ 2036212Saw148015 } 2046212Saw148015 2056212Saw148015 #define VAR_SET_RAND(vp, val) \ 2066212Saw148015 { \ 2076212Saw148015 (vp)->var_val.randptr = (val); \ 2086212Saw148015 (vp)->var_type = \ 2096550Saw148015 (((vp)->var_type & (~VAR_TYPE_SET_MASK)) | \ 2106550Saw148015 VAR_TYPE_RAND_SET); \ 2116550Saw148015 } 2126550Saw148015 2136550Saw148015 #define VAR_SET_INDVAR(vp, val) \ 2146550Saw148015 { \ 215*9801SAndrew.W.Wilson@sun.com (vp)->var_varptr1 = (val); \ 2166550Saw148015 (vp)->var_type = \ 217*9801SAndrew.W.Wilson@sun.com (((vp)->var_type & (~(VAR_TYPE_SET_MASK | \ 218*9801SAndrew.W.Wilson@sun.com VAR_INDVAR_MASK))) | \ 2196550Saw148015 VAR_TYPE_INDVAR_SET); \ 2206212Saw148015 } 2216212Saw148015 222*9801SAndrew.W.Wilson@sun.com #define VAR_SET_BINOP_INDVAR(vp, val, st) \ 223*9801SAndrew.W.Wilson@sun.com { \ 224*9801SAndrew.W.Wilson@sun.com (vp)->var_varptr1 = (val); \ 225*9801SAndrew.W.Wilson@sun.com (vp)->var_type = \ 226*9801SAndrew.W.Wilson@sun.com (((vp)->var_type & (~(VAR_TYPE_SET_MASK | \ 227*9801SAndrew.W.Wilson@sun.com VAR_INDVAR_MASK))) | \ 228*9801SAndrew.W.Wilson@sun.com (VAR_TYPE_INDVAR_SET | st)); \ 229*9801SAndrew.W.Wilson@sun.com } 230*9801SAndrew.W.Wilson@sun.com 2316212Saw148015 avd_t avd_bool_alloc(boolean_t bool); 2326212Saw148015 avd_t avd_int_alloc(fbint_t integer); 2336212Saw148015 avd_t avd_str_alloc(char *string); 2346550Saw148015 boolean_t avd_get_bool(avd_t); 2356550Saw148015 fbint_t avd_get_int(avd_t); 2366550Saw148015 double avd_get_dbl(avd_t); 2376550Saw148015 char *avd_get_str(avd_t); 2386550Saw148015 void avd_update(avd_t *avdp, var_t *lvar_list); 2396212Saw148015 avd_t var_ref_attr(char *name); 2406212Saw148015 int var_assign_boolean(char *name, boolean_t bool); 2416212Saw148015 int var_assign_integer(char *name, fbint_t integer); 2426550Saw148015 int var_assign_double(char *name, double dbl); 2435184Sek110237 int var_assign_string(char *name, char *string); 2445184Sek110237 int var_assign_var(char *name, char *string); 245*9801SAndrew.W.Wilson@sun.com int var_assign_op_var_int(char *name, int optype, char *src1, fbint_t src2); 246*9801SAndrew.W.Wilson@sun.com int var_assign_op_var_var(char *name, int optype, char *src1, char *src2); 2476550Saw148015 void var_update_comp_lvars(var_t *newlvar, var_t *proto_comp_vars, 2486550Saw148015 var_t *mstr_lvars); 2496212Saw148015 var_t *var_define_randvar(char *name); 2506212Saw148015 var_t *var_find_randvar(char *name); 2516212Saw148015 boolean_t var_to_boolean(char *name); 2526212Saw148015 fbint_t var_to_integer(char *name); 253*9801SAndrew.W.Wilson@sun.com double var_to_double(char *name); 2546550Saw148015 var_t *var_lvar_alloc_local(char *name); 2556550Saw148015 var_t *var_lvar_assign_boolean(char *name, boolean_t); 2566550Saw148015 var_t *var_lvar_assign_integer(char *name, fbint_t); 2576550Saw148015 var_t *var_lvar_assign_double(char *name, double); 2586550Saw148015 var_t *var_lvar_assign_string(char *name, char *string); 2596550Saw148015 var_t *var_lvar_assign_var(char *name, char *src_name); 2605184Sek110237 char *var_to_string(char *name); 2616212Saw148015 char *var_randvar_to_string(char *name, int param); 2626212Saw148015 int var_is_set4_randvar(char *name); 2635184Sek110237 2645184Sek110237 #ifdef __cplusplus 2655184Sek110237 } 2665184Sek110237 #endif 2675184Sek110237 2685184Sek110237 #endif /* _FB_VARS_H */ 269