%{
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "drbdadm_parser.h"
#include "drbdadm.h"
#include "drbdtool_common.h"

void long_string(char* text);
void long_dqstring(char* text);
void err_dqstring(char* text);

#if 0
#define DP printf("'%s' ",yytext)
#else
#define DP
#endif

#define CP yylval.txt = strdup(yytext); yylval.rc = R_NO_CHECK
#define RC(N) yylval.rc = R_ ## N

#define YY_NO_INPUT 1
#define YY_NO_UNPUT 1

#ifndef YY_FLEX_SUBMINOR_VERSION
#define MAX_INCLUDE_DEPTH 10
YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
int include_stack_ptr = 0;
#endif

%}

%option noyywrap
%option nounput

NUM		[0-9]{1,8}[MKGs]?
SNUMB		[0-9]{1,3}
IPV4ADDR	({SNUMB}"."){3}{SNUMB}
HEX4            [0-9a-fA-F]{1,4}
IPV6ADDR	((({HEX4}":"){0,5}{HEX4})?":"{HEX4}?":"({HEX4}(":"{HEX4}){0,5})?("%"{STRING})?)|("::"[fF]{4}":"{IPV4ADDR})
WS		[ \t\r]
OPCHAR		[{};\[\]:]
DQSTRING	\"([^\"\\\n]|\\[^\n]){0,255}\"
LONG_DQSTRING	\"([^\"\\\n]|\\[^\n]){255}.
ERR_DQSTRING	\"([^\"\\\n]|\\[^\n]){0,255}[\\\n]
STRING		[a-zA-Z0-9/._-]{1,128}
LONG_STRING	[a-zA-Z0-9/._-]{129}

%%

