summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htcommon/conf_parser.yxx
diff options
context:
space:
mode:
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htcommon/conf_parser.yxx')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htcommon/conf_parser.yxx270
1 files changed, 270 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htcommon/conf_parser.yxx b/debian/htdig/htdig-3.2.0b6/htcommon/conf_parser.yxx
new file mode 100644
index 00000000..85d0213d
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htcommon/conf_parser.yxx
@@ -0,0 +1,270 @@
+%{
+//
+// conf_parser.yxx
+//
+// This syntax analyzer is used to parse ht://Dig config
+// files.
+//
+// Part of the ht://Dig package <http://www.htdig.org/>
+// Copyright (c) 1999-2004 The ht://Dig Group
+// For copyright details, see the file COPYING in your distribution
+// or the GNU Library General Public License (LGPL) version 2 or later
+// <http://www.gnu.org/copyleft/lgpl.html>
+//
+// $Id: conf_parser.yxx,v 1.8 2004/06/10 14:48:39 angusgb Exp $
+//
+
+#ifdef HAVE_CONFIG_H
+#include "htconfig.h"
+#endif /* HAVE_CONFIG_H */
+
+/* Bison version > 1.25 needed */
+/* TODO:
+1. Better error handling
+2. ?
+*/
+#include <stdio.h> /* for debug */
+#include <stdlib.h>
+
+#ifdef HAVE_STD
+#include <iostream>
+#ifdef HAVE_NAMESPACES
+using namespace std;
+#endif
+#else
+#include <iostream.h>
+#endif /* HAVE_STD */
+
+#include "HtConfiguration.h"
+#include "htString.h"
+/*#define YYDEBUG 1*/
+#define YYPARSE_PARAM aConf
+int yyerror(char *s);
+int yylex(void);
+#undef DEBUG
+#ifdef DEBUG
+int sn_debug=3;
+#endif
+%}
+
+%union {
+ char *str;
+ ConfigDefaults *ConfLine;
+ HtConfiguration *ConfLines;
+}
+
+%token NUM T_DELIMITER T_NEWLINE T_RIGHT_BR T_LEFT_BR T_SLASH
+%token <str> T_STRING T_KEYWORD T_NUMBER
+%type <str> list
+%type <ConfLine> simple_expression
+%type <ConfLines> simple_expression_list
+
+/* Grammar follows */
+%%
+
+input:
+ | input block { /* Whole config file */ }
+;
+
+block: simple_expression {
+ // name: value
+ ((HtConfiguration *)aConf)->AddParsed($1->name,$1->value);
+ #ifdef DEBUG
+ if (sn_debug>=2) {
+ cout<<"Added to conf: "<<$1->name<<":"<<$1->value<<endl;
+ }
+ #endif
+ delete [] $1->name;
+ delete [] $1->value;
+ delete $1;
+ }
+ | complex_expression {
+ // <server www.gc.lviv.ua>
+ // server_max_docs: 456
+ // ... : ...
+ // </server>
+ }
+ | T_NEWLINE { /* Ignore empty lines */ }
+;
+
+simple_expression: T_KEYWORD T_DELIMITER T_STRING T_NEWLINE {
+ // locale: uk_UA.KOI8-U
+ //
+ // We can't do inserting into config
+ // here because we don't know if it's
+ // in complex expression or not.
+ $$=new ConfigDefaults;
+ $$->name = $1; $$->value=$3;
+ }
+
+ | T_KEYWORD T_DELIMITER T_NUMBER T_NEWLINE {
+ // max_head_length: 300000
+ //
+ $$=new ConfigDefaults;
+ $$->name = $1; $$->value=$3;
+ }
+ | T_KEYWORD T_DELIMITER list T_NEWLINE {
+ // bad_extensions: .XLS .xls .pdf .PDF .doc .DOC
+ //
+ $$=new ConfigDefaults;
+ $$->name = $1; $$->value=$3;
+ }
+ | T_KEYWORD T_DELIMITER T_NEWLINE {
+ // excude_urls:
+ //
+ $$=new ConfigDefaults;
+ $$->name = $1;
+ $$->value=new char[1];
+ *$$->value='\0';
+ }
+;
+
+complex_expression: T_LEFT_BR T_KEYWORD T_DELIMITER T_STRING T_RIGHT_BR T_NEWLINE simple_expression_list T_LEFT_BR T_SLASH T_KEYWORD T_RIGHT_BR T_NEWLINE {
+ // check if "<param> ... </param>" are equal
+ if (strcmp($2,$10)!=0) {
+ // todo: setup error string, return with error.
+ // Inform about line number
+ cerr<<"Brackets mismatch: Opened: "<<$2<<" Closed: "<<$10<<endl;
+ // exit(1);
+ }
+ // Oll right. Append set of parameters to object($2)
+ ((HtConfiguration *)aConf)->Add($2,$4,$7);
+ #ifdef DEBUG
+ if (sn_debug >= 2) {
+ cout<<"Added to conf: "<<$2<<":"<<$4<<":"<<$7<<endl;
+ }
+ #endif
+ delete $2;
+ delete $4;
+ delete [] $10;
+ }
+ ;
+
+simple_expression_list: simple_expression {
+ //aaa: nnn
+ //bbb: ccc
+ // ...
+ //
+ // First entry. We need to create conf to store it.
+ HtConfiguration *expressionList=new HtConfiguration();
+ expressionList->AddParsed($1->name,$1->value);
+ $$=expressionList;
+ #ifdef DEBUG
+ if (sn_debug>=2) {
+ cout<<"Create list of properties: "<<expressionList<<endl;
+ }
+ #endif
+ delete $1->name;
+ delete $1->value;
+ delete $1;
+}
+ | simple_expression_list simple_expression {
+ $1->AddParsed($2->name,$2->value);
+ #ifdef DEBUG
+ if (sn_debug>=2) {
+ cout<<$2->name<<":"<<$2->value<<" added to "<<$1<<endl;
+ }
+ #endif
+ delete $2->name;
+ delete $2->value;
+ delete $2;
+ //$$=$1; //I think $$==$1
+ }
+ | T_NEWLINE { /* Ignore empty lines */ }
+ ;
+
+list: T_STRING T_STRING {
+ // Paste 2 components. Reallocate memory for 2 components.
+ if (($$=new char[strlen($1)+strlen($2)+1+1])==NULL) {
+ fprintf(stderr,"Can't allocate memory\n");
+ exit(1);
+ }
+ strcpy($$,$1);
+ strcat($$," "); // Delimiter in list
+ strcat($$,$2);
+ delete [] $1;
+ delete [] $2;
+ }
+
+ | T_NUMBER T_STRING {
+ // Paste 2 components. Reallocate memory for 2 components.
+ if (($$=new char[strlen($1)+strlen($2)+1+1])==NULL) {
+ fprintf(stderr,"Can't allocate memory\n");
+ exit(1);
+ }
+ strcpy($$,$1);
+ strcat($$," "); // Delimiter in list
+ strcat($$,$2);
+ delete [] $1;
+ delete [] $2;
+ }
+
+ | T_STRING T_NUMBER {
+ // Paste 2 components. Reallocate memory for 2 components.
+ if (($$=new char[strlen($1)+strlen($2)+1+1])==NULL) {
+ fprintf(stderr,"Can't allocate memory\n");
+ exit(1);
+ }
+ strcpy($$,$1);
+ strcat($$," "); // Delimiter in list
+ strcat($$,$2);
+ delete [] $1;
+ delete [] $2;
+ }
+
+ | T_NUMBER T_NUMBER {
+ // Paste 2 components. Reallocate memory for 2 components.
+ if (($$=new char[strlen($1)+strlen($2)+1+1])==NULL) {
+ fprintf(stderr,"Can't allocate memory\n");
+ exit(1);
+ }
+ strcpy($$,$1);
+ strcat($$," "); // Delimiter in list
+ strcat($$,$2);
+ delete [] $1;
+ delete [] $2;
+ }
+
+ | list T_STRING {
+ char *old=$$;
+ if (($$=new char [strlen($$)+strlen($2)+1+1])==NULL) {
+ fprintf(stderr,"Can't reallocate memory\n");
+ exit(1);
+ }
+ strcpy($$,old);
+ delete [] old;
+ strcat($$," ");
+ strcat($$,$2);
+ delete [] $2;
+ }
+ | list T_NUMBER {
+ char *old=$$;
+ if (($$=new char [strlen($$)+strlen($2)+1+1])==NULL) {
+ fprintf(stderr,"Can't reallocate memory\n");
+ exit(1);
+ }
+ strcpy($$,old);
+ delete [] old;
+ strcat($$," ");
+ strcat($$,$2);
+ delete [] $2;
+ }
+;
+%%
+int
+yyerror (char *s) /* Called by yyparse on error */
+{
+ extern int yylineno;
+ extern int include_stack_ptr;
+ extern String *name_stack[];
+ HtConfiguration* config= HtConfiguration::config();
+ String str;
+ if (include_stack_ptr > 0)
+ str = *name_stack[include_stack_ptr-1];
+ else // still at top level config
+ str = config->getFileName();
+ //fprintf (stderr, "%s\nIn line %d\n",s,yylineno);
+ fprintf(stderr,"Error in file %s line %d: %s\n",str.get(),yylineno,s);
+ // exit(1);
+ return -1;
+}