00001
00008 #ifndef _CLASS_H
00009 #define _CLASS_H
00010
00011 #include <stdarg.h>
00012 #include <stdlib.h>
00013 #include <stdio.h>
00014 #include <string.h>
00015 #include <errno.h>
00016 #include <time.h>
00017
00018 #include "platform.h"
00019 #include "complex.h"
00020 #include "unit.h"
00021
00022 typedef struct s_class_list CLASS;
00023
00024
00025 typedef char char1024[1025];
00026 typedef char char256[257];
00027 typedef char char32[33];
00028 typedef char char8[9];
00029 typedef char int8;
00030 typedef short int16;
00031 typedef int int32;
00032 typedef long enumeration;
00033 typedef struct s_object_list* object;
00034 typedef unsigned int64 set;
00035 typedef double triplet[3];
00036 typedef complex triplex[3];
00037 #ifdef REAL4
00038 typedef float real;
00039 #else
00040 typedef double real;
00041 #endif
00042
00043 #ifndef __cplusplus
00044 #ifndef true
00045 typedef unsigned char bool;
00046 #define true (1)
00047 #define false (0)
00048 #endif
00049 #endif
00050
00051
00052
00053
00054
00055 typedef struct s_delegatedtype
00056 {
00057 char32 type;
00058 CLASS *oclass;
00059 int (*from_string)(void *addr, char *value);
00060 int (*to_string)(void *addr, char *value, int size);
00061 } DELEGATEDTYPE;
00062 typedef struct s_delegatedvalue
00063 {
00064 char *data;
00065 DELEGATEDTYPE *type;
00066 } DELEGATEDVALUE;
00067 typedef DELEGATEDVALUE* delegated;
00068
00069
00070 typedef enum {_PT_FIRST=-1,
00071 PT_void,
00072 PT_double,
00073 PT_complex,
00074 PT_enumeration,
00075 PT_set,
00076 PT_int16,
00077 PT_int32,
00078 PT_int64,
00079 PT_char8,
00080 PT_char32,
00081 PT_char256,
00082 PT_char1024,
00083 PT_object,
00084 PT_delegated,
00085 PT_bool,
00086 PT_timestamp,
00087 PT_double_array,
00088 PT_complex_array,
00089
00090 PT_float,
00091 PT_real,
00092 PT_loadshape,
00093 PT_enduse,
00094 #ifdef USE_TRIPLETS
00095 PT_triple,
00096 PT_triplex,
00097 #endif
00098 _PT_LAST,
00099
00100 PT_AGGREGATE,
00101 PT_KEYWORD,
00102 PT_ACCESS,
00103 PT_SIZE,
00104 PT_FLAGS,
00105 PT_INHERIT,
00106 PT_UNITS,
00107 PT_DESCRIPTION,
00108 PT_EXTEND,
00109 PT_EXTENDBY,
00110 PT_DEPRECATED,
00111 } PROPERTYTYPE;
00112 typedef char CLASSNAME[64];
00113 typedef void* PROPERTYADDR;
00114 typedef char PROPERTYNAME[64];
00115 typedef char FUNCTIONNAME[64];
00116 typedef enum {
00117 PA_PUBLIC,
00118 PA_REFERENCE,
00119 PA_PROTECTED,
00120 PA_PRIVATE,
00121 } PROPERTYACCESS;
00122 typedef int64 (*FUNCTIONADDR)(void*,...);
00124
00125 typedef unsigned char PASSCONFIG;
00126 #define PC_NOSYNC 0x00
00127 #define PC_PRETOPDOWN 0x01
00128 #define PC_BOTTOMUP 0x02
00129 #define PC_POSTTOPDOWN 0x04
00130 #define PC_FORCE_NAME 0x20
00131 #define PC_PARENT_OVERRIDE_OMIT 0x40
00132 #define PC_UNSAFE_OVERRIDE_OMIT 0x80
00134 typedef enum {
00135 NM_PREUPDATE = 0,
00136 NM_POSTUPDATE = 1,
00137 NM_RESET = 2,
00138 } NOTIFYMODULE;
00140 typedef struct s_keyword {
00141 char name[32];
00142 unsigned int64 value;
00143 struct s_keyword *next;
00144 } KEYWORD;
00145
00146 typedef unsigned long PROPERTYFLAGS;
00147 #define PF_RECALC 0x0001
00148 #define PF_CHARSET 0x0002
00149 #define PT_EXTENDED 0x0004
00150 #define PF_DEPRECATED 0x8000
00151 #define PF_DEPRECATED_NONOTICE 0x04000
00153 typedef struct s_property_map {
00154 CLASS *oclass;
00155 PROPERTYNAME name;
00156 PROPERTYTYPE ptype;
00157 unsigned long size;
00158 PROPERTYACCESS access;
00159 UNIT *unit;
00160 PROPERTYADDR addr;
00161 DELEGATEDTYPE *delegation;
00162 KEYWORD *keywords;
00163 char *description;
00164 struct s_property_map *next;
00165 PROPERTYFLAGS flags;
00166 } PROPERTY;
00168 typedef struct s_function_map {
00169 CLASS *oclass;
00170 FUNCTIONNAME name;
00171 FUNCTIONADDR addr;
00172 struct s_function_map *next;
00173 } FUNCTION;
00174
00175
00176 #define SET_MASK 0xffff
00177 #define SET_ADD(set,value) (set = set | value )
00178 #define SET_DEL(set,value) (set = (value^SET_MASK)&set)
00179 #define SET_CLEAR(set) (set = 0)
00180 #define SET_HAS(set,value) (set & value)
00181
00182 typedef enum {CLASSVALID=0xc44d822e} CLASSMAGIC;
00183
00184 #define _MODULE_DEFINED_
00185 typedef struct s_module_list MODULE;
00186 struct s_class_list {
00187 CLASSMAGIC magic;
00188 CLASSNAME name;
00189 unsigned int size;
00190 MODULE *module;
00191 PROPERTY *pmap;
00192 FUNCTION *fmap;
00193 FUNCTIONADDR create;
00194 FUNCTIONADDR init;
00195 FUNCTIONADDR sync;
00196 FUNCTIONADDR commit;
00197 FUNCTIONADDR notify;
00198 FUNCTIONADDR isa;
00199 FUNCTIONADDR plc;
00200 PASSCONFIG passconfig;
00201 FUNCTIONADDR recalc;
00202 CLASS *parent;
00203 struct {
00204 int32 numobjs;
00205 int64 clocks;
00206 int32 count;
00207 } profiler;
00208 struct s_class_list *next;
00209 };
00210
00211 #ifdef __cplusplus
00212 extern "C" {
00213 #endif
00214
00215 PROPERTY *class_get_first_property(CLASS *oclass);
00216 PROPERTY *class_get_next_property(PROPERTY *prop);
00217 PROPERTY *class_prop_in_class(CLASS *oclass, PROPERTY *prop);
00218 PROPERTY *class_find_property(CLASS *oclass, PROPERTYNAME name);
00219 void class_add_property(CLASS *oclass, PROPERTY *prop);
00220 PROPERTY *class_add_extended_property(CLASS *oclass, char *name, PROPERTYTYPE ptype, char *unit);
00221 PROPERTYTYPE class_get_propertytype_from_typename(char *name);
00222 int class_string_to_property(PROPERTY *prop, void *addr, char *value);
00223 int class_string_to_propertytype(PROPERTYTYPE type, void *addr, char *value);
00224 int class_property_to_string(PROPERTY *prop, void *addr, char *value, int size);
00225 CLASS *class_get_first_class(void);
00226 CLASS *class_get_last_class(void);
00227 CLASS *class_get_class_from_classname(char *name);
00228 CLASS *class_get_class_from_classname_in_module(char *name, MODULE *mod);
00229 char *class_get_property_typename(PROPERTYTYPE type);
00230 int class_saveall(FILE *fp);
00231 int class_saveall_xml(FILE *fp);
00232 unsigned int class_get_count(void);
00233 void class_profiles(void);
00234 int class_get_xsd(CLASS *oclass, char *buffer, size_t len);
00235
00236 CLASS *class_register(MODULE *module,CLASSNAME classname,unsigned int datasize,PASSCONFIG passconfig);
00237 int class_define_map(CLASS *oclass, ...);
00238 int class_define_enumeration_member(CLASS *oclass,char *property_name,char *member,enumeration value);
00239 int class_define_set_member(CLASS *oclass,char *property_name,char *member,unsigned int64 value);
00240 FUNCTION *class_define_function(CLASS *oclass, FUNCTIONNAME functionname, FUNCTIONADDR call);
00241 FUNCTIONADDR class_get_function(char *classname, char *functionname);
00242 DELEGATEDTYPE *class_register_type(CLASS *oclass, char *type,int (*from_string)(void*,char*),int (*to_string)(void*,char*,int));
00243 int class_define_type(CLASS *oclass, DELEGATEDTYPE *delegation, ...);
00244
00245 unsigned long property_size(PROPERTY *prop);
00246 unsigned long property_size_by_type(PROPERTYTYPE type);
00247 int property_create(PROPERTY *prop, void *addr);
00248 PROPERTY *property_malloc(PROPERTYTYPE proptype, CLASS *oclass, char *name, void *addr, DELEGATEDTYPE *delegation);
00249
00250 #ifdef __cplusplus
00251 }
00252 #endif
00253
00254 #endif
00255
00256