start command line interface
This commit is contained in:
		| @@ -18,7 +18,7 @@ aux_source_directory("tree-renderer" RENDERER_SOURCES) | |||||||
| aux_source_directory("gds-parser" PARSER_SOURCES) | aux_source_directory("gds-parser" PARSER_SOURCES) | ||||||
| aux_source_directory("latex-output" LATEX_SOURCES) | aux_source_directory("latex-output" LATEX_SOURCES) | ||||||
| aux_source_directory("cairo-output" CAIRO_SOURCES) | aux_source_directory("cairo-output" CAIRO_SOURCES) | ||||||
| set(SOURCE "main.c" "layer-selector.c" "main-window.c") | set(SOURCE "main.c" "layer-selector.c" "mapping-parser.c" "command-line.c" "main-window.c") | ||||||
|  |  | ||||||
| set(SOURCE | set(SOURCE | ||||||
|   ${SOURCE} |   ${SOURCE} | ||||||
|   | |||||||
							
								
								
									
										60
									
								
								command-line.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								command-line.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | |||||||
|  | /* | ||||||
|  |  * GDSII-Converter | ||||||
|  |  * Copyright (C) 2018  Mario Hüttel <mario.huettel@gmx.net> | ||||||
|  |  * | ||||||
|  |  * This file is part of GDSII-Converter. | ||||||
|  |  * | ||||||
|  |  * GDSII-Converter is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License version 2 as | ||||||
|  |  * published by the Free Software Foundation. | ||||||
|  |  * | ||||||
|  |  * GDSII-Converter is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with GDSII-Converter.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "command-line.h" | ||||||
|  | #include "gds-parser/gds-parser.h" | ||||||
|  | #include "mapping-parser.h" | ||||||
|  |  | ||||||
|  | void command_line_convert_gds(char *gds_name, char *pdf_name, char *tex_name, gboolean pdf, gboolean tex, char *layer_file) | ||||||
|  | { | ||||||
|  | 	GList *libs = NULL; | ||||||
|  | 	int res; | ||||||
|  | 	GFile *file; | ||||||
|  | 	GFileInputStream *stream; | ||||||
|  | 	GDataInputStream *dstream; | ||||||
|  |  | ||||||
|  | 	/* Check if parameters are valid */ | ||||||
|  | 	if (!gds_name || ! pdf_name || !tex_name || !layer_file) { | ||||||
|  | 		printf("Probably missing argument. Check --help option\n"); | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Load GDS */ | ||||||
|  | 	clear_lib_list(&libs); | ||||||
|  | 	res = parse_gds_from_file(gds_name, &libs); | ||||||
|  | 	if (res) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	file = g_file_new_for_path(layer_file); | ||||||
|  | 	stream = g_file_read(file, NULL, NULL); | ||||||
|  |  | ||||||
|  | 	if (!stream) | ||||||
|  | 		goto destroy_file; | ||||||
|  |  | ||||||
|  | 	dstream = g_data_input_stream_new(G_INPUT_STREAM(stream)); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	g_object_unref(dstream); | ||||||
|  | 	g_object_unref(stream); | ||||||
|  | destroy_file: | ||||||
|  | 	g_object_unref(file); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | } | ||||||
							
								
								
									
										26
									
								
								command-line.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								command-line.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,26 @@ | |||||||
|  | /* | ||||||
|  |  * GDSII-Converter | ||||||
|  |  * Copyright (C) 2018  Mario Hüttel <mario.huettel@gmx.net> | ||||||
|  |  * | ||||||
|  |  * This file is part of GDSII-Converter. | ||||||
|  |  * | ||||||
|  |  * GDSII-Converter is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License version 2 as | ||||||
|  |  * published by the Free Software Foundation. | ||||||
|  |  * | ||||||
|  |  * GDSII-Converter is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with GDSII-Converter.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef _COMMAND_LINE_H_ | ||||||
|  | #define _COMMAND_LINE_H_ | ||||||
|  | #include <glib.h> | ||||||
|  |  | ||||||
|  | void command_line_convert_gds(char *gds_name, char *pdf_name, char *tex_name, gboolean pdf, gboolean tex, char *layer_file); | ||||||
|  |  | ||||||
|  | #endif /* _COMMAND_LINE_H_ */ | ||||||
| @@ -170,79 +170,6 @@ void generate_layer_widgets(GtkListBox *listbox, GList *libs) | |||||||
| 	gtk_widget_set_sensitive(global_save_button, TRUE); | 	gtk_widget_set_sensitive(global_save_button, TRUE); | ||||||
| } | } | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * @brief load_csv_line |  | ||||||
|  * @param file |  | ||||||
|  * @param export |  | ||||||
|  * @param name |  | ||||||
|  * @param layer |  | ||||||
|  * @param color |  | ||||||
|  * @param opacity |  | ||||||
|  * @return 0 if succesfull, 1 if line was malformatted or parameters are broken, -1 if file end |  | ||||||
|  */ |  | ||||||
| static int load_csv_line(GDataInputStream *stream, gboolean *export, char **name, int *layer, GdkRGBA *color) |  | ||||||
| { |  | ||||||
| 	int ret; |  | ||||||
| 	gsize len; |  | ||||||
| 	gchar *line; |  | ||||||
| 	GRegex *regex; |  | ||||||
| 	GMatchInfo *mi; |  | ||||||
| 	char *match; |  | ||||||
|  |  | ||||||
| 	if ((!export) || (!name) || (!layer) || (!color)) { |  | ||||||
| 		ret = 1; |  | ||||||
| 		goto ret_direct; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	regex = g_regex_new("^(?<layer>[0-9]+),(?<r>[0-9\\.]+),(?<g>[0-9\\.]+),(?<b>[0-9\\.]+),(?<a>[0-9\\.]+),(?<export>[01]),(?<name>.*)$", 0, 0, NULL); |  | ||||||
|  |  | ||||||
| 	line = g_data_input_stream_read_line(stream, &len, NULL, NULL); |  | ||||||
| 	if (!line) { |  | ||||||
| 		ret = -1; |  | ||||||
| 		goto destroy_regex; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	/* Match line in CSV */ |  | ||||||
| 	g_regex_match(regex, line, 0, &mi); |  | ||||||
| 	if (g_match_info_matches(mi)) { |  | ||||||
| 		/* Line is valid */ |  | ||||||
| 		match = g_match_info_fetch_named(mi, "layer"); |  | ||||||
| 		*layer = (int)g_ascii_strtoll(match, NULL, 10); |  | ||||||
| 		g_free(match); |  | ||||||
| 		match = g_match_info_fetch_named(mi, "r"); |  | ||||||
| 		color->red = g_ascii_strtod(match, NULL); |  | ||||||
| 		g_free(match); |  | ||||||
| 		match = g_match_info_fetch_named(mi, "g"); |  | ||||||
| 		color->green = g_ascii_strtod(match, NULL); |  | ||||||
| 		g_free(match); |  | ||||||
| 		match = g_match_info_fetch_named(mi, "b"); |  | ||||||
| 		color->blue = g_ascii_strtod(match, NULL); |  | ||||||
| 		g_free(match); |  | ||||||
| 		match = g_match_info_fetch_named(mi, "a"); |  | ||||||
| 		color->alpha = g_ascii_strtod(match, NULL); |  | ||||||
| 		g_free(match); |  | ||||||
| 		match = g_match_info_fetch_named(mi, "export"); |  | ||||||
| 		*export = ((!strcmp(match, "1")) ? TRUE : FALSE); |  | ||||||
| 		g_free(match); |  | ||||||
| 		match = g_match_info_fetch_named(mi, "name"); |  | ||||||
| 		*name = match; |  | ||||||
|  |  | ||||||
| 		ret = 0; |  | ||||||
| 	} else { |  | ||||||
| 		/* Line is malformatted */ |  | ||||||
| 		printf("Could not recognize line in CSV as valid entry: %s\n", line); |  | ||||||
| 		ret = 1; |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	g_match_info_free(mi); |  | ||||||
| 	g_free(line); |  | ||||||
| destroy_regex: |  | ||||||
| 	g_regex_unref(regex); |  | ||||||
| ret_direct: |  | ||||||
| 	return ret; |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static LayerElement *find_layer_element_in_list(GList *el_list, int layer) | static LayerElement *find_layer_element_in_list(GList *el_list, int layer) | ||||||
| { | { | ||||||
| 	LayerElement *ret = NULL; | 	LayerElement *ret = NULL; | ||||||
|   | |||||||
| @@ -22,14 +22,7 @@ | |||||||
|  |  | ||||||
| #include <gtk/gtk.h> | #include <gtk/gtk.h> | ||||||
| #include <glib.h> | #include <glib.h> | ||||||
|  | #include "mapping-parser.h" | ||||||
| struct layer_info |  | ||||||
| { |  | ||||||
| 	int layer; |  | ||||||
| 	char *name; |  | ||||||
| 	int stacked_position; ///< Lower is bottom, higher is top |  | ||||||
| 	GdkRGBA color; |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| void generate_layer_widgets(GtkListBox *listbox, GList *libs); | void generate_layer_widgets(GtkListBox *listbox, GList *libs); | ||||||
| void setup_load_mapping_callback(GtkWidget *button, GtkWindow *main_window); | void setup_load_mapping_callback(GtkWidget *button, GtkWindow *main_window); | ||||||
|   | |||||||
							
								
								
									
										49
									
								
								main.c
									
									
									
									
									
								
							
							
						
						
									
										49
									
								
								main.c
									
									
									
									
									
								
							| @@ -19,7 +19,9 @@ | |||||||
|  |  | ||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <gtk/gtk.h> | #include <gtk/gtk.h> | ||||||
|  | #include <glib.h> | ||||||
| #include "main-window.h" | #include "main-window.h" | ||||||
|  | #include "command-line.h" | ||||||
|  |  | ||||||
| struct application_data { | struct application_data { | ||||||
| 	GtkApplication *app; | 	GtkApplication *app; | ||||||
| @@ -44,7 +46,7 @@ static void app_about(GSimpleAction *action, GVariant *parameter, gpointer user_ | |||||||
| 	gtk_window_set_transient_for(GTK_WINDOW(dialog), appdata->main_window); | 	gtk_window_set_transient_for(GTK_WINDOW(dialog), appdata->main_window); | ||||||
| 	gtk_dialog_run(dialog); | 	gtk_dialog_run(dialog); | ||||||
|  |  | ||||||
| 	gtk_widget_destroy(dialog); | 	gtk_widget_destroy(GTK_WIDGET(dialog)); | ||||||
| 	g_object_unref(builder); | 	g_object_unref(builder); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -64,11 +66,12 @@ static void gapp_activate(GApplication *app, gpointer user_data) | |||||||
| 	gtk_widget_show(GTK_WIDGET(main_window)); | 	gtk_widget_show(GTK_WIDGET(main_window)); | ||||||
| } | } | ||||||
|  |  | ||||||
| int main(int argc, char **argv) | static int start_gui(int argc, char **argv) | ||||||
| { | { | ||||||
|  |  | ||||||
| 	GtkApplication *gapp; | 	GtkApplication *gapp; | ||||||
| 	int app_status; | 	int app_status; | ||||||
| 	struct application_data appdata; | 	static struct application_data appdata; | ||||||
| 	GMenu *menu; | 	GMenu *menu; | ||||||
| 	GMenu *m_quit; | 	GMenu *m_quit; | ||||||
| 	GMenu *m_about; | 	GMenu *m_about; | ||||||
| @@ -98,5 +101,45 @@ int main(int argc, char **argv) | |||||||
| 	app_status = g_application_run (G_APPLICATION(gapp), argc, argv); | 	app_status = g_application_run (G_APPLICATION(gapp), argc, argv); | ||||||
| 	g_object_unref (gapp); | 	g_object_unref (gapp); | ||||||
|  |  | ||||||
|  | 	return app_status; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(int argc, char **argv) | ||||||
|  | { | ||||||
|  | 	GError *error = NULL; | ||||||
|  | 	GOptionContext *context; | ||||||
|  | 	gchar *pdfname = NULL, *texname = NULL, *mappingname = NULL; | ||||||
|  | 	gboolean tikz = TRUE, pdf = FALSE; | ||||||
|  | 	int scale = 1000; | ||||||
|  | 	int app_status; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | 	GOptionEntry entries[] = | ||||||
|  | 	{ | ||||||
|  | 	  { "tikz", 't', 0, G_OPTION_ARG_NONE, &tikz, "Output TikZ code", NULL }, | ||||||
|  | 	  { "pdf", 'p', 0, G_OPTION_ARG_NONE, &pdf, "Output PDF document", NULL }, | ||||||
|  | 	  { "scale", 's', 0, G_OPTION_ARG_INT, &scale, "Divide putput coordinates by <SCALE>", "<SCALE>" }, | ||||||
|  | 	  { "tex-output", 'o', 0, G_OPTION_ARG_FILENAME, &texname, "Optional path for TeX file", "PATH" }, | ||||||
|  | 	  { "pdf-output", 'O', 0, G_OPTION_ARG_FILENAME, &pdfname, "Optional path for PDF file", "PATH" }, | ||||||
|  | 	  { "mapping", 'm', 0, G_OPTION_ARG_FILENAME, &mappingname, "Path for Layer Mapping File", "PATH" }, | ||||||
|  | 	  { NULL } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
|  | 	context = g_option_context_new(" FILE - Convert GDS file <FILE> to graphic"); | ||||||
|  | 	g_option_context_add_main_entries(context, entries, NULL); | ||||||
|  | 	g_option_context_add_group(context, gtk_get_option_group(TRUE)); | ||||||
|  | 	if (!g_option_context_parse (context, &argc, &argv, &error)) | ||||||
|  | 	    { | ||||||
|  | 	      g_print ("Option parsing failed: %s\n", error->message); | ||||||
|  | 	      exit (1); | ||||||
|  | 	    } | ||||||
|  |  | ||||||
|  | 	if (argc >= 2) { | ||||||
|  | 		command_line_convert_gds(NULL, pdfname, texname, pdf, tikz, mappingname); | ||||||
|  | 	} else { | ||||||
|  | 		app_status = start_gui(argc, argv); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  |  | ||||||
| 	return app_status; | 	return app_status; | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										95
									
								
								mapping-parser.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								mapping-parser.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | |||||||
|  | /* | ||||||
|  |  * | ||||||
|  |  * GDSII-Converter | ||||||
|  |  * Copyright (C) 2018  Mario Hüttel <mario.huettel@gmx.net> | ||||||
|  |  * | ||||||
|  |  * This file is part of GDSII-Converter. | ||||||
|  |  * | ||||||
|  |  * GDSII-Converter is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License version 2 as | ||||||
|  |  * published by the Free Software Foundation. | ||||||
|  |  * | ||||||
|  |  * GDSII-Converter is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with GDSII-Converter.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include "mapping-parser.h" | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @brief load_csv_line | ||||||
|  |  * @param file | ||||||
|  |  * @param export | ||||||
|  |  * @param name | ||||||
|  |  * @param layer | ||||||
|  |  * @param color | ||||||
|  |  * @param opacity | ||||||
|  |  * @return 0 if succesfull, 1 if line was malformatted or parameters are broken, -1 if file end | ||||||
|  |  */ | ||||||
|  | int load_csv_line(GDataInputStream *stream, gboolean *export, char **name, int *layer, GdkRGBA *color) | ||||||
|  | { | ||||||
|  | 	int ret; | ||||||
|  | 	gsize len; | ||||||
|  | 	gchar *line; | ||||||
|  | 	GRegex *regex; | ||||||
|  | 	GMatchInfo *mi; | ||||||
|  | 	char *match; | ||||||
|  |  | ||||||
|  | 	if ((!export) || (!name) || (!layer) || (!color)) { | ||||||
|  | 		ret = 1; | ||||||
|  | 		goto ret_direct; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	regex = g_regex_new("^(?<layer>[0-9]+),(?<r>[0-9\\.]+),(?<g>[0-9\\.]+),(?<b>[0-9\\.]+),(?<a>[0-9\\.]+),(?<export>[01]),(?<name>.*)$", 0, 0, NULL); | ||||||
|  |  | ||||||
|  | 	line = g_data_input_stream_read_line(stream, &len, NULL, NULL); | ||||||
|  | 	if (!line) { | ||||||
|  | 		ret = -1; | ||||||
|  | 		goto destroy_regex; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	/* Match line in CSV */ | ||||||
|  | 	g_regex_match(regex, line, 0, &mi); | ||||||
|  | 	if (g_match_info_matches(mi)) { | ||||||
|  | 		/* Line is valid */ | ||||||
|  | 		match = g_match_info_fetch_named(mi, "layer"); | ||||||
|  | 		*layer = (int)g_ascii_strtoll(match, NULL, 10); | ||||||
|  | 		g_free(match); | ||||||
|  | 		match = g_match_info_fetch_named(mi, "r"); | ||||||
|  | 		color->red = g_ascii_strtod(match, NULL); | ||||||
|  | 		g_free(match); | ||||||
|  | 		match = g_match_info_fetch_named(mi, "g"); | ||||||
|  | 		color->green = g_ascii_strtod(match, NULL); | ||||||
|  | 		g_free(match); | ||||||
|  | 		match = g_match_info_fetch_named(mi, "b"); | ||||||
|  | 		color->blue = g_ascii_strtod(match, NULL); | ||||||
|  | 		g_free(match); | ||||||
|  | 		match = g_match_info_fetch_named(mi, "a"); | ||||||
|  | 		color->alpha = g_ascii_strtod(match, NULL); | ||||||
|  | 		g_free(match); | ||||||
|  | 		match = g_match_info_fetch_named(mi, "export"); | ||||||
|  | 		*export = ((!strcmp(match, "1")) ? TRUE : FALSE); | ||||||
|  | 		g_free(match); | ||||||
|  | 		match = g_match_info_fetch_named(mi, "name"); | ||||||
|  | 		*name = match; | ||||||
|  |  | ||||||
|  | 		ret = 0; | ||||||
|  | 	} else { | ||||||
|  | 		/* Line is malformatted */ | ||||||
|  | 		printf("Could not recognize line in CSV as valid entry: %s\n", line); | ||||||
|  | 		ret = 1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	g_match_info_free(mi); | ||||||
|  | 	g_free(line); | ||||||
|  | destroy_regex: | ||||||
|  | 	g_regex_unref(regex); | ||||||
|  | ret_direct: | ||||||
|  | 	return ret; | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										35
									
								
								mapping-parser.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								mapping-parser.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | /* | ||||||
|  |  * GDSII-Converter | ||||||
|  |  * Copyright (C) 2018  Mario Hüttel <mario.huettel@gmx.net> | ||||||
|  |  * | ||||||
|  |  * This file is part of GDSII-Converter. | ||||||
|  |  * | ||||||
|  |  * GDSII-Converter is free software: you can redistribute it and/or modify | ||||||
|  |  * it under the terms of the GNU General Public License version 2 as | ||||||
|  |  * published by the Free Software Foundation. | ||||||
|  |  * | ||||||
|  |  * GDSII-Converter is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with GDSII-Converter.  If not, see <http://www.gnu.org/licenses/>. | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #ifndef __MAPPING_PARSER_H__ | ||||||
|  | #define __MAPPING_PARSER_H__ | ||||||
|  |  | ||||||
|  | #include <gtk/gtk.h> | ||||||
|  |  | ||||||
|  | struct layer_info | ||||||
|  | { | ||||||
|  |         int layer; | ||||||
|  |         char *name; | ||||||
|  |         int stacked_position; ///< Lower is bottom, higher is top | ||||||
|  |         GdkRGBA color; | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | int load_csv_line(GDataInputStream *stream, gboolean *export, char **name, int *layer, GdkRGBA *color); | ||||||
|  |  | ||||||
|  | #endif /* __MAPPING_PARSER_H__ */ | ||||||
		Reference in New Issue
	
	Block a user