tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: gettext(1) implementation



On 07/05/2015 05:46 AM, Joerg Sonnenberger wrote:
On Sun, May 31, 2015 at 11:21:39PM -0700, William Orr wrote:
Currently, I've implemented the same features that exist in the GNU gettext(1)
command. I'm thinking of adding more (easier message context support, for one)
if this gets merged.

There is one issue with this shown by graphics/shotwell in pkgsrc. That
depends on using --domain=textdomain, which currently gives an error.
Can you implement that?

Joerg


Hey,

This adds support for long options, as well as some changes that I had submitted in a previous diff (fixing a memory leak, suggestions from previous patches).

Thanks,
William Orr

--- ../netbsd/src/usr.bin/gettext/gettext.c 2015-06-03 16:15:22.000000000 -0700
+++ src/usr.bin/gettext/gettext.c	2015-07-11 18:48:20.221429987 -0700
@@ -1,5 +1,3 @@
-/*	$NetBSD: gettext.c,v 1.2 2015/06/03 23:15:22 enami Exp $	*/
-
 /*-
  * Copyright (c) 2015 William Orr <will%worrbase.com@localhost>
  * All rights reserved.
@@ -25,8 +23,6 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-#include <sys/cdefs.h>
-__RCSID("$NetBSD: gettext.c,v 1.2 2015/06/03 23:15:22 enami Exp $");

 #include <err.h>
 #include <errno.h>
@@ -39,21 +35,28 @@
 #include <string.h>
 #include <util.h>

-static __dead void
+static bool nflag;
+
+static struct option longopts[] = {
+	{ "help",       no_argument,        NULL,   'h' },
+	{ "domain", required_argument,  NULL,   'd' },
+	{ NULL,         0,                  NULL,   0 },
+};
+
+static void
 usage(int exit_status)
 {

-	fprintf(stderr, "Usage: %s [-ehn] [[<textdomain>] <msgid>]\n",
-	    getprogname());
-	fprintf(stderr, "Usage: %s -s [<msgid>]...\n", getprogname());
+	fprintf(stderr, "Usage: %s [-ehn] [[TEXTDOMAIN] MSGID]\n", getprogname());
+	fprintf(stderr, "Usage: %s [-ehn] -d TEXTDOMAIN MSGID\n", getprogname());
+	fprintf(stderr, "Usage: %s -s [MSGID]...\n", getprogname());
 	exit(exit_status);
 }

-static bool
+static void
 expand(char *str)
 {
 	char *fp, *sp, ch, pl;
-	bool nflag = false;

 	for (fp = str, sp = str; *fp != 0;) {
 		if (*fp == '\\') {
@@ -122,7 +125,6 @@
 	}

 	*sp = '\0';
-	return nflag;
 }

 int
@@ -130,28 +132,26 @@
 {
 	char *msgdomain = NULL;
 	char *msgdomaindir = NULL;
+	char *msgid = NULL;
 	char *translation = NULL;
-	char *s;
 	bool eflag = false;
 	bool sflag = false;
-	bool nflag = false;
 	int ch;

 	setlocale(LC_ALL, "");
 	setprogname(argv[0]);

-	while ((ch = getopt(argc, argv, "d:EehnsV")) != -1) {
+	while ((ch = getopt_long(argc, argv, "d:eEhnsV", longopts, NULL)) != -1) {
 		switch (ch) {
 		case 'd':
 			msgdomain = estrdup(optarg);
 			break;
-		case 'E':
-			/* GNU gettext compat */
-			break;
 		case 'e':
 			eflag = true;
 			break;
-		case 'V':
+		case 'E':
+			/* GNU gettext compat */
+			break;
 		case 'h':
 			free(msgdomain);
 			usage(EXIT_SUCCESS);
@@ -173,37 +173,37 @@

 	if (argc == 0) {
 		free(msgdomain);
-		errx(EXIT_FAILURE, "missing msgid");
+		warnx("missing msgid");
+		usage(EXIT_FAILURE);
 	}
-
 	/* msgdomain can be passed as optional arg iff -s is not passed */
-	if (!sflag) {
-		if (argc == 2) {
-			free(msgdomain);
-			msgdomain = estrdup(argv[0]);
+	if (argc == 2 && !sflag) {
+		free(msgdomain);
+		msgdomain = estrdup(argv[0]);

-			argc -= 1;
-			argv += 1;
-		} else if (argc > 2)
-			errx(EXIT_FAILURE, "too many arguments");
+		argc -= 1;
+		argv += 1;
+	} else if (argc > 2 && !sflag) {
+		warnx("%s: too many arguments", getprogname());
+		usage(EXIT_FAILURE);
 	}
-
 	/* msgdomain can be passed as env var */
 	if (msgdomain == NULL) {
-		if ((s = getenv("TEXTDOMAIN")) != NULL)
-			msgdomain = estrdup(s);
+		if (getenv("TEXTDOMAIN")) {
+			free(msgdomain);
+			msgdomain = estrdup(getenv("TEXTDOMAIN"));
+		}
 	}

 	if (msgdomain != NULL) {
-		if ((s = getenv("TEXTDOMAINDIR")) != NULL)
-			msgdomaindir = estrdup(s);
+		if (getenv("TEXTDOMAINDIR"))
+			msgdomaindir = estrdup(getenv("TEXTDOMAINDIR"));
 		if (msgdomaindir)
 			bindtextdomain(msgdomain, msgdomaindir);
 	}
-
 	do {
 		if (eflag)
-			nflag |= expand(*argv);
+			expand(*argv);

 		translation = dgettext(msgdomain, argv[0]);
 		printf("%s", translation);
@@ -219,6 +219,5 @@

 	free(msgdomain);
 	free(msgdomaindir);
-
 	return EXIT_SUCCESS;
 }



Home | Main Index | Thread Index | Old Index