summaryrefslogtreecommitdiffstats
path: root/debian/htdig/htdig-3.2.0b6/htcommon/conf_lexer.lxx
diff options
context:
space:
mode:
Diffstat (limited to 'debian/htdig/htdig-3.2.0b6/htcommon/conf_lexer.lxx')
-rw-r--r--debian/htdig/htdig-3.2.0b6/htcommon/conf_lexer.lxx206
1 files changed, 206 insertions, 0 deletions
diff --git a/debian/htdig/htdig-3.2.0b6/htcommon/conf_lexer.lxx b/debian/htdig/htdig-3.2.0b6/htcommon/conf_lexer.lxx
new file mode 100644
index 00000000..d17f7e50
--- /dev/null
+++ b/debian/htdig/htdig-3.2.0b6/htcommon/conf_lexer.lxx
@@ -0,0 +1,206 @@
+/*
+//
+// conf_lexer.lxx
+//
+// This lexical parser is used to parse ht://Dig config
+// files.
+//
+// Note: The resulting .cxx file produces warnings of unused
+// labels. As at 2003-06-02, these have been manually
+// removed, but they will reappear when (f)lex is re-run.
+//
+// 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_lexer.lxx,v 1.12 2004/06/10 14:48:38 angusgb Exp $
+//
+*/
+%{
+#ifdef HAVE_CONFIG_H
+#include "htconfig.h"
+#endif /* HAVE_CONFIG_H */
+%}
+
+%option yylineno noyywrap nounput
+%x t_right
+%x incl
+%x bracket
+%x br_string
+
+%{
+#ifdef HAVE_STRINGS_H
+#include <strings.h>
+#endif
+
+#include "HtConfiguration.h"
+//#include "Dictionary.h"
+#include "conf_parser.h"
+#define MAX_INCLUDE_DEPTH 10
+YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
+String *name_stack[MAX_INCLUDE_DEPTH];
+int lineno_stack[MAX_INCLUDE_DEPTH];
+int include_stack_ptr = 0;
+%}
+
+KEYWORD [a-zA-Z_][a-zA-Z_0-9/]*
+NUMBER [0-9]+
+STRING [\x21-\xff]+
+BR_STRING [^ \n\t<>]+
+%%
+
+^[[:space:]]*#.*\n /* Ignore comments */
+^[[:space:]]*\n /* Ignore empty lines */
+<*>[ \t]+ /* Ignore spaces */
+include[ \t]*: BEGIN(incl);
+"<" { BEGIN(bracket); return(T_LEFT_BR); }
+<bracket>"/" return(T_SLASH);
+<bracket>">" return(T_RIGHT_BR);
+<INITIAL,bracket>{KEYWORD} {
+ //yylval.str = (char *)malloc(yyleng+1);
+ yylval.str = new char[yyleng+1];
+ strcpy(yylval.str,yytext);
+ return(T_KEYWORD);
+ }
+<br_string>{BR_STRING} {
+ BEGIN(bracket);
+ yylval.str = new char[yyleng+1];
+ strcpy(yylval.str,yytext);
+ return(T_STRING);
+ }
+
+<t_right>{NUMBER} {
+ //yylval.str = (char*)malloc(yyleng+1);
+ yylval.str = new char[yyleng+1];
+ strcpy(yylval.str,yytext);
+ return(T_NUMBER);
+ }
+
+<INITIAL,bracket>: {
+ if (YY_START==bracket)
+ BEGIN(br_string);
+ else
+ BEGIN(t_right);
+ return(T_DELIMITER);
+ }
+
+<t_right>{STRING}\\\n {
+ //yylval.str = (char *)malloc(yyleng+1-2);
+ yylval.str = new char[yyleng+1-2];
+ //strcpy(yylval.str,yytext);
+ memcpy(yylval.str,yytext,yyleng-2);
+ yylval.str[yyleng-2]='\0';
+ return(T_STRING);
+ }
+
+<t_right>"\""[^\n]+"\"" {
+ yylval.str = new char[yyleng+1];
+ strcpy(yylval.str,yytext);
+ return(T_STRING);
+ }
+
+<t_right>{STRING} {
+ //yylval.str = (char *)malloc(yyleng+1);
+ yylval.str = new char[yyleng+1];
+ strcpy(yylval.str,yytext);
+ return(T_STRING);
+ }
+<t_right>\\\n
+ {
+ /* Ignore newline after "\" */
+ }
+<t_right>[ \t]*
+ {
+ /* Ignore spaces */
+ }
+<incl>{STRING} { /* got the include file name */
+ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH )
+ {
+ fprintf(stderr,"Includes nested too deeply\n");
+ // exit(1); // Seems too harsh!
+ return(T_NEWLINE);
+ }
+ include_stack[include_stack_ptr++] =
+ YY_CURRENT_BUFFER;
+
+ HtConfiguration* config= HtConfiguration::config();
+ // handle ${var} in file name
+ String ParsedFilename =
+ config->ParseString(yytext);
+
+ if (ParsedFilename[0] != '/')
+ { // Given file name not fully qualified
+ // so strip dir. name from current one
+ String str;
+ if (include_stack_ptr > 1)
+ str = *name_stack[include_stack_ptr-2];
+ else // still at top level config
+ str = config->getFileName();
+ int len = str.lastIndexOf('/') + 1;
+ if (len > 0)
+ { // Current name has directory path
+ // component, so use it for new name
+ str.chop(str.length() - len);
+ str << ParsedFilename;
+ ParsedFilename = str;
+ }
+ }
+
+ yyin = fopen( ParsedFilename.get(), "r" );
+
+ if ( ! yyin ) {
+ fprintf(stderr,"can't find file: %s\n",yytext);
+ // exit(1); // Seems too harsh!
+ include_stack_ptr--;
+ return(T_NEWLINE);
+ }
+ name_stack[include_stack_ptr-1] =
+ new String(ParsedFilename.get());
+ lineno_stack[include_stack_ptr-1] = yylineno;
+ yylineno = 1;
+ yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE ) );
+
+ BEGIN(INITIAL);
+ }
+
+<<EOF>> {
+ if ( include_stack_ptr <= 0 )
+ {
+ static int termnext = 0;
+ // fix to allow unterminated final line
+ if (++termnext <= 1)
+ return(T_NEWLINE);
+ termnext = 0; // in case we're called again
+ yyterminate();
+ }
+ else
+ {
+ delete name_stack[include_stack_ptr-1];
+ yylineno = lineno_stack[include_stack_ptr-1];
+ yy_delete_buffer( YY_CURRENT_BUFFER );
+ yy_switch_to_buffer(
+ include_stack[--include_stack_ptr] );
+ }
+ }
+
+
+<bracket,t_right>\n {
+ BEGIN(INITIAL);
+ return(T_NEWLINE);
+ }
+^[[:space:]]+
+
+\n
+<*>.|\n {
+ 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,"Unknown char in file %s line %d: %s\n",str.get(),yylineno,yytext);
+ // exit(1); // Seems too harsh!
+ }
+%%