%{
/*
 * Copyright (c) 2001 Ian Freislich
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	$Id: parser.l,v 1.6 2003/01/24 09:35:19 ianf Exp $
 */

#include <stdio.h>
#include <string.h>
#include "parser.y.h"

extern int	yyerror(char *); 
extern int	yyline;
%}

%%

"address:"		return ADDRESS;
"address_family:"	return ADDRESS_FAMILY;
"authentication:"	return AUTHENTICATION;
"autodelete:"		return AUTODELETE;
"bulletins:"		return BULLETINS;
"check_passwords:"	return CHECK_PASSWORDS;
"command_logging:"	return COMMAND_LOGGING;
"debug_mode:"		return DEBUG_MODE;
"delivery_time"		return DELIVERY_TIME;
"disable_top:"		return DISABLE_TOP;
"disable_uidl:"		return DISABLE_UIDL;
"fascist_logging:"	return FASCIST_LOGGING;
"false"			return ISFALSE;
"falsify_uidl:"		return FALSIFY_UIDL;
"format:"		return FORMAT;
"hash_depth:"		return HASH_DEPTH;
"inactivity_timeout:"	return INACTIVITY_TIMEOUT;
"inet4"			return INET4;
"inet6"			return INET6;
"interactive_debug:"	return INTERACTIVE_DEBUG;
"listen:"		return LISTEN;
"local_users:"		return LOCAL_USERS;
"mail:"			return MAIL;
"mailbox"		return MAILBOX;
"maildir"		return MAILDIR;
"maildircompat"		return MAILDIRCOMPAT;
"mailidx"		return MAILIDX;
"message_size"		return MESSAGE_SIZE;
"pop3_proxy:"		return POP3_PROXY;
"proxy:"		return PROXY;
"proxy_address:"	return PROXY_ADDRESS;
"proxy_port:"		return PROXY_PORT;
"radius:"		return RADIUS;
"sort_by:"		return SORT_BY;
"ssl:"			return SSL;
"ssl_both"		return SSL_BOTH;
"ssl_mode:"		return SSL_MODE;
"ssl_proxy"		return SSL_PROXY;
"ssl_server"		return SSL_SERVER;
"timeout:"		return R_TIMEOUT;
"tries:"		return TRIES;
"true"			return ISTRUE;
"unspec"		return UNSPEC;
"virtual_server:"	return VIRTUAL_SERVER;
"wire_format:"		return WIRE_FORMAT;

"address:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return ADDRESS;
}

"apop_secrets:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return APOP_SECRETS;
}

"certificate:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return CERTIFICATE;
}

"bulletins:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return BULLETINS;
}

"default_realm:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return DEFAULT_REALM;
}

"etc_directory:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return ETC_DIRECTORY;
}

"expire_after:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return EXPIRE_AFTER;
}

"host:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return HOST;
}

"port:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return PORT;
}

"private_key:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return PRIVATE_KEY;
}

"remove_after:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return REMOVE_AFTER;
}

"secret:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return SECRET;
}

"spool:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return SPOOL;
}

"virtual_user:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return USER;
}

"virtual_passwords:"[ \t]*[^ ^\t ^\n ^#^;]+ {
        char *p;
        for (p = yytext; *p != ' ' && *p != '\t'; p++);
        for (; *p == ' ' || *p == '\t'; p++);
        strncpy(yylval.text, p, 1024);
        yylval.text[1023] = '\0';
        return VIRTUAL_PASSWORDS;
}

"#".*		;
[ \t]*		;
[\n]*		{yyline++;} ;
[{};]		return *yytext;

[0-9]{1,3}"."[0-9]{1,3}"."[0-9]{1,3}"."[0-9]{1,3}":"[0-9]{1,5} {
	strncpy(yylval.text, yytext, 1024);
	yylval.text[1023] = '\0';
	return IPPORT;
}

[0-9]{1,3}"."[0-9]{1,3}"."[0-9]{1,3}"."[0-9]{1,3} {
	strncpy(yylval.text, yytext, 1024);
	yylval.text[1023] = '\0';
	return IPADDR;
}

[0-9^"."]+ {
	yylval.num = atoi(yytext);
	return NUMBER;
}

. {
	yyerror("unmatched characters in config file");
}

%%
int
yywrap(void)
{
	return(1);
}


syntax highlighted by Code2HTML, v. 0.9.1