summaryrefslogtreecommitdiff
path: root/liba2ps/parseppd.y
diff options
context:
space:
mode:
Diffstat (limited to 'liba2ps/parseppd.y')
-rw-r--r--liba2ps/parseppd.y197
1 files changed, 197 insertions, 0 deletions
diff --git a/liba2ps/parseppd.y b/liba2ps/parseppd.y
new file mode 100644
index 0000000..df4d863
--- /dev/null
+++ b/liba2ps/parseppd.y
@@ -0,0 +1,197 @@
+%{ /* -*- c -*- */
+/*
+ * Grammar for parsing the style sheets
+ *
+ * Copyright (c) 1988-1993 Miguel Santana
+ * Copyright (c) 1995-1999 Akim Demaille, Miguel Santana
+ *
+ */
+
+/*
+ * This file is part of a2ps
+ *
+ * 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, 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; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+/*
+ * $Id: parseppd.y,v 1.1.1.1.2.1 2007/12/29 01:58:21 mhatta Exp $
+ */
+
+#include <config.h>
+
+#include "a2ps.h"
+
+#include "jobs.h"
+#include "ppd.h"
+#include "message.h"
+#include "routines.h"
+#include "lexppd.h"
+
+#define YYDEBUG 1
+#define YYERROR_VERBOSE 1
+#define YYPRINT(file, type, value) yyprint (file, type, value)
+
+/* Comes from the caller */
+extern FILE * ppdin;
+extern struct a2ps_job * job;
+
+/* Local prototypes */
+void yyerror (const char *msg);
+static void yyprint ();
+
+/* Initilizes the obstacks */
+void ppdlex_initialize (void);
+
+int yylex (void);
+
+static struct ppd * ppd_parse_result;
+
+%}
+%union
+{
+ char * string;
+ unsigned char * ustring;
+ struct ppd * ppd;
+}
+
+%token EOL
+%token tDefaultFont tFont tModelName tNickName
+%token <string> STRING SYMBOL
+%token <ustring> USTRING
+
+%type <ppd> ppd
+%type <string> font_clause
+
+
+%%
+
+/************************************************************************/
+/* Top most */
+/************************************************************************/
+file :
+ ppd
+ {
+ ppd_parse_result = $1;
+ /* Nothing Right Now */;
+ }
+ ;
+
+ppd :
+ /* Empty */
+ {
+ $$ = ppd_new ();
+ }
+ | ppd font_clause EOL
+ {
+ ppd_font_add ($1, $2);
+ $$ = $1;
+ }
+ | ppd tModelName ':' STRING EOL
+ {
+ if (!$1->modelname)
+ $1->modelname = $4;
+ $$ = $1;
+ }
+ | ppd tNickName ':' STRING EOL
+ {
+ if (!$1->nickname)
+ $1->nickname = $4;
+ $$ = $1;
+ }
+ | ppd SYMBOL
+ {
+ $$ = $1;
+ }
+ | ppd STRING
+ {
+ $$ = $1;
+ }
+ | ppd USTRING
+ {
+ $$ = $1;
+ }
+ | ppd ':'
+ {
+ $$ = $1;
+ }
+ | ppd EOL
+ {
+ $$ = $1;
+ }
+ ;
+
+/************************************************************************/
+/* *Font entry */
+/************************************************************************/
+font_clause :
+ tFont SYMBOL ':' SYMBOL STRING SYMBOL SYMBOL
+ { $$= $2; }
+ | tDefaultFont ':' SYMBOL
+ { $$= $3; }
+ ;
+%%
+
+void
+yyerror (const char *msg)
+{
+ error_at_line (1, 0, ppdfilename, ppdlineno, "%s", msg);
+}
+
+/*
+ * For debugging
+ */
+static void
+yyprint (FILE *file, int type, YYSTYPE value)
+{
+ switch (type) {
+ case STRING:
+ fprintf (file, " \"%s\"", value.string);
+ break;
+
+ case SYMBOL:
+ fprintf (file, " %s", value.string);
+ break;
+
+ case USTRING:
+ fprintf (file, " u\"%s\"", value.ustring);
+ break;
+ }
+}
+
+struct ppd *
+a2ps_ppd_parse (const char * filename, char * const * path)
+{
+ /* The filename won't be changed. */
+ ppdfilename = (char *) filename;
+ ppdlineno = 1;
+ ppdin = xrfopen (ppdfilename);
+ ppdpath = path;
+
+ message (msg_file | msg_ppd | msg_parse,
+ (stderr, "Parsing file `%s'\n", ppdfilename));
+
+ ppdlex_initialize ();
+
+ if (msg_test (msg_parse))
+ yydebug = true;
+ else
+ yydebug = false;
+
+ yyparse (); /* FIXME: test return value? */
+
+ fclose (ppdin);
+ return ppd_parse_result;
+}