6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore/*
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * This file and its contents are supplied under the terms of the
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * Common Development and Distribution License ("CDDL"), version 1.0.
5aec55eb0591d2fcdd38d7dd5408a6ff3456e596Garrett D'Amore * You may only use this file in accordance with the terms of version
5aec55eb0591d2fcdd38d7dd5408a6ff3456e596Garrett D'Amore * 1.0 of the CDDL.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore *
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * A full copy of the text of the CDDL should have accompanied this
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * source. A copy of the CDDL is also available via the Internet at
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * http://www.illumos.org/license/CDDL.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore/*
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore * Copyright 2013 DEY Storage Systems, Inc.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore/*
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * POSIX localedef.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <stdio.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <stdlib.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <errno.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <sys/types.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <sys/stat.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <string.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <unistd.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <libgen.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <stddef.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <unistd.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <limits.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <locale.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include <dirent.h>
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include "localedef.h"
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#include "parser.tab.h"
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#ifndef TEXT_DOMAIN
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#define TEXT_DOMAIN "SYS_TEST"
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore#endif
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreint verbose = 0;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreint undefok = 0;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreint warnok = 0;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorestatic char *locname = NULL;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorestatic char locpath[PATH_MAX];
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreconst char *
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorecategory_name(void)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore switch (get_category()) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_CHARMAP:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return ("CHARMAP");
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore case T_WIDTH:
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore return ("WIDTH");
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_COLLATE:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return ("LC_COLLATE");
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_CTYPE:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return ("LC_CTYPE");
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_MESSAGES:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return ("LC_MESSAGES");
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_MONETARY:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return ("LC_MONETARY");
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_NUMERIC:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return ("LC_NUMERIC");
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case T_TIME:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return ("LC_TIME");
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore default:
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore INTERR;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (NULL);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorestatic char *
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorecategory_file(void)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) snprintf(locpath, sizeof (locpath), "%s/%s/LCL_DATA",
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore locname, category_name());
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (locpath);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'AmoreFILE *
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreopen_category(void)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore FILE *file;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (verbose) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) printf(_("Writing category %s: "), category_name());
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) fflush(stdout);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore /* make the parent directory */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) mkdirp(dirname(category_file()), 0755);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore /*
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * note that we have to regenerate the file name, as dirname
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * clobbered it.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore file = fopen(category_file(), "w");
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (file == NULL) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore errf(strerror(errno));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (NULL);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (file);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorevoid
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreclose_category(FILE *f)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (fchmod(fileno(f), 0644) < 0) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) fclose(f);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) unlink(category_file());
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore errf(strerror(errno));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (fclose(f) < 0) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) unlink(category_file());
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore errf(strerror(errno));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (verbose) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) fprintf(stdout, _("done.\n"));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) fflush(stdout);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore/*
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * This function is used when copying the category from another
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * locale. Note that the copy is actually performed using a hard
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore * link for efficiency.
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorevoid
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorecopy_category(char *src)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore char srcpath[PATH_MAX];
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore int rv;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) snprintf(srcpath, sizeof (srcpath), "%s/%s/LCL_DATA",
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore src, category_name());
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore rv = access(srcpath, R_OK);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if ((rv != 0) && (strchr(srcpath, '/') == NULL)) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore /* Maybe we should try the system locale */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) snprintf(srcpath, sizeof (srcpath),
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore "/usr/lib/locale/%s/%s/LCL_DATA", src, category_name());
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore rv = access(srcpath, R_OK);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (rv != 0) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore errf(_("source locale data unavailable"), src);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (verbose > 1) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) printf(_("Copying category %s from %s: "),
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore category_name(), src);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) fflush(stdout);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore /* make the parent directory */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) mkdirp(dirname(category_file()), 0755);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (link(srcpath, category_file()) != 0) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore errf(_("unable to copy locale data: %s"), strerror(errno));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (verbose > 1) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) printf(_("done.\n"));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreint
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreputl_category(const char *s, FILE *f)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (s && fputs(s, f) == EOF) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) fclose(f);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) unlink(category_file());
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore errf(strerror(errno));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (EOF);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (fputc('\n', f) == EOF) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) fclose(f);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) unlink(category_file());
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore errf(strerror(errno));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (EOF);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (0);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreint
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorewr_category(void *buf, size_t sz, FILE *f)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (!sz) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (0);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (fwrite(buf, sz, 1, f) < 1) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) fclose(f);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) unlink(category_file());
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore errf(strerror(errno));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (EOF);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (0);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreint yyparse(void);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amorestatic void
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreusage(void)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) fprintf(stderr,
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore _("Usage: localedef [options] localename\n"));
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) fprintf(stderr, ("[options] are:\n"));
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) fprintf(stderr, (" -c : ignore warnings\n"));
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) fprintf(stderr, (" -v : verbose output\n"));
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) fprintf(stderr, (" -U : ignore undefined symbols\n"));
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) fprintf(stderr, (" -f charmap : use given charmap file\n"));
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) fprintf(stderr, (" -u encoding : assume encoding\n"));
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) fprintf(stderr, (" -w widths : use screen widths file\n"));
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) fprintf(stderr, (" -i locsrc : source file for locale\n"));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore exit(4);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoreint
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amoremain(int argc, char **argv)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore{
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore int c;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore char *lfname = NULL;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore char *cfname = NULL;
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore char *wfname = NULL;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore DIR *dir;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore init_charmap();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore init_collate();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore init_ctype();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore init_messages();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore init_monetary();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore init_numeric();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore init_time();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore yydebug = 0;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) setlocale(LC_ALL, "");
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) textdomain(TEXT_DOMAIN);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore while ((c = getopt(argc, argv, "w:i:cf:u:vU")) != -1) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore switch (c) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case 'v':
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore verbose++;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case 'i':
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore lfname = optarg;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case 'u':
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore set_wide_encoding(optarg);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case 'f':
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore cfname = optarg;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case 'U':
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore undefok++;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case 'c':
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore warnok++;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore case 'w':
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore wfname = optarg;
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore case '?':
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore usage();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore break;
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if ((argc - 1) != (optind)) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore usage();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore locname = argv[argc - 1];
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (verbose) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) printf(_("Processing locale %s.\n"), locname);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (cfname) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (verbose)
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) printf(_("Loading charmap %s.\n"), cfname);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore reset_scanner(cfname);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) yyparse();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore if (wfname) {
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore if (verbose)
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) printf(_("Loading widths %s.\n"), wfname);
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore reset_scanner(wfname);
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore (void) yyparse();
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore }
2da1cd3a39e2d3da7f9d15071ea9462919c011acGarrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (verbose) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) printf(_("Loading POSIX portable characters.\n"));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore add_charmap_posix();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (lfname) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore reset_scanner(lfname);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore } else {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore reset_scanner(NULL);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore /* make the directory for the locale if not already present */
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore while ((dir = opendir(locname)) == NULL) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if ((errno != ENOENT) ||
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (mkdir(locname, 0755) < 0)) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore errf(strerror(errno));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) closedir(dir);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) mkdirp(dirname(category_file()), 0755);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) yyparse();
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore if (verbose) {
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore (void) printf(_("All done.\n"));
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore }
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore return (warnings ? 1 : 0);
6b5e5868e7ebf1aff3a5abd7d0c4ef0e5fbf3648Garrett D'Amore}