📄 gram.c
字号:
`yyss': related to states,
`yyvs': related to semantic values,
`yyls': related to locations.
Refer to the stacks thru separate pointers, to allow yyoverflow
to reallocate them elsewhere. */
/* The state stack. */
yytype_int16 yyssa[YYINITDEPTH];
yytype_int16 *yyss = yyssa;
yytype_int16 *yyssp;
/* The semantic value stack. */
YYSTYPE yyvsa[YYINITDEPTH];
YYSTYPE *yyvs = yyvsa;
YYSTYPE *yyvsp;
#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
YYSIZE_T yystacksize = YYINITDEPTH;
/* The variables used to return semantic value and location from the
action routines. */
YYSTYPE yyval;
/* The number of symbols on the RHS of the reduced rule.
Keep to zero when no symbol should be popped. */
int yylen = 0;
YYDPRINTF ((stderr, "Starting parse\n"));
yystate = 0;
yyerrstatus = 0;
yynerrs = 0;
yychar = YYEMPTY; /* Cause a token to be read. */
/* Initialize stack pointers.
Waste one element of value and location stack
so that they stay on the same level as the state stack.
The wasted elements are never initialized. */
yyssp = yyss;
yyvsp = yyvs;
goto yysetstate;
/*------------------------------------------------------------.
| yynewstate -- Push a new state, which is found in yystate. |
`------------------------------------------------------------*/
yynewstate:
/* In all cases, when you get here, the value and location stacks
have just been pushed. So pushing a state here evens the stacks. */
yyssp++;
yysetstate:
*yyssp = yystate;
if (yyss + yystacksize - 1 <= yyssp)
{
/* Get the current used size of the three stacks, in elements. */
YYSIZE_T yysize = yyssp - yyss + 1;
#ifdef yyoverflow
{
/* Give user a chance to reallocate the stack. Use copies of
these so that the &'s don't force the real ones into
memory. */
YYSTYPE *yyvs1 = yyvs;
yytype_int16 *yyss1 = yyss;
/* Each stack pointer address is followed by the size of the
data in use in that stack, in bytes. This used to be a
conditional around just the two extra args, but that might
be undefined if yyoverflow is a macro. */
yyoverflow (YY_("memory exhausted"),
&yyss1, yysize * sizeof (*yyssp),
&yyvs1, yysize * sizeof (*yyvsp),
&yystacksize);
yyss = yyss1;
yyvs = yyvs1;
}
#else /* no yyoverflow */
# ifndef YYSTACK_RELOCATE
goto yyexhaustedlab;
# else
/* Extend the stack our own way. */
if (YYMAXDEPTH <= yystacksize)
goto yyexhaustedlab;
yystacksize *= 2;
if (YYMAXDEPTH < yystacksize)
yystacksize = YYMAXDEPTH;
{
yytype_int16 *yyss1 = yyss;
union yyalloc *yyptr =
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
if (! yyptr)
goto yyexhaustedlab;
YYSTACK_RELOCATE (yyss);
YYSTACK_RELOCATE (yyvs);
# undef YYSTACK_RELOCATE
if (yyss1 != yyssa)
YYSTACK_FREE (yyss1);
}
# endif
#endif /* no yyoverflow */
yyssp = yyss + yysize - 1;
yyvsp = yyvs + yysize - 1;
YYDPRINTF ((stderr, "Stack size increased to %lu\n",
(unsigned long int) yystacksize));
if (yyss + yystacksize - 1 <= yyssp)
YYABORT;
}
YYDPRINTF ((stderr, "Entering state %d\n", yystate));
goto yybackup;
/*-----------.
| yybackup. |
`-----------*/
yybackup:
/* Do appropriate processing given the current state. Read a
look-ahead token if we need one and don't already have one. */
/* First try to decide what to do without reference to look-ahead token. */
yyn = yypact[yystate];
if (yyn == YYPACT_NINF)
goto yydefault;
/* Not known => get a look-ahead token if don't already have one. */
/* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
if (yychar == YYEMPTY)
{
YYDPRINTF ((stderr, "Reading a token: "));
yychar = YYLEX;
}
if (yychar <= YYEOF)
{
yychar = yytoken = YYEOF;
YYDPRINTF ((stderr, "Now at end of input.\n"));
}
else
{
yytoken = YYTRANSLATE (yychar);
YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
}
/* If the proper action on seeing token YYTOKEN is to reduce or to
detect an error, take that action. */
yyn += yytoken;
if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
goto yydefault;
yyn = yytable[yyn];
if (yyn <= 0)
{
if (yyn == 0 || yyn == YYTABLE_NINF)
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
}
if (yyn == YYFINAL)
YYACCEPT;
/* Count tokens shifted since error; after three, turn off error
status. */
if (yyerrstatus)
yyerrstatus--;
/* Shift the look-ahead token. */
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
/* Discard the shifted token unless it is eof. */
if (yychar != YYEOF)
yychar = YYEMPTY;
yystate = yyn;
*++yyvsp = yylval;
goto yynewstate;
/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state. |
`-----------------------------------------------------------*/
yydefault:
yyn = yydefact[yystate];
if (yyn == 0)
goto yyerrlab;
goto yyreduce;
/*-----------------------------.
| yyreduce -- Do a reduction. |
`-----------------------------*/
yyreduce:
/* yyn is the number of a rule to reduce with. */
yylen = yyr2[yyn];
/* If YYLEN is nonzero, implement the default value of the action:
`$$ = $1'.
Otherwise, the following line sets YYVAL to garbage.
This behavior is undocumented and Bison
users should not rely upon it. Assigning to YYVAL
unconditionally makes the parser a bit smaller, and it avoids a
GCC warning that YYVAL may be used uninitialized. */
yyval = yyvsp[1-yylen];
YY_REDUCE_PRINT (yyn);
switch (yyn)
{
case 4:
#line 129 "gram.y"
{
struct Interface *iface2;
iface2 = IfaceList;
while (iface2)
{
if (!strcmp(iface2->Name, iface->Name))
{
flog(LOG_ERR, "duplicate interface "
"definition for %s", iface->Name);
ABORT;
}
iface2 = iface2->next;
}
if (check_device(sock, iface) < 0) {
if (iface->IgnoreIfMissing) {
dlog(LOG_DEBUG, 4, "interface %s did not exist, ignoring the interface", iface->Name);
goto skip_interface;
}
else {
flog(LOG_ERR, "interface %s does not exist", iface->Name);
ABORT;
}
}
if (setup_deviceinfo(sock, iface) < 0)
ABORT;
if (check_iface(iface) < 0)
ABORT;
if (setup_linklocal_addr(sock, iface) < 0)
ABORT;
if (setup_allrouters_membership(sock, iface) < 0)
ABORT;
iface->next = IfaceList;
IfaceList = iface;
dlog(LOG_DEBUG, 4, "interface definition for %s is ok", iface->Name);
skip_interface:
iface = NULL;
}
break;
case 5:
#line 173 "gram.y"
{
iface = malloc(sizeof(struct Interface));
if (iface == NULL) {
flog(LOG_CRIT, "malloc failed: %s", strerror(errno));
ABORT;
}
iface_init_defaults(iface);
strncpy(iface->Name, (yyvsp[(2) - (2)].str), IFNAMSIZ-1);
iface->Name[IFNAMSIZ-1] = '\0';
}
break;
case 6:
#line 188 "gram.y"
{
/* check vality */
(yyval.str) = (yyvsp[(1) - (1)].str);
}
break;
case 7:
#line 195 "gram.y"
{
iface->AdvPrefixList = (yyvsp[(2) - (4)].pinfo);
iface->AdvRouteList = (yyvsp[(3) - (4)].rinfo);
iface->AdvRDNSSList = (yyvsp[(4) - (4)].rdnssinfo);
}
break;
case 10:
#line 207 "gram.y"
{
(yyval.pinfo) = NULL;
}
break;
case 12:
#line 214 "gram.y"
{
(yyval.rinfo) = NULL;
}
break;
case 14:
#line 221 "gram.y"
{
(yyval.rdnssinfo) = NULL;
}
break;
case 18:
#line 232 "gram.y"
{
iface->MinRtrAdvInterval = (yyvsp[(2) - (3)].num);
}
break;
case 19:
#line 236 "gram.y"
{
iface->MaxRtrAdvInterval = (yyvsp[(2) - (3)].num);
}
break;
case 20:
#line 240 "gram.y"
{
iface->MinDelayBetweenRAs = (yyvsp[(2) - (3)].num);
}
break;
case 21:
#line 244 "gram.y"
{
iface->MinRtrAdvInterval = (yyvsp[(2) - (3)].dec);
}
break;
case 22:
#line 248 "gram.y"
{
iface->MaxRtrAdvInterval = (yyvsp[(2) - (3)].dec);
}
break;
case 23:
#line 252 "gram.y"
{
iface->MinDelayBetweenRAs = (yyvsp[(2) - (3)].dec);
}
break;
case 24:
#line 256 "gram.y"
{
iface->IgnoreIfMissing = (yyvsp[(2) - (3)].bool);
}
break;
case 25:
#line 260 "gram.y"
{
iface->AdvSendAdvert = (yyvsp[(2) - (3)].bool);
}
break;
case 26:
#line 264 "gram.y"
{
iface->AdvManagedFlag = (yyvsp[(2) - (3)].bool);
}
break;
case 27:
#line 268 "gram.y"
{
iface->AdvOtherConfigFlag = (yyvsp[(2) - (3)].bool);
}
break;
case 28:
#line 272 "gram.y"
{
iface->AdvLinkMTU = (yyvsp[(2) - (3)].num);
}
break;
case 29:
#line 276 "gram.y"
{
iface->AdvReachableTime = (yyvsp[(2) - (3)].num);
}
break;
case 30:
#line 280 "gram.y"
{
iface->AdvRetransTimer = (yyvsp[(2) - (3)].num);
}
break;
case 31:
#line 284 "gram.y"
{
iface->AdvDefaultLifetime = (yyvsp[(2) - (3)].num);
}
break;
case 32:
#line 288 "gram.y"
{
iface->AdvDefaultPreference = (yyvsp[(2) - (3)].snum);
}
break;
case 33:
#line 292 "gram.y"
{
iface->AdvCurHopLimit = (yyvsp[(2) - (3)].num);
}
break;
case 34:
#line 296 "gram.y"
{
iface->AdvSourceLLAddress = (yyvsp[(2) - (3)].bool);
}
break;
case 35:
#line 300 "gram.y"
{
iface->AdvIntervalOpt = (yyvsp[(2) - (3)].bool);
}
break;
case 36:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -