----- Original Message -----
| + do{
| + printf( _("
Are you sure you want to proceed? [y/n]"));
| + ret = getline(&line, &len, stdin);
| + res = rpmatch(line);
I'd like to see the free(line); moved right here after rpmatch.
Otherwise multiple iterations through the loop will leak memory.
| +
| + if (res > 0){
With my suggestion above, this can be removed:
| + free(line);
Other than that, it looks good.
Regards,
Bob Peterson
Red Hat File Systems
09-06-2011, 07:10 PM
Steven Whitehouse
mkfs i18n:
Hi,
On Tue, 2011-09-06 at 14:41 -0300, Carlos Maiolino wrote:
> Use rpmatch() function to get answer to
> yes-or-no questions during mkfs confirmation
>
> Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
> ---
> gfs2/mkfs/main_mkfs.c | 30 ++++++++++++++++++++++--------
> 1 files changed, 22 insertions(+), 8 deletions(-)
>
> diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
> index 4751f19..d68cf98 100644
> --- a/gfs2/mkfs/main_mkfs.c
> +++ b/gfs2/mkfs/main_mkfs.c
> @@ -456,8 +456,11 @@ fail:
>
> static void are_you_sure(struct gfs2_sbd *sdp)
> {
> - char input[32];
> + char *line = NULL;
> + size_t len = 0;
> int fd;
> + int ret = -1;
> + int res = 0;
>
> fd = open(sdp->device_name, O_RDONLY|O_CLOEXEC);
> if (fd < 0)
> @@ -465,14 +468,25 @@ static void are_you_sure(struct gfs2_sbd *sdp)
> printf( _("This will destroy any data on %s.
"), sdp->device_name);
> check_dev_content(sdp->device_name);
> close(fd);
> - printf( _("
Are you sure you want to proceed? [y/n] "));
> - if(!fgets(input, 32, stdin))
> - die( _("unable to read from stdin
"));
> +
> + do{
> + printf( _("
Are you sure you want to proceed? [y/n]"));
This means that the translator needs to know that rpmatch is being used
and to also know how to translate this accordingly. Why not use
nl_langinfo() to put the response strings into this message?
Hi,
On Tue, Sep 06, 2011 at 08:10:06PM +0100, Steven Whitehouse wrote:
> Hi,
>
> On Tue, 2011-09-06 at 14:41 -0300, Carlos Maiolino wrote:
> > Use rpmatch() function to get answer to
> > yes-or-no questions during mkfs confirmation
> >
> > Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
> > ---
> > gfs2/mkfs/main_mkfs.c | 30 ++++++++++++++++++++++--------
> > 1 files changed, 22 insertions(+), 8 deletions(-)
> >
> > diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
> > index 4751f19..d68cf98 100644
> > --- a/gfs2/mkfs/main_mkfs.c
> > +++ b/gfs2/mkfs/main_mkfs.c
> > @@ -456,8 +456,11 @@ fail:
> >
> > static void are_you_sure(struct gfs2_sbd *sdp)
> > {
> > - char input[32];
> > + char *line = NULL;
> > + size_t len = 0;
> > int fd;
> > + int ret = -1;
> > + int res = 0;
> >
> > fd = open(sdp->device_name, O_RDONLY|O_CLOEXEC);
> > if (fd < 0)
> > @@ -465,14 +468,25 @@ static void are_you_sure(struct gfs2_sbd *sdp)
> > printf( _("This will destroy any data on %s.
"), sdp->device_name);
> > check_dev_content(sdp->device_name);
> > close(fd);
> > - printf( _("
Are you sure you want to proceed? [y/n] "));
> > - if(!fgets(input, 32, stdin))
> > - die( _("unable to read from stdin
"));
> > +
> > + do{
> > + printf( _("
Are you sure you want to proceed? [y/n]"));
> This means that the translator needs to know that rpmatch is being used
> and to also know how to translate this accordingly. Why not use
> nl_langinfo() to put the response strings into this message?
>
I was looking how nl_langinfo() works, and all it does to help with yes/no
questions is to return a regex expression (like [^[SsyY].*) to be used to match
the user's answer, it does not return a string or char value like yes/no (en_US) or
sim/nao(pt_BR) we can use to replace the y/n in the question string.
The rpmatch() function takes advantage of nl_langinfo() internaly to match the
customer's answer according to which l10n the system is set.
This way, even using nl_langinfo(), the translator person will still need to translate
the y/n to s/n, since is not possible to use nl_langinfo to replace these values.
What we could do, is to create an auxiliar function to check the return of nl_langinfo(),
and, according with this value, write an specific string (s/n, y/n, etc). But, imho, this
could lead to an error prone condition during string creation.
What u think?
Cheers,
--
--Carlos
09-21-2011, 12:33 AM
Carlos Maiolino
mkfs i18n:
Hi Steve, I was looking through some codes from GNU project, and here are some examples I found:
from fdisk tool (this is the latest version, but I think fdisk is not often updated):
/* Prompt the user to answer a yes or no question. */
int
command_line_prompt_boolean_question (const char* prompt) {
char *user_ans;
StrList *possibilities = str_list_create (_("yes"), _("no"), NULL);
user_ans = fdisk_command_line_get_word (_(prompt), _("no"), possibilities, 0);
if (strcmp (user_ans, _("yes")) == 0)
return 1;
/* user answered no */
return 0;
}
I found another idea in the gnu parted.
The GNU parted adds the rpmatch function as a library
into the parted source code, and adds a regex expression
to be translated into the .pot file:
Looking through both of the above codes, looks like there
is no specific rule about how to translate "y/n" strings.
In both cases these are translated via .pot file.
One suggestion, would be to split the string
"Are you sure? [y/n]"
in three different strings like:
"Are you sure?"
"yes"
"no"
This way would be more 'understandable' for translators
than the current one.
Or, we can add to the .pot file a comment explaining
what to do with this portion of translation.
> > > Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
> > > ---
> > > gfs2/mkfs/main_mkfs.c | 30 ++++++++++++++++++++++--------
> > > 1 files changed, 22 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
> > > index 4751f19..d68cf98 100644
> > > --- a/gfs2/mkfs/main_mkfs.c
> > > +++ b/gfs2/mkfs/main_mkfs.c
> > > @@ -456,8 +456,11 @@ fail:
> > >
> > > static void are_you_sure(struct gfs2_sbd *sdp)
> > > {
> > > - char input[32];
> > > + char *line = NULL;
> > > + size_t len = 0;
> > > int fd;
> > > + int ret = -1;
> > > + int res = 0;
> > >
> > > fd = open(sdp->device_name, O_RDONLY|O_CLOEXEC);
> > > if (fd < 0)
> > > @@ -465,14 +468,25 @@ static void are_you_sure(struct gfs2_sbd *sdp)
> > > printf( _("This will destroy any data on %s.
"), sdp->device_name);
> > > check_dev_content(sdp->device_name);
> > > close(fd);
> > > - printf( _("
Are you sure you want to proceed? [y/n] "));
> > > - if(!fgets(input, 32, stdin))
> > > - die( _("unable to read from stdin
"));
> > > +
> > > + do{
> > > + printf( _("
Are you sure you want to proceed? [y/n]"));
> > This means that the translator needs to know that rpmatch is being used
> > and to also know how to translate this accordingly. Why not use
> > nl_langinfo() to put the response strings into this message?
> >
> I was looking how nl_langinfo() works, and all it does to help with yes/no
> questions is to return a regex expression (like [^[SsyY].*) to be used to match
> the user's answer, it does not return a string or char value like yes/no (en_US) or
> sim/nao(pt_BR) we can use to replace the y/n in the question string.
>
> The rpmatch() function takes advantage of nl_langinfo() internaly to match the
> customer's answer according to which l10n the system is set.
>
> This way, even using nl_langinfo(), the translator person will still need to translate
> the y/n to s/n, since is not possible to use nl_langinfo to replace these values.
>
> What we could do, is to create an auxiliar function to check the return of nl_langinfo(),
> and, according with this value, write an specific string (s/n, y/n, etc). But, imho, this
> could lead to an error prone condition during string creation.
>
> What u think?
>
> Cheers,
> --
> --Carlos
>
--
--Carlos
09-22-2011, 09:47 AM
Steven Whitehouse
mkfs i18n:
Hi,
On Tue, 2011-09-20 at 21:33 -0300, Carlos Maiolino wrote:
> Hi Steve, I was looking through some codes from GNU project, and here are some examples I found:
>
>
> from fdisk tool (this is the latest version, but I think fdisk is not often updated):
>
> /* Prompt the user to answer a yes or no question. */
> int
> command_line_prompt_boolean_question (const char* prompt) {
> char *user_ans;
> StrList *possibilities = str_list_create (_("yes"), _("no"), NULL);
> user_ans = fdisk_command_line_get_word (_(prompt), _("no"), possibilities, 0);
>
> if (strcmp (user_ans, _("yes")) == 0)
> return 1;
>
> /* user answered no */
> return 0;
> }
>
>
> I found another idea in the gnu parted.
>
> The GNU parted adds the rpmatch function as a library
> into the parted source code, and adds a regex expression
> to be translated into the .pot file:
>
> <snip>
> #: lib/rpmatch.c:147
> msgid "^[yY]"
> msgstr ""
>
> #: lib/rpmatch.c:160
> msgid "^[nN]"
> msgstr ""
>
> </snip>
>
> Looking through both of the above codes, looks like there
> is no specific rule about how to translate "y/n" strings.
> In both cases these are translated via .pot file.
>
> One suggestion, would be to split the string
>
> "Are you sure? [y/n]"
>
> in three different strings like:
>
> "Are you sure?"
> "yes"
> "no"
>
> This way would be more 'understandable' for translators
> than the current one.
> Or, we can add to the .pot file a comment explaining
> what to do with this portion of translation.
>
>
I prefer the longer string to splitting it, if we cannot get the
translation automatically from glibc, which does appear to be the case.
Also, I think adding a comment to the .pot to explain how to translate
the question is a good idea. We should always be doing that where
anything tricky is encountered,
Steve.
>
> > > > Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
> > > > ---
> > > > gfs2/mkfs/main_mkfs.c | 30 ++++++++++++++++++++++--------
> > > > 1 files changed, 22 insertions(+), 8 deletions(-)
> > > >
> > > > diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
> > > > index 4751f19..d68cf98 100644
> > > > --- a/gfs2/mkfs/main_mkfs.c
> > > > +++ b/gfs2/mkfs/main_mkfs.c
> > > > @@ -456,8 +456,11 @@ fail:
> > > >
> > > > static void are_you_sure(struct gfs2_sbd *sdp)
> > > > {
> > > > - char input[32];
> > > > + char *line = NULL;
> > > > + size_t len = 0;
> > > > int fd;
> > > > + int ret = -1;
> > > > + int res = 0;
> > > >
> > > > fd = open(sdp->device_name, O_RDONLY|O_CLOEXEC);
> > > > if (fd < 0)
> > > > @@ -465,14 +468,25 @@ static void are_you_sure(struct gfs2_sbd *sdp)
> > > > printf( _("This will destroy any data on %s.
"), sdp->device_name);
> > > > check_dev_content(sdp->device_name);
> > > > close(fd);
> > > > - printf( _("
Are you sure you want to proceed? [y/n] "));
> > > > - if(!fgets(input, 32, stdin))
> > > > - die( _("unable to read from stdin
"));
> > > > +
> > > > + do{
> > > > + printf( _("
Are you sure you want to proceed? [y/n]"));
> > > This means that the translator needs to know that rpmatch is being used
> > > and to also know how to translate this accordingly. Why not use
> > > nl_langinfo() to put the response strings into this message?
> > >
> > I was looking how nl_langinfo() works, and all it does to help with yes/no
> > questions is to return a regex expression (like [^[SsyY].*) to be used to match
> > the user's answer, it does not return a string or char value like yes/no (en_US) or
> > sim/nao(pt_BR) we can use to replace the y/n in the question string.
> >
> > The rpmatch() function takes advantage of nl_langinfo() internaly to match the
> > customer's answer according to which l10n the system is set.
> >
> > This way, even using nl_langinfo(), the translator person will still need to translate
> > the y/n to s/n, since is not possible to use nl_langinfo to replace these values.
> >
> > What we could do, is to create an auxiliar function to check the return of nl_langinfo(),
> > and, according with this value, write an specific string (s/n, y/n, etc). But, imho, this
> > could lead to an error prone condition during string creation.
> >
> > What u think?
> >
> > Cheers,
> > --
> > --Carlos
> >
>
09-22-2011, 09:50 AM
Steven Whitehouse
mkfs i18n:
Hi,
On Tue, 2011-09-20 at 14:27 -0300, Carlos Maiolino wrote:
> Hi,
> On Tue, Sep 06, 2011 at 08:10:06PM +0100, Steven Whitehouse wrote:
> > Hi,
> >
> > On Tue, 2011-09-06 at 14:41 -0300, Carlos Maiolino wrote:
> > > Use rpmatch() function to get answer to
> > > yes-or-no questions during mkfs confirmation
> > >
> > > Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
> > > ---
> > > gfs2/mkfs/main_mkfs.c | 30 ++++++++++++++++++++++--------
> > > 1 files changed, 22 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/gfs2/mkfs/main_mkfs.c b/gfs2/mkfs/main_mkfs.c
> > > index 4751f19..d68cf98 100644
> > > --- a/gfs2/mkfs/main_mkfs.c
> > > +++ b/gfs2/mkfs/main_mkfs.c
> > > @@ -456,8 +456,11 @@ fail:
> > >
> > > static void are_you_sure(struct gfs2_sbd *sdp)
> > > {
> > > - char input[32];
> > > + char *line = NULL;
> > > + size_t len = 0;
> > > int fd;
> > > + int ret = -1;
> > > + int res = 0;
> > >
> > > fd = open(sdp->device_name, O_RDONLY|O_CLOEXEC);
> > > if (fd < 0)
> > > @@ -465,14 +468,25 @@ static void are_you_sure(struct gfs2_sbd *sdp)
> > > printf( _("This will destroy any data on %s.
"), sdp->device_name);
> > > check_dev_content(sdp->device_name);
> > > close(fd);
> > > - printf( _("
Are you sure you want to proceed? [y/n] "));
> > > - if(!fgets(input, 32, stdin))
> > > - die( _("unable to read from stdin
"));
> > > +
> > > + do{
> > > + printf( _("
Are you sure you want to proceed? [y/n]"));
> > This means that the translator needs to know that rpmatch is being used
> > and to also know how to translate this accordingly. Why not use
> > nl_langinfo() to put the response strings into this message?
> >
> I was looking how nl_langinfo() works, and all it does to help with yes/no
> questions is to return a regex expression (like [^[SsyY].*) to be used to match
> the user's answer, it does not return a string or char value like yes/no (en_US) or
> sim/nao(pt_BR) we can use to replace the y/n in the question string.
>
> The rpmatch() function takes advantage of nl_langinfo() internaly to match the
> customer's answer according to which l10n the system is set.
>
> This way, even using nl_langinfo(), the translator person will still need to translate
> the y/n to s/n, since is not possible to use nl_langinfo to replace these values.
>
> What we could do, is to create an auxiliar function to check the return of nl_langinfo(),
> and, according with this value, write an specific string (s/n, y/n, etc). But, imho, this
> could lead to an error prone condition during string creation.
>
> What u think?
>
> Cheers,
It is is not possible to use glibc for this, then lets not worry about
it too much. I just wanted to be certain that there was not some
standard way to deal with these kinds of translations before we create
our own solution to the problem,