Index: trunk/src_plugins/io_lihata/io_lihata.c =================================================================== --- trunk/src_plugins/io_lihata/io_lihata.c (revision 27341) +++ trunk/src_plugins/io_lihata/io_lihata.c (revision 27342) @@ -89,6 +89,9 @@ plug_io_lihata_v6.write_font = io_lihata_write_font; plug_io_lihata_v6.write_buffer = io_lihata_write_buffer; plug_io_lihata_v6.write_footprint = io_lihata_write_element; + plug_io_lihata_v6.write_subcs_head = io_lihata_write_subcs_head; + plug_io_lihata_v6.write_subcs_subc = io_lihata_write_subcs_subc; + plug_io_lihata_v6.write_subcs_tail = io_lihata_write_subcs_subc; plug_io_lihata_v6.write_pcb = io_lihata_write_pcb_v6; plug_io_lihata_v6.default_fmt = "lihata"; plug_io_lihata_v6.description = "lihata board v6"; @@ -114,6 +117,9 @@ plug_io_lihata_v5.write_font = io_lihata_write_font; plug_io_lihata_v5.write_buffer = NULL; plug_io_lihata_v5.write_footprint = io_lihata_write_element; + plug_io_lihata_v5.write_subcs_head = io_lihata_write_subcs_head; + plug_io_lihata_v5.write_subcs_subc = io_lihata_write_subcs_subc; + plug_io_lihata_v5.write_subcs_tail = io_lihata_write_subcs_subc; plug_io_lihata_v5.write_pcb = io_lihata_write_pcb_v5; plug_io_lihata_v5.default_fmt = "lihata"; plug_io_lihata_v5.description = "lihata board v5"; @@ -137,6 +143,9 @@ plug_io_lihata_v4.write_font = io_lihata_write_font; plug_io_lihata_v4.write_buffer = NULL; plug_io_lihata_v4.write_footprint = io_lihata_write_element; + plug_io_lihata_v4.write_subcs_head = io_lihata_write_subcs_head; + plug_io_lihata_v4.write_subcs_subc = io_lihata_write_subcs_subc; + plug_io_lihata_v4.write_subcs_tail = io_lihata_write_subcs_subc; plug_io_lihata_v4.write_pcb = io_lihata_write_pcb_v4; plug_io_lihata_v4.default_fmt = "lihata"; plug_io_lihata_v4.description = "lihata board v4"; @@ -160,6 +169,9 @@ plug_io_lihata_v3.write_font = io_lihata_write_font; plug_io_lihata_v3.write_buffer = NULL; plug_io_lihata_v3.write_footprint = io_lihata_write_element; + plug_io_lihata_v3.write_subcs_head = io_lihata_write_subcs_head; + plug_io_lihata_v3.write_subcs_subc = io_lihata_write_subcs_subc; + plug_io_lihata_v3.write_subcs_tail = io_lihata_write_subcs_subc; plug_io_lihata_v3.write_pcb = io_lihata_write_pcb_v3; plug_io_lihata_v3.default_fmt = "lihata"; plug_io_lihata_v3.description = "lihata board v3"; Index: trunk/src_plugins/io_lihata/write.c =================================================================== --- trunk/src_plugins/io_lihata/write.c (revision 27341) +++ trunk/src_plugins/io_lihata/write.c (revision 27342) @@ -1657,21 +1657,11 @@ return 0; } -static int io_lihata_dump_nth_subc(pcb_plug_io_t *ctx, FILE *f, pcb_data_t *data, int enforce1, long subc_idx) +static int io_lihata_dump_subc(pcb_plug_io_t *ctx, FILE *f, pcb_subc_t *sc) { int res; lht_doc_t *doc; - pcb_subc_t *sc; - if ((subc_idx < 0) && (enforce1) && (pcb_subclist_length(&data->subc)) > 1) { - pcb_message(PCB_MSG_ERROR, "Can't save more than one subcircuit from a buffer\n"); - return -1; - } - if (pcb_subclist_length(&data->subc) < 1) { - pcb_message(PCB_MSG_ERROR, "there's no subcircuit in the buffer\n"); - return -1; - } - /* create the doc */ io_lihata_full_tree = 1; doc = lht_dom_init(); @@ -1682,14 +1672,6 @@ wrver = 1; /* bump version if features require */ - if (subc_idx == -1) - sc = pcb_subclist_first(&data->subc); - else - sc = pcb_subclist_nth(&data->subc, subc_idx); - - if (sc == NULL) - return -1; - TODO("subc: for subc-in-subc this should be recursive") if (padstacklist_first(&sc->data->padstack) != NULL) { if (wrver < 4) { @@ -1719,6 +1701,50 @@ return res; } + +static int io_lihata_dump_nth_subc(pcb_plug_io_t *ctx, FILE *f, pcb_data_t *data, int enforce1, long subc_idx) +{ + pcb_subc_t *sc; + + if ((subc_idx < 0) && (enforce1) && (pcb_subclist_length(&data->subc)) > 1) { + pcb_message(PCB_MSG_ERROR, "Can't save more than one subcircuit from a buffer\n"); + return -1; + } + if (pcb_subclist_length(&data->subc) < 1) { + pcb_message(PCB_MSG_ERROR, "there's no subcircuit in the buffer\n"); + return -1; + } + + if (subc_idx == -1) + sc = pcb_subclist_first(&data->subc); + else + sc = pcb_subclist_nth(&data->subc, subc_idx); + + if (sc == NULL) + return -1; + + return io_lihata_dump_subc(ctx, f, sc); +} + +int io_lihata_write_subcs_head(pcb_plug_io_t *ctx, void **udata, FILE *f, int lib, long num_subcs) +{ + if ((lib) || (num_subcs != 1)) { + pcb_message(PCB_MSG_ERROR, "Only one subcircuit per footprint file can be written in lihata\n"); + return -1; + } +} + +int io_lihata_write_subcs_subc(pcb_plug_io_t *ctx, void **udata, FILE *f, pcb_subc_t *subc) +{ + return io_lihata_dump_subc(ctx, f, subc); +} + +int io_lihata_write_subcs_tail(pcb_plug_io_t *ctx, void **udata, FILE *f) +{ + return 0; +} + + int io_lihata_write_buffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff) { int res; Index: trunk/src_plugins/io_lihata/write.h =================================================================== --- trunk/src_plugins/io_lihata/write.h (revision 27341) +++ trunk/src_plugins/io_lihata/write.h (revision 27342) @@ -35,6 +35,9 @@ int io_lihata_write_font(pcb_plug_io_t *ctx, pcb_font_t *font, const char *Filename); int io_lihata_write_buffer(pcb_plug_io_t *ctx, FILE *f, pcb_buffer_t *buff); int io_lihata_write_element(pcb_plug_io_t *ctx, FILE *f, pcb_data_t *dt, long subc_idx); +int io_lihata_write_subcs_head(pcb_plug_io_t *ctx, void **udata, FILE *f, int lib, long num_subcs); +int io_lihata_write_subcs_subc(pcb_plug_io_t *ctx, void **udata, FILE *f, pcb_subc_t *subc); +int io_lihata_write_subcs_tail(pcb_plug_io_t *ctx, void **udata, FILE *f); void *io_lihata_save_as_subd_init(const pcb_plug_io_t *ctx, pcb_hid_dad_subdialog_t *sub, pcb_plug_iot_t type); void io_lihata_save_as_subd_uninit(const pcb_plug_io_t *ctx, void *plg_ctx, pcb_hid_dad_subdialog_t *sub, pcb_bool apply);