Index: trunk/src/plug_import.c =================================================================== --- trunk/src/plug_import.c (revision 29513) +++ trunk/src/plug_import.c (revision 29514) @@ -42,6 +42,7 @@ #include "plug_import.h" #include #include +#include pcb_plug_import_t *pcb_plug_import_chain = NULL; @@ -52,7 +53,7 @@ } find_t; /* Find the plugin that offers the highest write prio for the format */ -static pcb_plug_import_t *find_importer(unsigned int aspects, FILE *f, const char *filename) +static pcb_plug_import_t *find_importer(unsigned int aspects, const char **args, int numargs) { find_t available[32]; /* wish we had more than 32 import plugins... */ int n, len = 0, best = 0, bestidx = -1; @@ -59,7 +60,6 @@ #define cb_append(pl, pr) \ do { \ - rewind(f); \ if (pr > 0) { \ assert(len < sizeof(available)/sizeof(available[0])); \ available[len].plug = pl; \ @@ -67,10 +67,8 @@ } \ } while(0) - if (f == NULL) - return NULL; - PCB_HOOK_CALL_ALL(pcb_plug_import_t, pcb_plug_import_chain, fmt_support_prio, cb_append, (self, aspects, f, filename)); + PCB_HOOK_CALL_ALL(pcb_plug_import_t, pcb_plug_import_chain, fmt_support_prio, cb_append, (self, aspects, args, numargs)); if (len == 0) return NULL; @@ -103,28 +101,23 @@ int pcb_import(pcb_hidlib_t *hidlib, const char *filename, unsigned int aspect) { pcb_plug_import_t *plug; - FILE *fp; + if (!pcb_file_readable(filename)) { + pcb_message(PCB_MSG_ERROR, "Error: can't find a suitable netlist parser for %s - might be related: can't open %s for reading\n", filename, filename); + return 1; + } + if (!filename) { pcb_message(PCB_MSG_ERROR, "Error: need a file name for pcb_import_netlist()\n"); return 1; /* nothing to do */ } - fp = pcb_fopen(hidlib, filename, "r"); - plug = find_importer(aspect, fp, filename); + plug = find_importer(aspect, &filename, 1); if (plug == NULL) { - if (fp != NULL) { - pcb_message(PCB_MSG_ERROR, "Error: can't find a suitable netlist parser for %s\n", filename); - fclose(fp); - } - else - pcb_message(PCB_MSG_ERROR, "Error: can't find a suitable netlist parser for %s - might be related: can't open %s for reading\n", filename, filename); + pcb_message(PCB_MSG_ERROR, "Error: can't find a suitable netlist parser for %s\n", filename); return 1; } - if (fp != NULL) - fclose(fp); - return plug->import(plug, aspect, &filename, 1); } Index: trunk/src/plug_import.h =================================================================== --- trunk/src/plug_import.h (revision 29513) +++ trunk/src/plug_import.h (revision 29514) @@ -51,7 +51,7 @@ an integer priority if supported. The higher the prio is the more likely the plugin gets the next operation on the file. Base prio should be 100 for native formats. Return non-0 only if all aspects are supported. */ - int (*fmt_support_prio)(pcb_plug_import_t *ctx, unsigned int aspects, FILE *f, const char *filename); + int (*fmt_support_prio)(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs); /* Perform the import; return 0 on success */ int (*import)(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs); Index: trunk/src_plugins/import_calay/calay.c =================================================================== --- trunk/src_plugins/import_calay/calay.c (revision 29513) +++ trunk/src_plugins/import_calay/calay.c (revision 29514) @@ -225,7 +225,7 @@ return 0; } -static int calay_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +static int calay_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ Index: trunk/src_plugins/import_edif/import_edif.c =================================================================== --- trunk/src_plugins/import_edif/import_edif.c (revision 29513) +++ trunk/src_plugins/import_edif/import_edif.c (revision 29514) @@ -40,15 +40,17 @@ static pcb_plug_import_t import_edif; -int edif_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +int edif_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { char buf[65]; int len; char *p; + FILE *fp; if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ + fp = pcb_fopen(args[0], "r"); if (fp == NULL) return 0; /* only importing from a file is supported */ @@ -57,9 +59,12 @@ buf[len] = '\0'; for(p = buf; *p != '\0'; p++) *p = tolower((int) *p); - if (strstr(buf, "edif") != NULL) + if (strstr(buf, "edif") != NULL) { + fclose(fp); return 100; + } + fclose(fp); /* Else don't even attempt to load it */ return 0; } Index: trunk/src_plugins/import_fpcb_nl/fpcb_nl.c =================================================================== --- trunk/src_plugins/import_fpcb_nl/fpcb_nl.c (revision 29513) +++ trunk/src_plugins/import_fpcb_nl/fpcb_nl.c (revision 29514) @@ -186,7 +186,7 @@ return 0; } -static int fpcb_nl_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +static int fpcb_nl_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ Index: trunk/src_plugins/import_gnetlist/import_gnetlist.c =================================================================== --- trunk/src_plugins/import_gnetlist/import_gnetlist.c (revision 29513) +++ trunk/src_plugins/import_gnetlist/import_gnetlist.c (revision 29514) @@ -48,7 +48,7 @@ static pcb_plug_import_t import_gnetlist; -int gnetlist_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +int gnetlist_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ Index: trunk/src_plugins/import_ipcd356/ipcd356.c =================================================================== --- trunk/src_plugins/import_ipcd356/ipcd356.c (revision 29513) +++ trunk/src_plugins/import_ipcd356/ipcd356.c (revision 29514) @@ -439,7 +439,7 @@ {"LoadIpc356From", pcb_act_LoadIpc356From, pcb_acth_LoadIpc356From, pcb_acts_LoadIpc356From} }; -static int ipcd356_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +static int ipcd356_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ Index: trunk/src_plugins/import_ltspice/ltspice.c =================================================================== --- trunk/src_plugins/import_ltspice/ltspice.c (revision 29513) +++ trunk/src_plugins/import_ltspice/ltspice.c (revision 29514) @@ -310,7 +310,7 @@ return 0; } -static int ltspice_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +static int ltspice_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ Index: trunk/src_plugins/import_mentor_sch/mentor_sch.c =================================================================== --- trunk/src_plugins/import_mentor_sch/mentor_sch.c (revision 29513) +++ trunk/src_plugins/import_mentor_sch/mentor_sch.c (revision 29514) @@ -280,7 +280,7 @@ return mentor_sch_load(fname); } -static int mentor_sch_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +static int mentor_sch_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ Index: trunk/src_plugins/import_net_cmd/import_net_cmd.c =================================================================== --- trunk/src_plugins/import_net_cmd/import_net_cmd.c (revision 29513) +++ trunk/src_plugins/import_net_cmd/import_net_cmd.c (revision 29514) @@ -39,7 +39,7 @@ static pcb_plug_import_t import_net_cmd; -int net_cmd_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +int net_cmd_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ Index: trunk/src_plugins/import_netlist/import_netlist.c =================================================================== --- trunk/src_plugins/import_netlist/import_netlist.c (revision 29513) +++ trunk/src_plugins/import_netlist/import_netlist.c (revision 29514) @@ -155,7 +155,7 @@ return 0; } -static int netlist_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +static int netlist_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ Index: trunk/src_plugins/import_tinycad/tinycad.c =================================================================== --- trunk/src_plugins/import_tinycad/tinycad.c (revision 29513) +++ trunk/src_plugins/import_tinycad/tinycad.c (revision 29514) @@ -196,7 +196,7 @@ return tinycad_load(fname); } -static int tinycad_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +static int tinycad_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */ Index: trunk/src_plugins/io_kicad/read_net.c =================================================================== --- trunk/src_plugins/io_kicad/read_net.c (revision 29513) +++ trunk/src_plugins/io_kicad/read_net.c (revision 29514) @@ -240,7 +240,7 @@ } -static int eeschema_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, FILE *fp, const char *filename) +static int eeschema_support_prio(pcb_plug_import_t *ctx, unsigned int aspects, const char **args, int numargs) { if (aspects != IMPORT_ASPECT_NETLIST) return 0; /* only pure netlist import is supported */