r5418 - trunk/eda/fped

werner at docs.openmoko.org werner at docs.openmoko.org
Tue Aug 11 22:17:40 CEST 2009


Author: werner
Date: 2009-08-11 22:17:39 +0200 (Tue, 11 Aug 2009)
New Revision: 5418

Added:
   trunk/eda/fped/file.c
   trunk/eda/fped/file.h
Modified:
   trunk/eda/fped/Makefile
   trunk/eda/fped/dump.c
   trunk/eda/fped/fped.c
   trunk/eda/fped/gui.c
   trunk/eda/fped/postscript.c
Log:
- vector labels are already in a per-frame namespace, so we don't need to add
  the frame name when auto-generating them
- moved file I/O from gui.c to file.c
- ps_line used the wrong endpoint coordinate
- option -k makes fped write KiCad non-interactively
- option -p makes fped write Postscript non-interactively



Modified: trunk/eda/fped/Makefile
===================================================================
--- trunk/eda/fped/Makefile	2009-08-11 01:20:15 UTC (rev 5417)
+++ trunk/eda/fped/Makefile	2009-08-11 20:17:39 UTC (rev 5418)
@@ -11,7 +11,7 @@
 #
 
 OBJS = fped.o expr.o coord.o obj.o delete.o inst.o util.o error.o \
-       unparse.o dump.o kicad.o postscript.o meas.o \
+       unparse.o file.o dump.o kicad.o postscript.o meas.o \
        cpp.o lex.yy.o y.tab.o \
        gui.o gui_util.o gui_style.o gui_inst.o gui_status.o gui_canvas.o \
        gui_tool.o gui_over.o gui_meas.o gui_frame.o

Modified: trunk/eda/fped/dump.c
===================================================================
--- trunk/eda/fped/dump.c	2009-08-11 01:20:15 UTC (rev 5417)
+++ trunk/eda/fped/dump.c	2009-08-11 20:17:39 UTC (rev 5418)
@@ -90,8 +90,7 @@
 	n = 0;
 	for (walk = base->frame->vecs; walk != base; walk = walk->next)
 		n++;
-	return stralloc_printf("_%s_%d",
-	    base->frame->name ? base->frame->name : "", n);
+	return stralloc_printf("__%d", n);
 }
 
 

