Index: altium_parser/altium_kw.sphash =================================================================== --- altium_parser/altium_kw.sphash (revision 35279) +++ altium_parser/altium_kw.sphash (revision 35280) @@ -1,4 +1,5 @@ record + misc board class net Index: altium_parser/config.h =================================================================== --- altium_parser/config.h (revision 35279) +++ altium_parser/config.h (revision 35280) @@ -1 +1,2 @@ -/* blank */ +#define TODO(s) + Index: altium_parser/pcbdoc_ascii.c =================================================================== --- altium_parser/pcbdoc_ascii.c (revision 35279) +++ altium_parser/pcbdoc_ascii.c (revision 35280) @@ -126,6 +126,40 @@ } +TODO("these two 'new' functions should use stack-slabs from umalloc") +static altium_record_t *pcbdoc_ascii_new_rec(altium_tree_t *tree, const char *type_s) +{ + altium_record_t *rec = calloc(sizeof(altium_record_t), 1); + int kw = altium_kw_sphash(type_s); + + if ((kw < altium_kw_record_SPHASH_MINVAL) || (kw > altium_kw_record_SPHASH_MAXVAL)) + kw = altium_kw_record_misc; + + rec->type = kw; + rec->type_s = type_s; + + gdl_append(&tree->rec[kw], rec, link); + + return rec; +} + +static altium_field_t *pcbdoc_ascii_new_field(altium_tree_t *tree, altium_record_t *rec, const char *key, const char *val) +{ + altium_field_t *field = calloc(sizeof(altium_field_t), 1); + int kw = altium_kw_sphash(key); + + if ((kw < altium_kw_field_SPHASH_MINVAL) || (kw > altium_kw_field_SPHASH_MAXVAL)) + kw = altium_kw_record_SPHASH_INVALID; + + field->type = kw; + field->key = key; + field->val = val; + + gdl_append(&rec->fields, field, link); + + return field; +} + static int pcbdoc_ascii_parse_blocks(altium_tree_t *tree, const char *fn) { altium_block_t *blk; @@ -137,6 +171,7 @@ tprintf("---blk---\n"); for(;;) { /* parse each line within the block */ + altium_record_t *rec; int nl = 0; /* ignore leading seps and newlines, exit if ran out of the string */ @@ -157,8 +192,10 @@ } *end = '\0'; tprintf("rec='%s'\n", s); + rec = pcbdoc_ascii_new_rec(tree, s); s = end+1; + /* parse fields */ for(;;) { char *key, *val; @@ -188,6 +225,7 @@ val = end; tprintf(" %s=%s\n", key, val); + pcbdoc_ascii_new_field(tree, rec, key, val); s = end+1; if (nl) break; Index: altium_parser/pcbdoc_ascii.h =================================================================== --- altium_parser/pcbdoc_ascii.h (revision 35279) +++ altium_parser/pcbdoc_ascii.h (revision 35280) @@ -23,7 +23,7 @@ } altium_block_t; typedef struct altium_tree_s { - gdl_list_t rec[altium_kw_record_SPHASH_MAXVAL]; /* ordered list of records per type */ + gdl_list_t rec[altium_kw_record_SPHASH_MAXVAL+1]; /* ordered list of records per type */ gdl_list_t blocks; } altium_tree_t;