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