* [Cluster-devel] [PATCH 3/3] mkfs i18n: @ 2011-09-06 17:41 Carlos Maiolino 2011-09-06 18:29 ` Bob Peterson 2011-09-06 19:10 ` Steven Whitehouse 0 siblings, 2 replies; 7+ messages in thread From: Carlos Maiolino @ 2011-09-06 17:41 UTC (permalink / raw) To: cluster-devel.redhat.com 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.\n"), sdp->device_name); check_dev_content(sdp->device_name); close(fd); - printf( _("\nAre you sure you want to proceed? [y/n] ")); - if(!fgets(input, 32, stdin)) - die( _("unable to read from stdin\n")); + + do{ + printf( _("\nAre you sure you want to proceed? [y/n]")); + ret = getline(&line, &len, stdin); + res = rpmatch(line); + + if (res > 0){ + free(line); + return; + } + if (!res){ + printf("\n"); + die( _("aborted\n")); + } + + }while(ret >= 0); - if (input[0] != 'y') - die( _("aborted\n")); - else - printf("\n"); + if(line) + free(line); } /** -- 1.7.6 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH 3/3] mkfs i18n: 2011-09-06 17:41 [Cluster-devel] [PATCH 3/3] mkfs i18n: Carlos Maiolino @ 2011-09-06 18:29 ` Bob Peterson 2011-09-06 19:10 ` Steven Whitehouse 1 sibling, 0 replies; 7+ messages in thread From: Bob Peterson @ 2011-09-06 18:29 UTC (permalink / raw) To: cluster-devel.redhat.com Hi Carlos, ----- Original Message ----- | + do{ | + printf( _("\nAre 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 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH 3/3] mkfs i18n: 2011-09-06 17:41 [Cluster-devel] [PATCH 3/3] mkfs i18n: Carlos Maiolino 2011-09-06 18:29 ` Bob Peterson @ 2011-09-06 19:10 ` Steven Whitehouse 2011-09-20 17:27 ` Carlos Maiolino 1 sibling, 1 reply; 7+ messages in thread From: Steven Whitehouse @ 2011-09-06 19:10 UTC (permalink / raw) To: cluster-devel.redhat.com 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.\n"), sdp->device_name); > check_dev_content(sdp->device_name); > close(fd); > - printf( _("\nAre you sure you want to proceed? [y/n] ")); > - if(!fgets(input, 32, stdin)) > - die( _("unable to read from stdin\n")); > + > + do{ > + printf( _("\nAre 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? Also, starting the string with \n is a bit odd too, Steve. > + ret = getline(&line, &len, stdin); > + res = rpmatch(line); > + > + if (res > 0){ > + free(line); > + return; > + } > + if (!res){ > + printf("\n"); > + die( _("aborted\n")); > + } > + > + }while(ret >= 0); > > - if (input[0] != 'y') > - die( _("aborted\n")); > - else > - printf("\n"); > + if(line) > + free(line); > } > > /** ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH 3/3] mkfs i18n: 2011-09-06 19:10 ` Steven Whitehouse @ 2011-09-20 17:27 ` Carlos Maiolino 2011-09-21 0:33 ` Carlos Maiolino 2011-09-22 9:50 ` Steven Whitehouse 0 siblings, 2 replies; 7+ messages in thread From: Carlos Maiolino @ 2011-09-20 17:27 UTC (permalink / raw) To: cluster-devel.redhat.com 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.\n"), sdp->device_name); > > check_dev_content(sdp->device_name); > > close(fd); > > - printf( _("\nAre you sure you want to proceed? [y/n] ")); > > - if(!fgets(input, 32, stdin)) > > - die( _("unable to read from stdin\n")); > > + > > + do{ > > + printf( _("\nAre 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 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH 3/3] mkfs i18n: 2011-09-20 17:27 ` Carlos Maiolino @ 2011-09-21 0:33 ` Carlos Maiolino 2011-09-22 9:47 ` Steven Whitehouse 2011-09-22 9:50 ` Steven Whitehouse 1 sibling, 1 reply; 7+ messages in thread From: Carlos Maiolino @ 2011-09-21 0:33 UTC (permalink / raw) To: cluster-devel.redhat.com 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. > > > 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.\n"), sdp->device_name); > > > check_dev_content(sdp->device_name); > > > close(fd); > > > - printf( _("\nAre you sure you want to proceed? [y/n] ")); > > > - if(!fgets(input, 32, stdin)) > > > - die( _("unable to read from stdin\n")); > > > + > > > + do{ > > > + printf( _("\nAre 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 ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH 3/3] mkfs i18n: 2011-09-21 0:33 ` Carlos Maiolino @ 2011-09-22 9:47 ` Steven Whitehouse 0 siblings, 0 replies; 7+ messages in thread From: Steven Whitehouse @ 2011-09-22 9:47 UTC (permalink / raw) To: cluster-devel.redhat.com 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.\n"), sdp->device_name); > > > > check_dev_content(sdp->device_name); > > > > close(fd); > > > > - printf( _("\nAre you sure you want to proceed? [y/n] ")); > > > > - if(!fgets(input, 32, stdin)) > > > > - die( _("unable to read from stdin\n")); > > > > + > > > > + do{ > > > > + printf( _("\nAre 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 > > > ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Cluster-devel] [PATCH 3/3] mkfs i18n: 2011-09-20 17:27 ` Carlos Maiolino 2011-09-21 0:33 ` Carlos Maiolino @ 2011-09-22 9:50 ` Steven Whitehouse 1 sibling, 0 replies; 7+ messages in thread From: Steven Whitehouse @ 2011-09-22 9:50 UTC (permalink / raw) To: cluster-devel.redhat.com 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.\n"), sdp->device_name); > > > check_dev_content(sdp->device_name); > > > close(fd); > > > - printf( _("\nAre you sure you want to proceed? [y/n] ")); > > > - if(!fgets(input, 32, stdin)) > > > - die( _("unable to read from stdin\n")); > > > + > > > + do{ > > > + printf( _("\nAre 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, Steve. ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-09-22 9:50 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-09-06 17:41 [Cluster-devel] [PATCH 3/3] mkfs i18n: Carlos Maiolino 2011-09-06 18:29 ` Bob Peterson 2011-09-06 19:10 ` Steven Whitehouse 2011-09-20 17:27 ` Carlos Maiolino 2011-09-21 0:33 ` Carlos Maiolino 2011-09-22 9:47 ` Steven Whitehouse 2011-09-22 9:50 ` Steven Whitehouse
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).