Index: trunk/src/buffer.c =================================================================== --- trunk/src/buffer.c (revision 2221) +++ trunk/src/buffer.c (revision 2222) @@ -1306,6 +1306,7 @@ { char *function = argc ? argv[0] : (char *) ""; char *sbufnum = argc > 1 ? argv[1] : (char *) ""; + char *fmt = argc > 2 ? argv[2] : NULL; char *name; static char *default_file = NULL; int free_name = 0; @@ -1375,10 +1376,10 @@ if ((exist = fopen(name, "r"))) { fclose(exist); if (gui->confirm_dialog(_("File exists! Ok to overwrite?"), 0)) - SaveBufferElements(name); + SaveBufferElements(name, fmt); } else - SaveBufferElements(name); + SaveBufferElements(name, fmt); if (free_name && name) free(name); Index: trunk/src/file_act.c =================================================================== --- trunk/src/file_act.c (revision 2221) +++ trunk/src/file_act.c (revision 2222) @@ -245,21 +245,25 @@ { char *function; char *name; + char *fmt = NULL; function = argv[0]; name = argv[1]; if (strcasecmp(function, "Layout") == 0) { - if (SavePCB(PCB->Filename) == 0) + if (SavePCB(PCB->Filename, NULL) == 0) SetChangedFlag(false); return 0; } - if (argc != 2) + if ((argc != 2) && (argc != 3)) AFAIL(saveto); + if (argc >= 3) + fmt = argv[2]; + if (strcasecmp(function, "LayoutAs") == 0) { - if (SavePCB(name) == 0) { + if (SavePCB(name, fmt) == 0) { SetChangedFlag(false); free(PCB->Filename); PCB->Filename = strdup(name); @@ -309,7 +313,7 @@ } if (strcasecmp(function, "PasteBuffer") == 0) { - return SaveBufferElements(name); + return SaveBufferElements(name, fmt); } AFAIL(saveto); Index: trunk/src/plug_io.c =================================================================== --- trunk/src/plug_io.c (revision 2221) +++ trunk/src/plug_io.c (revision 2222) @@ -36,6 +36,9 @@ * on several architectures */ +#warning TODO: do not hardwire this, make a function to decide +#define DEFAULT_FMT "pcb" + #include "config.h" #include "conf_core.h" @@ -164,7 +167,7 @@ #warning TODO: when we have multiple io_* plugins: write function should not be run on all available IO hooks but on the IO hook saved in the pcb struct (at load or creation time) so we save with the same format all the time -int WriteBuffer(FILE *f, BufferType *buff) +int WriteBuffer(FILE *f, BufferType *buff, const char *fmt) { int res = -1; HOOK_CALL(plug_io_t, plug_io_chain, write_buffer, res, == 0, f, buff); @@ -173,7 +176,7 @@ return res; } -int WriteElementData(FILE *f, DataTypePtr e) +int WriteElementData(FILE *f, DataTypePtr e, const char *fmt) { int res = -1; HOOK_CALL(plug_io_t, plug_io_chain, write_element, res, == 0, f, e); @@ -181,7 +184,7 @@ return res; } -int WritePCB(FILE *f) +int WritePCB(FILE *f, const char *fmt) { int res = -1; HOOK_CALL(plug_io_t, plug_io_chain, write_pcb, res, == 0, f); @@ -446,13 +449,13 @@ /* --------------------------------------------------------------------------- * save elements in the current buffer */ -int SaveBufferElements(char *Filename) +int SaveBufferElements(char *Filename, const char *fmt) { int result; if (SWAP_IDENT) SwapBuffers(); - result = WritePipe(Filename, false); + result = WritePipe(Filename, false, fmt); if (SWAP_IDENT) SwapBuffers(); return (result); @@ -461,15 +464,15 @@ /* --------------------------------------------------------------------------- * save PCB */ -int SavePCB(char *file) +int SavePCB(char *file, const char *fmt) { int retcode; if (gui->notify_save_pcb == NULL) - return WritePipe(file, true); + return WritePipe(file, true, fmt); gui->notify_save_pcb(file, false); - retcode = WritePipe(file, true); + retcode = WritePipe(file, true, fmt); gui->notify_save_pcb(file, true); return retcode; @@ -547,7 +550,7 @@ if (PCB && PCB->Changed) { sprintf(filename, conf_core.rc.emergency_name, (int) getpid()); Message(_("Trying to save your layout in '%s'\n"), filename); - WritePCBFile(filename); + WritePCBFile(filename, DEFAULT_FMT); } } @@ -665,7 +668,7 @@ } } - WritePCBFile(filename); + WritePCBFile(filename, DEFAULT_FMT); free(filename); } @@ -679,7 +682,7 @@ void SaveTMPData(void) { char *fn = build_fn(conf_core.rc.emergency_name); - WritePCBFile(fn); + WritePCBFile(fn, DEFAULT_FMT); if (TMPFilename != NULL) free(TMPFilename); TMPFilename = fn; @@ -698,7 +701,7 @@ /* --------------------------------------------------------------------------- * writes PCB to file */ -int WritePCBFile(char *Filename) +int WritePCBFile(char *Filename, const char *fmt) { FILE *fp; int result; @@ -707,7 +710,7 @@ OpenErrorMessage(Filename); return (STATUS_ERROR); } - result = WritePCB(fp); + result = WritePCB(fp, fmt); fclose(fp); return (result); } @@ -717,7 +720,7 @@ * writes to pipe using the command defined by conf_core.rc.save_command * %f are replaced by the passed filename */ -int WritePipe(char *Filename, bool thePcb) +int WritePipe(char *Filename, bool thePcb, const char *fmt) { FILE *fp; int result; @@ -755,14 +758,14 @@ } if (thePcb) { if (PCB->is_footprint) { - WriteElementData(fp, PCB->Data); + WriteElementData(fp, PCB->Data, fmt); result = 0; } else - result = WritePCB(fp); + result = WritePCB(fp, fmt); } else - result = WriteBuffer(fp, PASTEBUFFER); + result = WriteBuffer(fp, PASTEBUFFER, fmt); if (used_popen) return (pclose(fp) ? STATUS_ERROR : result); Index: trunk/src/plug_io.h =================================================================== --- trunk/src/plug_io.h (revision 2221) +++ trunk/src/plug_io.h (revision 2222) @@ -66,15 +66,15 @@ int ParsePCB(PCBTypePtr Ptr, char *Filename, int load_settings); int ParseElement(DataTypePtr Ptr, const char *name); int ParseFont(FontTypePtr Ptr, char *Filename); -int WriteBuffer(FILE *f, BufferType *buff); -int WriteElementData(FILE *f, DataTypePtr e); -int WritePCB(FILE *f); +int WriteBuffer(FILE *f, BufferType *buff, const char *fmt); +int WriteElementData(FILE *f, DataTypePtr e, const char *fmt); +int WritePCB(FILE *f, const char *fmt); /********** common function used to be part of file.[ch] and friends **********/ FILE *CheckAndOpenFile(char *, bool, bool, bool *, bool *); FILE *OpenConnectionDataFile(void); -int SavePCB(char *); +int SavePCB(char *, const char *fmt); int LoadPCB(char *, bool, int how); /* how: 0=normal pcb; 1=default.pcb, 2=misc (do not load settings) */ void EnableAutosave(void); void Backup(void); @@ -83,13 +83,13 @@ void DisableEmergencySave(void); int RevertPCB(void); int ImportNetlist(char *); -int SaveBufferElements(char *); +int SaveBufferElements(char *, const char *fmt); void sort_netlist(void); void PrintQuotedString(FILE *, const char *); void sort_library(LibraryTypePtr lib); void set_some_route_style(); -int WritePCBFile(char *); -int WritePipe(char *, bool); +int WritePCBFile(char *, const char *fmt); +int WritePipe(char *, bool, const char *fmt); #ifndef HAS_ATEXIT #ifdef HAS_ON_EXIT Index: trunk/src_plugins/io_pcb/file.c =================================================================== --- trunk/src_plugins/io_pcb/file.c (revision 2221) +++ trunk/src_plugins/io_pcb/file.c (revision 2222) @@ -549,7 +549,7 @@ Cardinal i; WriteViaData(FP, buff->Data); - WriteElementData(FP, buff->Data); + WriteElementData(FP, buff->Data, "pcb"); for (i = 0; i < max_copper_layer + 2; i++) WriteLayerData(FP, i, &(buff->Data->Layer[i])); return (STATUS_OK); @@ -567,7 +567,7 @@ WritePCBFontData(FP); WriteAttributeList(FP, &PCB->Attributes, ""); WriteViaData(FP, PCB->Data); - WriteElementData(FP, PCB->Data); + WriteElementData(FP, PCB->Data, "pcb"); WritePCBRatData(FP); for (i = 0; i < max_copper_layer + 2; i++) WriteLayerData(FP, i, &(PCB->Data->Layer[i])); Index: trunk/src_plugins/shand_cmd/command.c =================================================================== --- trunk/src_plugins/shand_cmd/command.c (revision 2221) +++ trunk/src_plugins/shand_cmd/command.c (revision 2222) @@ -319,7 +319,7 @@ switch (argc) { case 0: if (PCB->Filename) { - if (SavePCB(PCB->Filename) == 0) + if (SavePCB(PCB->Filename, NULL) == 0) SetChangedFlag(false); } else @@ -327,7 +327,7 @@ break; case 1: - if (SavePCB(argv[0]) == 0) { + if (SavePCB(argv[0], NULL) == 0) { SetChangedFlag(false); free(PCB->Filename); PCB->Filename = strdup(argv[0]);