\n			{ line++; 				}
\#.*			/* ignore comments */
{WS}			/* ignore whitespaces */
{OPCHAR}		{ DP; return yytext[0];			}
on			{ DP; return TK_ON;			}
ignore-on		{ DP; return TK_IGNORE;			}
stacked-on-top-of	{ DP; return TK_STACKED;		}
floating		{ DP; return TK_FLOATING;		}
no			{ DP; return TK_NO;			}
net			{ DP; return TK_NET;			}
yes			{ DP; return TK_YES;			}
ask			{ DP; return TK_ASK;			}
skip			{ DP; return TK_SKIP;			}
disk			{ DP; return TK_DISK;			}
proxy			{ DP; return TK_PROXY;			}
minor			{ DP; return TK_MINOR;			}
inside			{ DP; return TK_INSIDE;			}
volume			{ DP; return TK_VOLUME;			}
cmd-timeout-short	{ DP; return TK_CMD_TIMEOUT_SHORT;	}
cmd-timeout-medium	{ DP; return TK_CMD_TIMEOUT_MEDIUM;	}
cmd-timeout-long	{ DP; return TK_CMD_TIMEOUT_LONG;	}
syncer			{ DP; return TK_SYNCER;			}
device			{ DP; return TK_DEVICE;			}
global			{ DP; return TK_GLOBAL;			}
common			{ DP; return TK_COMMON;			}
options			{ DP; return TK_OPTIONS;		}
outside			{ DP; return TK_OUTSIDE;		}
address			{ DP; return TK_ADDRESS;		}
alternate-link-address  { DP; return TK_ALT_ADDRESS;		}
startup			{ DP; return TK_STARTUP;		}
include			{ DP; return TK_INCLUDE;		}
handlers		{ DP; return TK_HANDLER;		}
minor-count		{ DP; return TK_MINOR_COUNT;		}
disable-ip-verification { DP; return TK_DISABLE_IP_VERIFICATION;}
udev-always-use-vnr	{ DP; return TK_UDEV_ALWAYS_USE_VNR;	}
dialog-refresh		{ DP; return TK_DIALOG_REFRESH;		}
resource		{ DP; return TK_RESOURCE;		}
meta-disk		{ DP; return TK_META_DISK;		}
flexible-meta-disk	{ DP; return TK_FLEX_META_DISK;		}
usage-count 		{ DP; return TK_USAGE_COUNT;		}
_this_host 		{ DP; return TK__THIS_HOST;		}
_remote_host 		{ DP; return TK__REMOTE_HOST;		}
sci			{ DP; CP; return TK_SCI;		}
ssocks			{ DP; CP; return TK_SSOCKS;		}
sdp			{ DP; CP; return TK_SDP;		}
ipv4			{ DP; CP; return TK_IPV4;		}
ipv6			{ DP; CP; return TK_IPV6;		}
size			{ DP; CP; RC(DISK_SIZE); return TK_DISK_OPTION;	}
on-io-error		{ DP; CP; return TK_DISK_OPTION;	}
fencing			{ DP; CP; return TK_DISK_OPTION;	}
max-bio-bvecs		{ DP; CP; return TK_DISK_OPTION;	}
disk-timeout		{ DP; CP; return TK_DISK_OPTION;	}
read-balancing		{ DP; CP; return TK_DISK_OPTION;	}
rs-discard-granularity	{ DP; CP; return TK_DISK_OPTION;	}
use-bmbv		{ DP; CP; return TK_DISK_FLAG;		}
disk-barrier		{ DP; CP; return TK_DISK_FLAG;		}
disk-flushes		{ DP; CP; return TK_DISK_FLAG;		}
disk-drain		{ DP; CP; return TK_DISK_FLAG;          }
md-flushes		{ DP; CP; return TK_DISK_FLAG;          }
no-disk-barrier		{ DP; CP; return TK_DISK_NO_FLAG;		}
no-disk-flushes		{ DP; CP; return TK_DISK_NO_FLAG;		}
no-disk-drain		{ DP; CP; return TK_DISK_NO_FLAG;		}
no-md-flushes		{ DP; CP; return TK_DISK_NO_FLAG;		}
timeout			{ DP; CP; RC(TIMEOUT); return TK_NET_OPTION;	}
protocol		{ DP; CP; RC(PROTOCOL); return TK_NET_OPTION;	}
ko-count		{ DP; CP; RC(KO_COUNT); return TK_NET_OPTION;	}
ping-int		{ DP; CP; RC(PING_INT); return TK_NET_OPTION;	}
max-buffers		{ DP; CP; RC(MAX_BUFFERS); return TK_NET_OPTION;}
sndbuf-size		{ DP; CP; RC(SNDBUF_SIZE); return TK_NET_OPTION | TK_PROXY_GROUP;}
rcvbuf-size		{ DP; CP; RC(RCVBUF_SIZE); return TK_NET_OPTION | TK_PROXY_GROUP;}
connect-int		{ DP; CP; RC(CONNECT_INT); return TK_NET_OPTION;}
cram-hmac-alg		{ DP; CP; return TK_NET_OPTION;		}
shared-secret		{ DP; CP; return TK_NET_OPTION;		}
max-epoch-size		{ DP; CP; RC(MAX_EPOCH_SIZE); return TK_NET_OPTION;}
after-sb-[012]pri	{ DP; CP; return TK_NET_OPTION;		}
rr-conflict 		{ DP; CP; return TK_NET_OPTION;		}
ping-timeout 		{ DP; CP; return TK_NET_OPTION | TK_PROXY_GROUP;}
unplug-watermark	{ DP; CP; return TK_NET_OPTION;         }
data-integrity-alg	{ DP; CP; return TK_NET_OPTION;         }
on-congestion		{ DP; CP; return TK_NET_OPTION;         }
socket-check-timeout	{ DP; CP; return TK_NET_OPTION;         }
congestion-fill		{ DP; CP; RC(CONG_FILL); return TK_NET_OPTION;   }
congestion-extents	{ DP; CP; RC(CONG_EXTENTS); return TK_NET_OPTION;}
allow-two-primaries	{ DP; CP; return TK_NET_FLAG;		}
always-asbp		{ DP; CP; return TK_NET_FLAG;		}
no-tcp-cork		{ DP; CP; return TK_NET_NO_FLAG;	}
tcp-cork		{ DP; CP; return TK_NET_FLAG;		}
discard-my-data		{ DP; CP; return TK_NET_DELEGATE;	}
rate			{ DP; CP; RC(RATE); return TK_SYNCER_OLD_OPT | TK_DISK_OPTION;	}
resync-rate		{ DP; CP; RC(RATE); return TK_DISK_OPTION;	}
after			{ DP; CP; return TK_SYNCER_OLD_OPT | TK_DISK_OPTION;	}
resync-after		{ DP; CP; return TK_DISK_OPTION;	}
verify-alg              { DP; CP; return TK_SYNCER_OLD_OPT | TK_NET_OPTION;      }
csums-alg               { DP; CP; return TK_SYNCER_OLD_OPT | TK_NET_OPTION;      }
csums-after-crash-only  { DP; CP; return TK_NET_FLAG; }
al-extents		{ DP; CP; RC(AL_EXTENTS); return TK_SYNCER_OLD_OPT | TK_DISK_OPTION;}
al-updates		{ DP; CP; return TK_DISK_FLAG; 	}
discard-zeroes-if-aligned { DP; CP; return TK_DISK_FLAG; 	}
cpu-mask		{ DP; CP; return TK_SYNCER_OLD_OPT | TK_RES_OPTION;	}
use-rle			{ DP; CP; return TK_SYNCER_OLD_OPT | TK_NET_FLAG;	}
delay-probe-volume	{ DP; CP; return TK_DEPRECATED_OPTION;  }
delay-probe-interval	{ DP; CP; return TK_DEPRECATED_OPTION;  }
c-plan-ahead		{ DP; CP; RC(C_PLAN_AHEAD); return TK_SYNCER_OLD_OPT | TK_DISK_OPTION;	}
c-delay-target	{ DP; CP; RC(C_DELAY_TARGET); return TK_SYNCER_OLD_OPT | TK_DISK_OPTION;	}
c-fill-target		{ DP; CP; RC(C_FILL_TARGET); return TK_SYNCER_OLD_OPT | TK_DISK_OPTION;	}
c-max-rate		{ DP; CP; RC(C_MAX_RATE); return TK_SYNCER_OLD_OPT | TK_DISK_OPTION;	}
c-min-rate		{ DP; CP; RC(C_MIN_RATE); return TK_SYNCER_OLD_OPT | TK_DISK_OPTION;	}
throttle-threshold	{ DP; CP; return TK_DEPRECATED_OPTION;  }
hold-off-threshold	{ DP; CP; return TK_DEPRECATED_OPTION;  }
on-no-data-accessible   { DP; CP; return TK_SYNCER_OLD_OPT | TK_RES_OPTION;	}
wfc-timeout		{ DP; CP; RC(WFC_TIMEOUT); return TK_STARTUP_OPTION;}
degr-wfc-timeout	{ DP; CP; RC(DEGR_WFC_TIMEOUT); return TK_STARTUP_OPTION;}
outdated-wfc-timeout	{ DP; CP; RC(OUTDATED_WFC_TIMEOUT); return TK_STARTUP_OPTION;}
stacked-timeouts	{ DP; return TK_STARTUP_DELEGATE;       }
become-primary-on	{ DP; return TK_STARTUP_DELEGATE;       }
wait-after-sb		{ DP; CP; return TK_STARTUP_FLAG;     }
pri-on-incon-degr	{ DP; CP; return TK_HANDLER_OPTION;	}
pri-lost-after-sb	{ DP; CP; return TK_HANDLER_OPTION;	}
pri-lost		{ DP; CP; return TK_HANDLER_OPTION;     }
initial-split-brain    { DP; CP; return TK_HANDLER_OPTION;     }
split-brain		{ DP; CP; return TK_HANDLER_OPTION;     }
outdate-peer		{ DP; CP; return TK_HANDLER_OPTION;	}
fence-peer		{ DP; CP; return TK_HANDLER_OPTION;	}
unfence-peer		{ DP; CP; return TK_HANDLER_OPTION;	}
local-io-error		{ DP; CP; return TK_HANDLER_OPTION;     }
before-resync-target	{ DP; CP; return TK_HANDLER_OPTION;	}
after-resync-target	{ DP; CP; return TK_HANDLER_OPTION;	}
before-resync-source	{ DP; CP; return TK_HANDLER_OPTION;	}
memlimit		{ DP; CP; return TK_PROXY_OPTION | TK_PROXY_GROUP; }
read-loops		{ DP; CP; return TK_PROXY_OPTION | TK_PROXY_GROUP; }
compression		{ DP; CP; return TK_PROXY_OPTION | TK_PROXY_GROUP; }
bwlimit			{ DP; CP; return TK_PROXY_OPTION | TK_PROXY_GROUP; }
plugin			{ DP; CP; return TK_PROXY_DELEGATE;     }
out-of-sync             { DP; CP; return TK_HANDLER_OPTION;     }
{IPV4ADDR}		{ DP; CP; return TK_IPADDR;		}
{IPV6ADDR}		{ DP; CP; return TK_IPADDR6;		}
{NUM}			{ DP; CP; return TK_INTEGER;		}
{DQSTRING}		{ unescape(yytext); DP; CP; return TK_STRING;	}
{STRING}		{ DP; CP; return TK_STRING;		}
{LONG_STRING}		{ return TK_ERR_STRING_TOO_LONG;	}
{LONG_DQSTRING}		{ return TK_ERR_DQSTRING_TOO_LONG;	}
{ERR_DQSTRING}		{ return TK_ERR_DQSTRING;		}
.			{ DP; return TK_ELSE;			}

%%


/* Compatibility cruft for flex version 2.5.4a */
#ifndef YY_FLEX_SUBMINOR_VERSION
/** Pushes the new state onto the stack. The new state becomes
 *  the current state. This function will allocate the stack
 *  if necessary.
 *  @param new_buffer The new state.
 *
 */
void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
{
	if (new_buffer == NULL)
		return;

	if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) {
		fprintf( stderr, "Includes nested too deeply" );
		exit( 1 );
	}

	include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER;

	yy_switch_to_buffer(new_buffer);
	BEGIN(INITIAL);
}

/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *
 */
void yypop_buffer_state (void)
{
	if (!YY_CURRENT_BUFFER)
		return;

	if ( --include_stack_ptr < 0 ) {
		fprintf( stderr, "error in flex compat code\n" );
		exit( 1 );
	}

	yy_delete_buffer(YY_CURRENT_BUFFER );
	yy_switch_to_buffer(include_stack[include_stack_ptr]);
}
#endif

void my_yypush_buffer_state(FILE *f)
{
	/* Since we do not have YY_BUF_SIZE outside of the flex generated file.*/
	yypush_buffer_state(yy_create_buffer(f, YY_BUF_SIZE));
}
