/* RCS file lexical scanner */
/* $Id: rcsfile.l,v 1.7 2003/07/30 18:41:36 pasky Exp $ */

/*
 * Copyright (c) 2003  Petr Baudis.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * 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.
 *   * Neither the name of the author nor the names of the product's
 *     contributors may be used to endorse or promote products
 *     derived from this software without specific prior written
 *     permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
 */

%{
#include <string.h>
#include "rcsfile.tab.h"
%}

white	[ \t\n]*
ws	{white}
digit	[0-9]
num	[0-9\.]+
nospecial	[^ \t\n$,\.:;@]
id	{num}*{nospecial}({nospecial}|{num})*

%x str

%%

	/* TODO: This buffer should be dynamic. */
	char string_buf[65535];
	char *string_buf_ptr;

{white}		;

@		{ string_buf_ptr = string_buf; BEGIN(str); }
<str>[^@]+	{ char *yptr = yytext; while (*yptr) *string_buf_ptr++ = *yptr++; }
<str>@@		{ char *yptr = yytext; *string_buf_ptr++ = *yptr++; yptr++; }
<str>@		{ BEGIN(INITIAL); *string_buf_ptr = 0; yylval.string = string_buf; return STRING; }

:		{ return PAIRSEP; }
;		{ return STATEMENT_END; }

head		{ return HEAD; }
branch		{ return BRANCH; }
access		{ return ACCESS; }
symbols		{ return SYMBOLS; }
locks		{ return LOCKS; }
strict		{ return STRICT; }
comment		{ return COMMENT; }
expand		{ return EXPAND; }

date		{ return DATE; }
author		{ return AUTHOR; }
state		{ return STATE; }
branches	{ return BRANCHES; }
next		{ return NEXT; }

desc		{ return DESC; }

log		{ return LOG; }
text		{ return TEXT; }

{num}		{ yylval.string = strdup(yytext); return NUM; }
{id}		{ yylval.string = strdup(yytext); return ID; }

%%

/* %option is not POSIX, unfortunately. */
int
yywrap ()
{
	return 1;
}
