00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef CUEX_PVAR_H
00019 #define CUEX_PVAR_H
00020
00021 #include <cuex/fwd.h>
00022 #include <cuex/ex.h>
00023 #include <cuex/var.h>
00024
00025 CU_BEGIN_DECLARATIONS
00026
00027
00028
00029
00030
00031
00032 #define cuex_pvarmeta(qcode) cuex_varmeta_kqi(cuex_varkind_pvar, qcode, 0)
00033
00034
00035 #define cuex_meta_is_pvarmeta(meta) \
00036 cuex_is_varmeta_k(meta, cuex_varkind_pvar)
00037
00038
00039 #define cuex_meta_is_pvarmeta_q(meta, qcode) \
00040 cuex_is_varmeta_kq(meta, cuex_varkind_pvar, qcode)
00041
00042
00043 #define cuex_meta_is_pvarmeta_u(meta) \
00044 cuex_meta_is_pvarmeta_q(meta, cuex_qcode_u)
00045
00046 #define cuex_meta_is_pvarmeta_e(meta) \
00047 cuex_meta_is_pvarmeta_q(meta, cuex_qcode_e)
00048
00049 #define cuex_meta_is_pvarmeta_w(meta) \
00050 cuex_meta_is_pvarmeta_q(meta, cuex_qcode_w)
00051
00052 #define cuex_meta_is_pvarmeta_n(meta) \
00053 cuex_meta_is_pvarmeta_q(meta, cuex_qcode_n)
00054
00055 #define cuex_qcode_unknown cuex_qcode_n
00056 #define cuex_qcode_na cuex_qcode_n
00057 #define cuex_qcode_arg cuex_qcode_n
00058 #define cuex_qcode_uniq cuex_qcode_n
00059 #define cuex_qcode_active_s cuex_qcode_u
00060 #define cuex_qcode_active_w cuex_qcode_w
00061 #define cuex_qcode_passive cuex_qcode_e
00062
00063 char const *cuex_qcode_name(cuex_qcode_t quant);
00064
00065 struct cuex_pvar
00066 {
00067 CUOO_OBJ
00068 cu_offset_t offset;
00069 void *module;
00070 cu_idr_t idr;
00071 cuex_t type;
00072 cuex_pvar_t var_chain;
00073 };
00074
00075
00076 cuex_pvar_t cuex_pvar_new(cuex_qcode_t qcode);
00077
00078
00079
00080 cuex_pvar_t cuex_pvar_new_named(cuex_qcode_t qcode, char const *print_str);
00081
00082 #define cuex_pvar_from_ex(ex) ((cuex_pvar_t)(ex))
00083 #define cuex_pvar_to_ex(var) ((cuex_t)(var))
00084 #define cuex_pvar_from_var(v) ((cuex_pvar_t)(v))
00085 #define cuex_pvar_to_var(v) ((cuex_var_t)(v))
00086
00087
00088 CU_SINLINE cuex_qcode_t
00089 cuex_pvar_qcode(cuex_pvar_t var)
00090 { return cuex_varmeta_qcode(cuex_meta(var)); }
00091
00092 CU_SINLINE void
00093 cuex_pvar_set_static_type(cuex_pvar_t var, cuex_t type)
00094 { var->type = type; }
00095
00096 CU_SINLINE cuex_t
00097 cuex_pvar_static_type(cuex_pvar_t var)
00098 { return var->type; }
00099
00100 CU_SINLINE cu_offset_t
00101 cuex_pvar_offset(cuex_pvar_t var)
00102 {
00103 assert(var->offset != (cu_offset_t)-1);
00104 return var->offset;
00105 }
00106
00107 cu_bool_t cuex_pvar_has_offset(cuex_pvar_t);
00108 #define cuex_pvar_has_offset(var) \
00109 (CU_MARG(cuex_pvar_t, var)->offset != (cu_offset_t)-1)
00110
00111
00112 CU_SINLINE void *cuex_pvar_module(cuex_pvar_t var) { return var->module; }
00113
00114 CU_SINLINE cu_idr_t
00115 cuex_pvar_idr(cuex_pvar_t var) { return var->idr; }
00116
00117
00118 void cuex_pvar_set_module(cuex_pvar_t var, void *M, cu_idr_t idr);
00119
00120 cu_str_t cuex_pvar_name(cuex_pvar_t var);
00121
00122 cuex_t cuex_pvar_qname(cuex_pvar_t var);
00123
00124 cu_idr_t cuex_pvar_qidr(cuex_pvar_t var);
00125
00126
00127 CU_END_DECLARATIONS
00128 #endif