diff options
Diffstat (limited to 'plug-ins/imagemap/imap_cern.y')
-rw-r--r-- | plug-ins/imagemap/imap_cern.y | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/plug-ins/imagemap/imap_cern.y b/plug-ins/imagemap/imap_cern.y new file mode 100644 index 0000000..251eb16 --- /dev/null +++ b/plug-ins/imagemap/imap_cern.y @@ -0,0 +1,184 @@ +%{ +/* + * This is a plug-in for GIMP. + * + * Generates clickable image maps. + * + * Copyright (C) 1998-1999 Maurits Rijk lpeek.mrijk@consunet.nl + * + * 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 3 of the License, or + * (at your option) any later version. + * + * This program 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 this program. If not, see <https://www.gnu.org/licenses/>. + * + */ + + +#include <math.h> + +#include <glib/gstdio.h> + +#include <gtk/gtk.h> + +#include "imap_circle.h" +#include "imap_file.h" +#include "imap_main.h" +#include "imap_polygon.h" +#include "imap_rectangle.h" +#include "imap_string.h" + +extern int cern_lex(void); +extern int cern_restart(FILE *cern_in); +static void cern_error(char* s); + +static Object_t *current_object; + +%} + +%union { + int val; + double value; + char *id; +} + +%token<val> RECTANGLE POLYGON CIRCLE DEFAULT +%token<val> AUTHOR DESCRIPTION BEGIN_COMMENT +%token<value> FLOAT +%token<id> COMMENT LINK + +%% + +cern_file : area_list + ; + +area_list : /* Empty */ + | area_list area + ; + +area : default + | rectangle + | circle + | polygon + | comment_line + ; + +default : DEFAULT LINK + { + MapInfo_t *info = get_map_info(); + g_strreplace(&info->default_url, $2); + g_free ($2); + } + ; + + +rectangle : RECTANGLE '(' FLOAT ',' FLOAT ')' '(' FLOAT ',' FLOAT ')' LINK + { + gint x = (gint) $3; + gint y = (gint) $5; + gint width = (gint) fabs($8 - x); + gint height = (gint) fabs($10 - y); + current_object = create_rectangle(x, y, width, height); + object_set_url(current_object, $12); + add_shape(current_object); + g_free ($12); + } + ; + +circle : CIRCLE '(' FLOAT ',' FLOAT ')' FLOAT LINK + { + gint x = (gint) $3; + gint y = (gint) $5; + gint r = (gint) $7; + current_object = create_circle(x, y, r); + object_set_url(current_object, $8); + add_shape(current_object); + g_free ($8); + } + ; + +polygon : POLYGON {current_object = create_polygon(NULL);} coord_list LINK + { + object_set_url(current_object, $4); + add_shape(current_object); + g_free ($4); + } + ; + +coord_list : /* Empty */ + | coord_list coord + { + } + ; + +coord : '(' FLOAT ',' FLOAT ')' + { + Polygon_t *polygon = ObjectToPolygon(current_object); + GdkPoint *point = new_point((gint) $2, (gint) $4); + polygon->points = g_list_append(polygon->points, + (gpointer) point); + } + ; + +comment_line : author_line + | description_line + | real_comment + ; + +real_comment : BEGIN_COMMENT COMMENT + { + g_free ($2); + } + ; + +author_line : AUTHOR COMMENT + { + MapInfo_t *info = get_map_info(); + g_strreplace(&info->author, $2); + g_free ($2); + } + ; + +description_line: DESCRIPTION COMMENT + { + MapInfo_t *info = get_map_info(); + gchar *description; + + description = g_strconcat(info->description, $2, "\n", + NULL); + g_strreplace(&info->description, description); + g_free ($2); + } + ; + + +%% + +static void +cern_error(char* s) +{ + extern FILE *cern_in; + cern_restart(cern_in); +} + +gboolean +load_cern(const char* filename) +{ + gboolean status; + extern FILE *cern_in; + cern_in = g_fopen(filename, "r"); + if (cern_in) { + status = !cern_parse(); + fclose(cern_in); + } else { + status = FALSE; + } + return status; +} |