Added: trunk/eda/fped/file.c
===================================================================
--- trunk/eda/fped/file.c	                        (rev 0)
+++ trunk/eda/fped/file.c	2009-08-11 20:17:39 UTC (rev 5418)
@@ -0,0 +1,177 @@
+/*
+ * file.c - File handling
+ *
+ * Written 2009 by Werner Almesberger
+ * Copyright 2009 by Werner Almesberger
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+#include "dump.h"
+#include "kicad.h"
+#include "postscript.h"
+
+#include "util.h"
+#include "file.h"
+
+
+extern char *save_file_name;
+
+
+/* ----- general helper functions ------------------------------------------ */
+
+
+char *set_extension(const char *name, const char *ext)
+{
+	char *s = stralloc(name);
+	char *slash, *dot;
+	char *res;
+
+	slash = strrchr(s, '/');
+	dot = strrchr(slash ? slash : s, '.');
+	if (dot)
+		*dot = 0;
+	res = stralloc_printf("%s.%s", s, ext);
+	free(s);
+	return res;
+}
+
+
+int save_to(const char *name, int (*fn)(FILE *file))
+{
+	FILE *file;
+
+	file = fopen(name, "w");
+	if (!file) {
+		perror(name);
+		return 0;
+	}
+	if (!fn(file)) {
+		perror(name);
+		return 0;
+	}
+	if (fclose(file) == EOF) {
+		perror(name);
+		return 0;
+	}
+	return 1;
+}
+
+
+void save_with_backup(const char *name, int (*fn)(FILE *file))
+{
+	char *s = stralloc(name);
+	char *back, *tmp;
+	char *slash, *dot;
+	int n;
+	struct stat st;
+
+	/* save to temporary file */
+
+	slash = strrchr(s, '/');
+	if (!slash)
+		tmp = stralloc_printf("~%s", s);
+	else {
+		*slash = 0;
+		tmp = stralloc_printf("%s/~%s", s, slash+1);
+		*slash = '/';
+	}
+
+	if (!save_to(tmp, fn))
+		return;
+
+	/* move existing file out of harm's way */
+
+	dot = strrchr(slash ? slash : s, '.');
+	if (dot)
+		*dot = 0;
+	n = 0;
+	while (1) {
+		back = stralloc_printf("%s~%d%s%s",
+		    s, n, dot ? "." : "", dot ? dot+1 : "");
+		if (stat(back, &st) < 0) {
+			if (errno == ENOENT)
+				break;
+			perror(back);
+			free(back);
+			return;
+		}
+		free(back);
+		n++;
+	}
+	if (rename(name, back) < 0) {
+		if (errno != ENOENT) {
+			perror(name);
+			free(back);
+			return;
+		}
+	} else {
+		fprintf(stderr, "renamed %s to %s\n", name, back);
+	}
+	free(back);
+
+	/* rename to final name */
+
+	if (rename(tmp, name) < 0) {
+		perror(name);
+		free(tmp);
+		return;
+	}
+	free(tmp);
+
+	fprintf(stderr, "saved to %s\n", name);
+}
+
+
+/* ----- application-specific save handlers -------------------------------- */
+
+
+void save_fpd(void)
+{
+	if (save_file_name)
+		save_with_backup(save_file_name, dump);
+	else {
+		if (!dump(stdout))
+			perror("stdout");
+	}
+}
+
+
+void write_kicad(void)
+{
+	char *name;
+
+	if (save_file_name) {
+		name = set_extension(save_file_name, "mod");
+		save_to(name, kicad);
+		free(name);
+	} else {
+		if (!kicad(stdout))
+			perror("stdout");
+	}
+}
+
+
+void write_ps(void)
+{
+	char *name;
+
+	if (save_file_name) {
+		name = set_extension(save_file_name, "ps");
+		save_to(name, postscript);
+		free(name);
+	} else {
+		if (!postscript(stdout))
+			perror("stdout");
+	}
+}

Added: trunk/eda/fped/file.h
===================================================================
--- trunk/eda/fped/file.h	                        (rev 0)
+++ trunk/eda/fped/file.h	2009-08-11 20:17:39 UTC (rev 5418)
@@ -0,0 +1,28 @@
+/*
+ * file.h - File handling
+ *
+ * Written 2009 by Werner Almesberger
+ * Copyright 2009 by Werner Almesberger
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+
+#ifndef FILE_H
+#define FILE_H
+
+#include <stdio.h>
+
+
+char *set_extension(const char *name, const char *ext);
+int save_to(const char *name, int (*fn)(FILE *file));
+void save_with_backup(const char *name, int (*fn)(FILE *file));
+
+void save_fpd(void);
+void write_kicad(void);
+void write_ps(void);
+
+#endif /* !FILE_H */

Modified: trunk/eda/fped/fped.c
===================================================================
--- trunk/eda/fped/fped.c	2009-08-11 01:20:15 UTC (rev 5417)
+++ trunk/eda/fped/fped.c	2009-08-11 20:17:39 UTC (rev 5418)
@@ -13,19 +13,21 @@
 
 #include <stdlib.h>
 #include <stdio.h>
+#include <unistd.h>
 
 #include "cpp.h"
 #include "util.h"
 #include "error.h"
 #include "obj.h"
 #include "inst.h"
+#include "file.h"
 #include "gui.h"
 
 
 extern void scan_empty(void);
 extern int yyparse(void);
 
-char *save_file = NULL;
+char *save_file_name = NULL;
 
 
 static void load_file(const char *name)
