00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083 #ifndef MD2_H
00084 #define MD2_H
00085
00086
00087 #include <stdio.h>
00088
00089
00090
00091
00092
00093
00094 #define MD_INT 1
00095 #define MD_DOUBLE 2
00096 #define MD_STRING 3
00097 #define MD_LINK 4
00098
00099
00100 typedef enum MD_FIELD_TYPE
00101 {
00102 MD_REQUIRED_FIELD = 1,
00103 MD_OPTIONAL_FIELD = 2
00104 } MD_FIELD_TYPE;
00105
00106
00107 #define MD_OPTIONAL_ELEMENTS -1
00108
00109
00110
00111
00112
00113 typedef struct MD_Symbol
00114 {
00115 char *name;
00116 unsigned int hash_val;
00117 void *data;
00118 struct MD_Symbol_Table *table;
00119 struct MD_Symbol *next_hash;
00120 struct MD_Symbol *prev_hash;
00121 struct MD_Symbol *next_symbol;
00122 struct MD_Symbol *prev_symbol;
00123 int symbol_id;
00124
00125 } MD_Symbol;
00126
00127 typedef struct MD_Symbol_Table
00128 {
00129 struct MD *md;
00130 char *name;
00131 MD_Symbol **hash;
00132 int hash_size;
00133 int hash_mask;
00134 int resize_size;
00135 MD_Symbol *head_symbol;
00136 MD_Symbol *tail_symbol;
00137 int symbol_count;
00138 } MD_Symbol_Table;
00139
00140
00141
00142 typedef struct MD
00143 {
00144 char *name;
00145 MD_Symbol_Table *section_table;
00146 } MD;
00147
00148 typedef struct MD_Section
00149 {
00150 MD *md;
00151 char *name;
00152 MD_Symbol_Table *field_decl_table;
00153 MD_Symbol_Table *entry_table;
00154 int max_field_index;
00155 struct MD_Field_Decl **field_decl;
00156 int field_array_size;
00157
00158 MD_Symbol *symbol;
00159 void *user_ext;
00160 }
00161 MD_Section;
00162
00163 typedef struct MD_Element_Req
00164 {
00165 struct MD_Field_Decl *field_decl;
00166 int require_index;
00167 short type;
00168 char *desc;
00169 int kleene_starred;
00170 MD_Section **link;
00171 int link_array_size;
00172 } MD_Element_Req;
00173
00174 typedef struct MD_Field_Decl
00175 {
00176 MD_Section *section;
00177 int field_index;
00178 char *name;
00179 MD_FIELD_TYPE type;
00180 int max_require_index;
00181 MD_Element_Req **require;
00182 int require_array_size;
00183 MD_Element_Req *kleene_starred_req;
00184 MD_Symbol *symbol;
00185 } MD_Field_Decl;
00186
00187
00188
00189
00190
00191 typedef struct MD_Entry
00192 {
00193 MD_Section *section;
00194 char *name;
00195 struct MD_Field **field;
00196
00197 MD_Symbol *symbol;
00198 void *user_ext;
00199 } MD_Entry;
00200
00201
00202
00203
00204
00205 typedef struct MD_Element
00206 {
00207 struct MD_Field *field;
00208 unsigned short element_index;
00209 short type;
00210 union
00211 {
00212 int i;
00213 double d;
00214 char *s;
00215 MD_Entry *l;
00216 } value;
00217 } MD_Element;
00218
00219
00220
00221
00222
00223
00224
00225 typedef struct MD_Field
00226 {
00227 MD_Entry *entry;
00228 MD_Field_Decl *decl;
00229 int max_element_index;
00230 MD_Element **element;
00231 int element_array_size;
00232 } MD_Field;
00233
00234
00235
00236
00237
00238
00239 #ifdef __cplusplus
00240 extern "C" {
00241 #endif
00242
00243
00244 extern MD *MD_new_md (char *name, int num_sections);
00245 extern int MD_check_md (FILE *out, MD *md);
00246 extern void MD_delete_md (MD *md);
00247
00248 extern MD_Section *MD_new_section (MD *md, char *name, int num_entries,
00249 int num_fields);
00250
00251 extern MD_Section *MD_first_section (MD *md);
00252 extern MD_Section *MD_last_section (MD *md);
00253 extern MD_Section *MD_next_section (MD_Section *section);
00254 extern MD_Section *MD_prev_section (MD_Section *section);
00255
00256 extern MD_Field_Decl *MD_new_field_decl (MD_Section *section, char *name,
00257 MD_FIELD_TYPE field_type);
00258
00259 extern MD_Field_Decl *MD_first_field_decl (MD_Section *section);
00260 extern MD_Field_Decl *MD_last_field_decl (MD_Section *section);
00261 extern MD_Field_Decl *MD_next_field_decl (MD_Field_Decl *field_decl);
00262 extern MD_Field_Decl *MD_prev_field_decl (MD_Field_Decl *field_decl);
00263
00264 extern void MD_require_int (MD_Field_Decl *field_decl, int element_index);
00265 extern void MD_require_double (MD_Field_Decl *field_decl, int element_index);
00266 extern void MD_require_string (MD_Field_Decl *field_decl, int element_index);
00267 extern void MD_require_link (MD_Field_Decl *field_decl, int element_index,
00268 MD_Section *section);
00269 extern void MD_require_multi_target_link (MD_Field_Decl *field_decl,
00270 int element_index, int section_array_size,
00271 MD_Section **section_array);
00272 extern void MD_kleene_star_requirement (MD_Field_Decl *field_decl,
00273 int element_index);
00274
00275 extern MD_Entry *MD_new_entry (MD_Section *section, char *name);
00276 extern void MD_rename_entry (MD_Entry *entry, char *new_name);
00277
00278 extern MD_Entry *MD_first_entry (MD_Section *section);
00279 extern MD_Entry *MD_last_entry (MD_Section *section);
00280 extern MD_Entry *MD_next_entry (MD_Entry *entry);
00281 extern MD_Entry *MD_prev_entry (MD_Entry *entry);
00282
00283 extern MD_Field *MD_new_field (MD_Entry *entry, MD_Field_Decl *decl,
00284 int num_elements);
00285 extern void MD_delete_field (MD_Field *field);
00286 extern void MD_delete_field_decl (MD_Field_Decl *field_decl);
00287 extern void MD_delete_element (MD_Field *field, int index);
00288
00289 extern MD *MD_read_md (FILE *in, char *name);
00290 extern void MD_write_md (FILE *out, MD *md);
00291 extern void MD_print_md (FILE *out, MD *md, int page_width);
00292 extern void MD_print_md_declarations (FILE *out, MD *md, int page_width);
00293 extern void MD_print_md_template (FILE *out, MD *md);
00294
00295 extern void MD_print_section (FILE *out, MD_Section *section, int page_width);
00296 extern void MD_print_section_template (FILE *out, MD_Section *section);
00297 extern void MD_print_field_decl (FILE *out, MD_Field_Decl *field_decl,
00298 int page_width);
00299 extern void MD_print_entry (FILE *out, MD_Entry *entry, int page_width);
00300 extern void MD_print_entry_template (FILE *out, MD_Entry *entry);
00301
00302 #ifdef __cplusplus
00303 }
00304 #endif
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316 #ifndef MD_DEBUG_MACROS
00317
00318 #define MD_num_sections(md) ((md)->section_table->symbol_count)
00319 #define MD_find_section(md, name) \
00320 ((MD_Section *)_MD_find_symbol_data((md)->section_table, name))
00321
00322
00323 #define MD_delete_section(section) \
00324 (MD_delete_symbol(((MD_Section *)(section))->symbol, \
00325 (void (*)(void *))_MD_free_section))
00326
00327 #define MD_num_entries(section) ((section)->entry_table->symbol_count)
00328
00329 #define MD_find_entry(section, name) \
00330 ((MD_Entry *)_MD_find_symbol_data((section)->entry_table, name))
00331
00332 #define MD_delete_entry(entry) \
00333 (MD_delete_symbol(((MD_Entry *)(entry))->symbol, \
00334 (void (*)(void *))_MD_free_entry))
00335
00336 #define MD_num_field_decls(section) \
00337 ((section)->field_decl_table->symbol_count)
00338
00339 #define MD_max_field_index(section) ((section)->max_field_index)
00340
00341 #define MD_find_field_decl(section, name) \
00342 ((MD_Field_Decl *)_MD_find_symbol_data((section)->field_decl_table, \
00343 name))
00344
00345 #define MD_find_field(entry, field_decl) \
00346 ((entry)->field[(field_decl)->field_index])
00347
00348 #define MD_num_elements(field) ((field)->max_element_index + 1)
00349 #define MD_max_element_index(field) ((field)->max_element_index)
00350
00351 #define MD_set_int(field, index, value) _MD_set_int(field, index, value)
00352 #define MD_get_int(field, index) ((field)->element[index]->value.i)
00353
00354 #define MD_set_double(field, index, value) _MD_set_double(field, index, value)
00355 #define MD_get_double(field, index) ((field)->element[index]->value.d)
00356
00357 #define MD_set_string(field, index, value) _MD_set_string(field, index, value)
00358 #define MD_get_string(field, index) ((field)->element[index]->value.s)
00359
00360 #define MD_set_link(field, index, value) _MD_set_link(field, index, value)
00361 #define MD_get_link(field, index) ((field)->element[index]->value.l)
00362
00363 #define MD_set_section_ext(section, ext) ((section)->user_ext = (void *)(ext))
00364 #define MD_get_section_ext(section) ((section)->user_ext)
00365
00366 #define MD_set_entry_ext(entry, ext) ((entry)->user_ext = (void *)(ext))
00367 #define MD_get_entry_ext(entry) ((entry)->user_ext)
00368
00369 #else
00370
00371 #define MD_num_sections(md) _MD_num_sections(md)
00372 #define MD_find_section(md, name) _MD_find_section(md, name)
00373 #define MD_delete_section(section) _MD_delete_section(section)
00374
00375 #define MD_num_entries(section) _MD_num_entries(section)
00376 #define MD_find_entry(section, name) _MD_find_entry(section, name)
00377 #define MD_delete_entry(entry) _MD_delete_entry(entry)
00378
00379
00380 #define MD_num_field_decls(section) _MD_num_field_decls(section)
00381 #define MD_max_field_index(section) _MD_max_field_index(section)
00382 #define MD_find_field_decl(section, name) _MD_find_field_decl(section, name)
00383
00384 #define MD_find_field(entry, field_decl) _MD_find_field(entry, field_decl)
00385
00386 #define MD_num_elements(field) _MD_num_elements(field)
00387 #define MD_max_element_index(field) _MD_max_element_index(field)
00388
00389 #define MD_set_int(field, index, value) \
00390 _MD_set_int_type_checking(field, index, value)
00391 #define MD_get_int(field, index) _MD_get_int(field, index)
00392
00393 #define MD_set_double(field, index, value) \
00394 _MD_set_double_type_checking(field, index, value)
00395 #define MD_get_double(field, index) _MD_get_double(field, index)
00396
00397 #define MD_set_string(field, index, value) \
00398 _MD_set_string_type_checking(field, index, value)
00399 #define MD_get_string(field, index) _MD_get_string(field, index)
00400
00401 #define MD_set_link(field, index, value) \
00402 _MD_set_link_type_checking(field, index, value)
00403 #define MD_get_link(field, index) _MD_get_link(field, index)
00404
00405 #define MD_set_section_ext(section, ext) \
00406 _MD_set_section_ext(section, (void *)(ext))
00407 #define MD_get_section_ext(section) _MD_get_section_ext(section)
00408
00409 #define MD_set_entry_ext(entry, ext) _MD_set_entry_ext(entry, (void *)(ext))
00410 #define MD_get_entry_ext(entry) _MD_get_entry_ext(entry)
00411
00412
00413 #endif
00414
00415
00416 #define MD_check_section(out, section) \
00417 _MD_check_section(out, section, "MD_check_section")
00418 #define MD_check_entry(out, entry) \
00419 _MD_check_entry(out, entry, "MD_check_entry")
00420 #define MD_check_field(out, field) \
00421 _MD_check_field(out, field, "MD_check_field")
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432 #ifdef __cplusplus
00433 extern "C" {
00434 #endif
00435
00436 extern void *_MD_find_symbol_data (MD_Symbol_Table *table, char *name);
00437
00438 extern int _MD_num_sections (MD *md);
00439 extern MD_Section *_MD_find_section (MD *md, char *name);
00440 extern void *_MD_set_section_ext(MD_Section *section, void *ext);
00441 extern void *_MD_get_section_ext(MD_Section *section);
00442 extern void _MD_free_section (MD_Section *section);
00443 extern void _MD_delete_section (MD_Section *section);
00444 extern int _MD_check_section (FILE *out, MD_Section *section,
00445 char *caller_name);
00446
00447
00448 extern int _MD_num_entries (MD_Section *section);
00449 extern MD_Entry *_MD_find_entry (MD_Section *section, char *name);
00450 extern void *_MD_set_entry_ext(MD_Entry *entry, void *ext);
00451 extern void *_MD_get_entry_ext(MD_Entry *entry);
00452 extern void _MD_free_entry (MD_Entry *entry);
00453 extern void _MD_delete_entry (MD_Entry *entry);
00454 extern int _MD_check_entry (FILE *out, MD_Entry *entry, char *caller_name);
00455
00456 extern MD_Field_Decl *_MD_find_field_decl (MD_Section *section, char *name);
00457 extern void _MD_free_field_decl (MD_Field_Decl *field_decl);
00458
00459 extern int _MD_num_field_decls (MD_Section *section);
00460 extern int _MD_max_field_index (MD_Section *section);
00461
00462 extern MD_Field *_MD_find_field (MD_Entry *entry, MD_Field_Decl *field_decl);
00463 extern int _MD_check_field (FILE *out, MD_Field *field, char *caller_name);
00464
00465 extern int _MD_num_elements (MD_Field *field);
00466 extern int _MD_max_element_index (MD_Field *field);
00467
00468 extern void _MD_set_int (MD_Field *field, int index, int value);
00469 extern void _MD_set_int_type_checking (MD_Field *field, int index, int value);
00470 extern int _MD_get_int (MD_Field *field, int index);
00471
00472 extern void _MD_set_double (MD_Field *field, int index, double value);
00473 extern void _MD_set_double_type_checking (MD_Field *field, int index,
00474 double value);
00475 extern double _MD_get_double (MD_Field *field, int index);
00476
00477 extern void _MD_set_string (MD_Field *field, int index, char *value);
00478 extern void _MD_set_string_type_checking (MD_Field *field, int index,
00479 char *value);
00480 extern char *_MD_get_string (MD_Field *field, int index);
00481
00482 extern void _MD_set_link (MD_Field *field, int index, MD_Entry *value);
00483 extern void _MD_set_link_type_checking (MD_Field *field, int index,
00484 MD_Entry *value);
00485 extern MD_Entry *_MD_get_link (MD_Field *field, int index);
00486
00487 #ifdef __cplusplus
00488 }
00489 #endif
00490
00491
00492
00493
00494 #endif
00495
00496
00497
00498