Update.
2000-08-20 Ulrich Drepper <drepper@redhat.com> * intl/loadmsgcat.c (_nl_unload_domain): Also free conv_tab element. Pretty printing. * intl/plural.y (new_exp): Take number of optional parameters in second parameter. Test for correct number of parameters and free correctly in case of failure. Adjust all callers. (yylex): Allow ';' as terminator character.
This commit is contained in:
parent
9b02e86850
commit
2f599545f5
@ -1,3 +1,12 @@
|
||||
2000-08-20 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* intl/loadmsgcat.c (_nl_unload_domain): Also free conv_tab element.
|
||||
Pretty printing.
|
||||
* intl/plural.y (new_exp): Take number of optional parameters in
|
||||
second parameter. Test for correct number of parameters and free
|
||||
correctly in case of failure. Adjust all callers.
|
||||
(yylex): Allow ';' as terminator character.
|
||||
|
||||
2000-08-19 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* locale/lc-time.c (free_mem): New function. Free alt_digits and
|
||||
|
@ -386,21 +386,17 @@ _nl_unload_domain (domain)
|
||||
if (domain->plural != &germanic_plural)
|
||||
__gettext_free_exp (domain->plural);
|
||||
|
||||
#ifdef _LIBC
|
||||
if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1)
|
||||
free (domain->conv_tab);
|
||||
|
||||
if (domain->conv != (__gconv_t) -1)
|
||||
__gconv_close (domain->conv);
|
||||
#else
|
||||
# if HAVE_ICONV
|
||||
if (domain->conv != (iconv_t) -1)
|
||||
iconv_close (domain->conv);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifdef _POSIX_MAPPED_FILES
|
||||
# ifdef _POSIX_MAPPED_FILES
|
||||
if (domain->use_mmap)
|
||||
munmap ((caddr_t) domain->data, domain->mmap_size);
|
||||
else
|
||||
#endif /* _POSIX_MAPPED_FILES */
|
||||
# endif /* _POSIX_MAPPED_FILES */
|
||||
free ((void *) domain->data);
|
||||
|
||||
free (domain);
|
||||
|
115
intl/plural.c
115
intl/plural.c
@ -39,18 +39,19 @@
|
||||
#include "gettext.h"
|
||||
#include "gettextP.h"
|
||||
|
||||
#define YYDEBUG 1
|
||||
#define YYLEX_PARAM &((struct parse_args *) arg)->cp
|
||||
#define YYPARSE_PARAM arg
|
||||
|
||||
#line 32 "plural.y"
|
||||
#line 33 "plural.y"
|
||||
typedef union {
|
||||
unsigned long int num;
|
||||
struct expression *exp;
|
||||
} YYSTYPE;
|
||||
#line 37 "plural.y"
|
||||
#line 38 "plural.y"
|
||||
|
||||
/* Prototypes for local functions. */
|
||||
static struct expression *new_exp (enum operator op, ...);
|
||||
static struct expression *new_exp (enum operator op, int n, ...);
|
||||
static int yylex (YYSTYPE *lval, const char **pexp);
|
||||
static void yyerror (const char *str);
|
||||
#include <stdio.h>
|
||||
@ -117,8 +118,8 @@ static const short yyrhs[] = { 19,
|
||||
|
||||
#if YYDEBUG != 0
|
||||
static const short yyrline[] = { 0,
|
||||
55, 61, 66, 71, 76, 81, 86, 91, 96, 101,
|
||||
106, 111, 116, 122
|
||||
56, 62, 67, 72, 77, 82, 87, 92, 97, 102,
|
||||
107, 112, 117, 123
|
||||
};
|
||||
#endif
|
||||
|
||||
@ -191,7 +192,7 @@ static const short yycheck[] = { 3,
|
||||
#define YYPURE 1
|
||||
|
||||
/* -*-C-*- Note some compilers choke on comments on `#line' lines. */
|
||||
#line 3 "/usr/share/bison.simple"
|
||||
#line 3 "/usr/lib/bison.simple"
|
||||
/* This file comes from bison-1.28. */
|
||||
|
||||
/* Skeleton output parser for bison,
|
||||
@ -405,7 +406,7 @@ __yy_memcpy (char *to, char *from, unsigned int count)
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#line 217 "/usr/share/bison.simple"
|
||||
#line 217 "/usr/lib/bison.simple"
|
||||
|
||||
/* The user can define YYPARSE_PARAM as the name of an argument to be passed
|
||||
into yyparse. The argument should have type void *.
|
||||
@ -734,105 +735,105 @@ yyreduce:
|
||||
switch (yyn) {
|
||||
|
||||
case 1:
|
||||
#line 56 "plural.y"
|
||||
#line 57 "plural.y"
|
||||
{
|
||||
((struct parse_args *) arg)->res = yyvsp[0].exp;
|
||||
;
|
||||
break;}
|
||||
case 2:
|
||||
#line 62 "plural.y"
|
||||
#line 63 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (qmop, 3, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 3:
|
||||
#line 67 "plural.y"
|
||||
#line 68 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (lor, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (lor, 2, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 4:
|
||||
#line 72 "plural.y"
|
||||
#line 73 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (land, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (land, 2, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 5:
|
||||
#line 77 "plural.y"
|
||||
#line 78 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (equal, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (equal, 2, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 6:
|
||||
#line 82 "plural.y"
|
||||
#line 83 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (not_equal, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (not_equal, 2, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 7:
|
||||
#line 87 "plural.y"
|
||||
#line 88 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (plus, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (plus, 2, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 8:
|
||||
#line 92 "plural.y"
|
||||
#line 93 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (minus, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (minus, 2, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 9:
|
||||
#line 97 "plural.y"
|
||||
#line 98 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (mult, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (mult, 2, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 10:
|
||||
#line 102 "plural.y"
|
||||
#line 103 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (divide, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (divide, 2, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 11:
|
||||
#line 107 "plural.y"
|
||||
#line 108 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (module, yyvsp[-2].exp, yyvsp[0].exp, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (module, 2, yyvsp[-2].exp, yyvsp[0].exp)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 12:
|
||||
#line 112 "plural.y"
|
||||
#line 113 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (var, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (var, 0)) == NULL)
|
||||
YYABORT
|
||||
;
|
||||
break;}
|
||||
case 13:
|
||||
#line 117 "plural.y"
|
||||
#line 118 "plural.y"
|
||||
{
|
||||
if ((yyval.exp = new_exp (num, NULL)) == NULL)
|
||||
if ((yyval.exp = new_exp (num, 0)) == NULL)
|
||||
YYABORT;
|
||||
yyval.exp->val.num = yyvsp[0].num
|
||||
;
|
||||
break;}
|
||||
case 14:
|
||||
#line 123 "plural.y"
|
||||
#line 124 "plural.y"
|
||||
{
|
||||
yyval.exp = yyvsp[-1].exp
|
||||
;
|
||||
break;}
|
||||
}
|
||||
/* the action file gets copied in in place of this dollarsign */
|
||||
#line 543 "/usr/share/bison.simple"
|
||||
#line 543 "/usr/lib/bison.simple"
|
||||
|
||||
yyvsp -= yylen;
|
||||
yyssp -= yylen;
|
||||
@ -1052,35 +1053,37 @@ yyerrhandle:
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#line 128 "plural.y"
|
||||
#line 129 "plural.y"
|
||||
|
||||
|
||||
static struct expression *
|
||||
new_exp (enum operator op, ...)
|
||||
new_exp (enum operator op, int n, ...)
|
||||
{
|
||||
struct expression *newp = (struct expression *) malloc (sizeof (*newp));
|
||||
struct expression *newp = (struct expression *) calloc (1, sizeof (*newp));
|
||||
va_list va;
|
||||
struct expression *next;
|
||||
|
||||
va_start (va, op);
|
||||
va_start (va, n);
|
||||
|
||||
if (newp == NULL)
|
||||
while ((next = va_arg (va, struct expression *)) != NULL)
|
||||
__gettext_free_exp (next);
|
||||
while (n-- > 0)
|
||||
__gettext_free_exp (va_arg (va, struct expression *));
|
||||
else
|
||||
{
|
||||
newp->operation = op;
|
||||
next = va_arg (va, struct expression *);
|
||||
if (next != NULL)
|
||||
if (n > 0)
|
||||
{
|
||||
newp->val.args3.bexp = next;
|
||||
next = va_arg (va, struct expression *);
|
||||
if (next != NULL)
|
||||
newp->val.args3.bexp = va_arg (va, struct expression *);
|
||||
newp->val.args3.tbranch = va_arg (va, struct expression *);
|
||||
|
||||
if (n > 2)
|
||||
newp->val.args3.fbranch = va_arg (va, struct expression *);
|
||||
|
||||
if (newp->val.args3.bexp == NULL
|
||||
|| newp->val.args3.tbranch == NULL
|
||||
|| (n > 2 && newp->val.args3.fbranch == NULL))
|
||||
{
|
||||
newp->val.args3.tbranch = next;
|
||||
next = va_arg (va, struct expression *);
|
||||
if (next != NULL)
|
||||
newp->val.args3.fbranch = next;
|
||||
__gettext_free_exp (newp);
|
||||
newp = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1131,6 +1134,8 @@ yylex (YYSTYPE *lval, const char **pexp)
|
||||
const char *exp = *pexp;
|
||||
int result;
|
||||
|
||||
yydebug = 1;
|
||||
|
||||
while (1)
|
||||
{
|
||||
if (exp[0] == '\\' && exp[1] == '\n')
|
||||
@ -1138,7 +1143,14 @@ yylex (YYSTYPE *lval, const char **pexp)
|
||||
exp += 2;
|
||||
continue;
|
||||
}
|
||||
if (exp[0] != '\0' && exp[0] != ' ' && exp[0] != '\t')
|
||||
|
||||
if (exp[0] == '\0')
|
||||
{
|
||||
*pexp = exp;
|
||||
return YYEOF;
|
||||
}
|
||||
|
||||
if (exp[0] != ' ' && exp[0] != '\t')
|
||||
break;
|
||||
|
||||
++exp;
|
||||
@ -1190,6 +1202,7 @@ yylex (YYSTYPE *lval, const char **pexp)
|
||||
/* Nothing, just return the character. */
|
||||
break;
|
||||
|
||||
case ';':
|
||||
case '\n':
|
||||
case '\0':
|
||||
/* Be safe and let the user call this function again. */
|
||||
|
@ -36,7 +36,7 @@
|
||||
|
||||
%{
|
||||
/* Prototypes for local functions. */
|
||||
static struct expression *new_exp (enum operator op, ...);
|
||||
static struct expression *new_exp (enum operator op, int n, ...);
|
||||
static int yylex (YYSTYPE *lval, const char **pexp);
|
||||
static void yyerror (const char *str);
|
||||
%}
|
||||
@ -60,62 +60,62 @@ start: exp
|
||||
|
||||
exp: exp '?' exp ':' exp
|
||||
{
|
||||
if (($$ = new_exp (qmop, $1, $3, $5, NULL)) == NULL)
|
||||
if (($$ = new_exp (qmop, 3, $1, $3, $5)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| exp '|' exp
|
||||
{
|
||||
if (($$ = new_exp (lor, $1, $3, NULL)) == NULL)
|
||||
if (($$ = new_exp (lor, 2, $1, $3)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| exp '&' exp
|
||||
{
|
||||
if (($$ = new_exp (land, $1, $3, NULL)) == NULL)
|
||||
if (($$ = new_exp (land, 2, $1, $3)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| exp '=' exp
|
||||
{
|
||||
if (($$ = new_exp (equal, $1, $3, NULL)) == NULL)
|
||||
if (($$ = new_exp (equal, 2, $1, $3)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| exp '!' exp
|
||||
{
|
||||
if (($$ = new_exp (not_equal, $1, $3, NULL)) == NULL)
|
||||
if (($$ = new_exp (not_equal, 2, $1, $3)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| exp '+' exp
|
||||
{
|
||||
if (($$ = new_exp (plus, $1, $3, NULL)) == NULL)
|
||||
if (($$ = new_exp (plus, 2, $1, $3)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| exp '-' exp
|
||||
{
|
||||
if (($$ = new_exp (minus, $1, $3, NULL)) == NULL)
|
||||
if (($$ = new_exp (minus, 2, $1, $3)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| exp '*' exp
|
||||
{
|
||||
if (($$ = new_exp (mult, $1, $3, NULL)) == NULL)
|
||||
if (($$ = new_exp (mult, 2, $1, $3)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| exp '/' exp
|
||||
{
|
||||
if (($$ = new_exp (divide, $1, $3, NULL)) == NULL)
|
||||
if (($$ = new_exp (divide, 2, $1, $3)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| exp '%' exp
|
||||
{
|
||||
if (($$ = new_exp (module, $1, $3, NULL)) == NULL)
|
||||
if (($$ = new_exp (module, 2, $1, $3)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| 'n'
|
||||
{
|
||||
if (($$ = new_exp (var, NULL)) == NULL)
|
||||
if (($$ = new_exp (var, 0)) == NULL)
|
||||
YYABORT
|
||||
}
|
||||
| NUMBER
|
||||
{
|
||||
if (($$ = new_exp (num, NULL)) == NULL)
|
||||
if (($$ = new_exp (num, 0)) == NULL)
|
||||
YYABORT;
|
||||
$$->val.num = $1
|
||||
}
|
||||
@ -128,31 +128,33 @@ exp: exp '?' exp ':' exp
|
||||
%%
|
||||
|
||||
static struct expression *
|
||||
new_exp (enum operator op, ...)
|
||||
new_exp (enum operator op, int n, ...)
|
||||
{
|
||||
struct expression *newp = (struct expression *) malloc (sizeof (*newp));
|
||||
struct expression *newp = (struct expression *) calloc (1, sizeof (*newp));
|
||||
va_list va;
|
||||
struct expression *next;
|
||||
|
||||
va_start (va, op);
|
||||
va_start (va, n);
|
||||
|
||||
if (newp == NULL)
|
||||
while ((next = va_arg (va, struct expression *)) != NULL)
|
||||
__gettext_free_exp (next);
|
||||
while (n-- > 0)
|
||||
__gettext_free_exp (va_arg (va, struct expression *));
|
||||
else
|
||||
{
|
||||
newp->operation = op;
|
||||
next = va_arg (va, struct expression *);
|
||||
if (next != NULL)
|
||||
if (n > 0)
|
||||
{
|
||||
newp->val.args3.bexp = next;
|
||||
next = va_arg (va, struct expression *);
|
||||
if (next != NULL)
|
||||
newp->val.args3.bexp = va_arg (va, struct expression *);
|
||||
newp->val.args3.tbranch = va_arg (va, struct expression *);
|
||||
|
||||
if (n > 2)
|
||||
newp->val.args3.fbranch = va_arg (va, struct expression *);
|
||||
|
||||
if (newp->val.args3.bexp == NULL
|
||||
|| newp->val.args3.tbranch == NULL
|
||||
|| (n > 2 && newp->val.args3.fbranch == NULL))
|
||||
{
|
||||
newp->val.args3.tbranch = next;
|
||||
next = va_arg (va, struct expression *);
|
||||
if (next != NULL)
|
||||
newp->val.args3.fbranch = next;
|
||||
__gettext_free_exp (newp);
|
||||
newp = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -210,7 +212,14 @@ yylex (YYSTYPE *lval, const char **pexp)
|
||||
exp += 2;
|
||||
continue;
|
||||
}
|
||||
if (exp[0] != '\0' && exp[0] != ' ' && exp[0] != '\t')
|
||||
|
||||
if (exp[0] == '\0')
|
||||
{
|
||||
*pexp = exp;
|
||||
return YYEOF;
|
||||
}
|
||||
|
||||
if (exp[0] != ' ' && exp[0] != '\t')
|
||||
break;
|
||||
|
||||
++exp;
|
||||
@ -262,6 +271,7 @@ yylex (YYSTYPE *lval, const char **pexp)
|
||||
/* Nothing, just return the character. */
|
||||
break;
|
||||
|
||||
case ';':
|
||||
case '\n':
|
||||
case '\0':
|
||||
/* Be safe and let the user call this function again. */
|
||||
|
Loading…
Reference in New Issue
Block a user