@@ -38,7 +40,9 @@
 
 static void usage(const char *name)
 {
-	fprintf(stderr, "usage: %s [in_file [out_file]]\n", name);
+	fprintf(stderr, "usage: %s [-k|-p] [in_file [out_file]]\n\n", name);
+	fprintf(stderr, "  -k  write KiCad output, then exit\n");
+	fprintf(stderr, "  -p  write Postscript output, then exit\n");
 	exit(1);
 }
 
@@ -47,20 +51,39 @@
 {
 	const char *name = *argv;
 	int error;
+	int batch_write_kicad = 0, batch_write_ps = 0;
+	int c;
 
 	error = gui_init(&argc, &argv);
 	if (error)
 		return error;
-	switch (argc) {
-	case 1:
+
+	while ((c = getopt(argc, argv, "kp")) != EOF)
+		switch (c) {
+		case 'k':
+			batch_write_kicad = 1;
+			break;
+		case 'p':
+			batch_write_ps = 1;
+			break;
+		default:
+			usage(name);
+		}
+
+	switch (argc-optind) {
+	case 0:
 		scan_empty();
 		(void) yyparse();
 		break;
-	case 3:
-		save_file = argv[2];
-		/* fall through */
+	case 1:
+		load_file(argv[optind]);
+		save_file_name = argv[optind];
+		break;
 	case 2:
-		load_file(argv[1]);
+		load_file(argv[optind]);
+		save_file_name = argv[optind+1];
+		if (!strcmp(save_file_name, "-"))
+			save_file_name = NULL;
 		break;
 	default:
 		usage(name);
@@ -72,6 +95,14 @@
 	reporter = report_to_stderr;
 	if (!instantiate())
 		return 1;
+
+	if (batch_write_kicad)
+		write_kicad();
+	if (batch_write_ps)
+		write_ps();
+	if (batch_write_kicad || batch_write_ps)
+		exit(0);
+		
 //	inst_debug();
 	error = gui_main();
 	if (error)

Modified: trunk/eda/fped/gui.c
===================================================================
--- trunk/eda/fped/gui.c	2009-08-11 01:20:15 UTC (rev 5417)
+++ trunk/eda/fped/gui.c	2009-08-11 20:17:39 UTC (rev 5418)
@@ -11,18 +11,10 @@
  */
 
 
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <sys/stat.h>
 #include <gtk/gtk.h>
 
-#include "util.h"
 #include "inst.h"
-#include "obj.h"
-#include "dump.h"
-#include "kicad.h"
-#include "postscript.h"
+#include "file.h"
 #include "gui_util.h"
 #include "gui_style.h"
 #include "gui_status.h"
@@ -37,8 +29,6 @@
 #include "icons/meas_off.xpm"
 
 
-extern char *save_file;
-
 GtkWidget *root;
 int show_stuff = 1;
 int show_meas = 1;
@@ -49,162 +39,16 @@
 static GtkWidget *stuff_image[2], *meas_image[2];
 
 
-/* ----- save/write operations --------------------------------------------- */
-
-
-static char *set_extension(const char *name, const char *ext)
-{
-	char *s = stralloc(name);
-	char *slash, *dot;
-	char *res;
-
-	slash = strrchr(s, '/');
-	dot = strrchr(slash ? slash : s, '.');
-	if (dot)
-		*dot = 0;
-	res = stralloc_printf("%s.%s", s, ext);
-	free(s);
-	return res;
-}
-
-
-static int save_to(const char *name, int (*fn)(FILE *file))
-{
-	FILE *file;
-
-	file = fopen(name, "w");
-	if (!file) {
-		perror(name);
-		return 0;
-	}
-	if (!fn(file)) {
-		perror(name);
-		return 0;
-	}
-	if (fclose(file) == EOF) {
-		perror(name);
-		return 0;
-	}
-	return 1;
-}
-
-
-static void save_with_backup(const char *name, int (*fn)(FILE *file))
-{
-	char *s = stralloc(name);
-	char *back, *tmp;
-	char *slash, *dot;
-	int n;
-	struct stat st;
-
-	/* save to temporary file */
-
-	slash = strrchr(s, '/');
-	if (!slash)
-		tmp = stralloc_printf("~%s", s);
-	else {
-		*slash = 0;
-		tmp = stralloc_printf("%s/~%s", s, slash+1);
-		*slash = '/';
-	}
-
-	if (!save_to(tmp, fn))
-		return;
-
-	/* move existing file out of harm's way */
-
-	dot = strrchr(slash ? slash : s, '.');
-	if (dot)
-		*dot = 0;
-	n = 0;
-	while (1) {
-		back = stralloc_printf("%s~%d%s%s",
-		    s, n, dot ? "." : "", dot ? dot+1 : "");
-		if (stat(back, &st) < 0) {
-			if (errno == ENOENT)
-				break;
-			perror(back);
-			free(back);
-			return;
-		}
-		free(back);
-		n++;
-	}
-	if (rename(name, back) < 0) {
-		if (errno != ENOENT) {
-			perror(name);
-			free(back);
-			return;
-		}
-	} else {
-		fprintf(stderr, "renamed %s to %s\n", name, back);
-	}
-	free(back);
-
-	/* rename to final name */
-
-	if (rename(tmp, name) < 0) {
-		perror(name);
-		free(tmp);
-		return;
-	}
-	free(tmp);
-
-	fprintf(stderr, "saved to %s\n", name);
-}
-
-
-static void menu_save(void)
-{
-	if (save_file)
-		save_with_backup(save_file, dump);
-	else {
-		if (!dump(stdout))
-			perror("stdout");
-	}
-}
-
-
-static void menu_write_kicad(void)
-{
-	char *name;
-
-	if (save_file) {
-		name = set_extension(save_file, "mod");
-		save_to(name, kicad);
-		free(name);
-	} else {
-		if (!kicad(stdout))
-			perror("stdout");
-	}
-}
-
-
-static void menu_write_ps(void)
-{
-	char *name;
-
-	if (save_file) {
-		name = set_extension(save_file, "ps");
-		save_to(name, postscript);
-		free(name);
-	} else {
-		if (!postscript(stdout))
-			perror("stdout");
-	}
-}
-
-
 /* ----- menu bar ---------------------------------------------------------- */
 
 
 static GtkItemFactoryEntry menu_entries[] = {
 	{ "/File",		NULL,	NULL,	 	0, "<Branch>" },
-	{ "/File/Save",		NULL,	menu_save,	0, "<Item>" },
+	{ "/File/Save",		NULL,	save_fpd,	0, "<Item>" },
         { "/File/sep0",		NULL,	NULL,		0, "<Separator>" },
-        { "/File/Write KiCad",	NULL,	menu_write_kicad, 0, "<Item>" },
+        { "/File/Write KiCad",	NULL,	write_kicad,	0, "<Item>" },
         { "/File/Write Postscript",
-				NULL,	menu_write_ps,	0, "<Item>" },
+				NULL,	write_ps,	0, "<Item>" },
         { "/File/sep2",		NULL,	NULL,		0, "<Separator>" },
         { "/File/Quit",		NULL,	gtk_main_quit,	0, "<Item>" },
 };

Modified: trunk/eda/fped/postscript.c
===================================================================
--- trunk/eda/fped/postscript.c	2009-08-11 01:20:15 UTC (rev 5417)
+++ trunk/eda/fped/postscript.c	2009-08-11 20:17:39 UTC (rev 5418)
@@ -51,7 +51,7 @@
 static void ps_line(FILE *file, const struct inst *inst)
 {
 	struct coord a = inst->base;
-	struct coord b = inst->u.pad.other;
+	struct coord b = inst->u.rect.end;
 
 	fprintf(file, "1 setlinecap 0.5 setgray %d setlinewidth\n",
 	    inst->u.rect.width);




More information about the commitlog mailing list