Annotation of embedaddon/lrzsz/intl/finddomain.c, revision 1.1
1.1 ! misho 1: /* Handle list of needed message catalogs
! 2: Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
! 3: Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
! 4:
! 5: This program is free software; you can redistribute it and/or modify
! 6: it under the terms of the GNU General Public License as published by
! 7: the Free Software Foundation; either version 2, or (at your option)
! 8: any later version.
! 9:
! 10: This program is distributed in the hope that it will be useful,
! 11: but WITHOUT ANY WARRANTY; without even the implied warranty of
! 12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 13: GNU General Public License for more details.
! 14:
! 15: You should have received a copy of the GNU General Public License
! 16: along with this program; if not, write to the Free Software Foundation,
! 17: Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
! 18:
! 19: #ifdef HAVE_CONFIG_H
! 20: # include <config.h>
! 21: #endif
! 22:
! 23: #include <ctype.h>
! 24: #include <errno.h>
! 25: #include <stdio.h>
! 26: #include <sys/types.h>
! 27:
! 28: #if defined STDC_HEADERS || defined _LIBC
! 29: # include <stdlib.h>
! 30: #else
! 31: # ifdef HAVE_MALLOC_H
! 32: # include <malloc.h>
! 33: # else
! 34: void free ();
! 35: # endif
! 36: #endif
! 37:
! 38: #if defined HAVE_STRING_H || defined _LIBC
! 39: # include <string.h>
! 40: #else
! 41: # include <strings.h>
! 42: # ifndef memcpy
! 43: # define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
! 44: # endif
! 45: #endif
! 46: #if !HAVE_STRCHR && !defined _LIBC
! 47: # ifndef strchr
! 48: # define strchr index
! 49: # endif
! 50: #endif
! 51:
! 52: #if defined HAVE_UNISTD_H || defined _LIBC
! 53: # include <unistd.h>
! 54: #endif
! 55:
! 56: #include "gettext.h"
! 57: #include "gettextP.h"
! 58: #ifdef _LIBC
! 59: # include <libintl.h>
! 60: #else
! 61: # include "libgettext.h"
! 62: #endif
! 63:
! 64: /* @@ end of prolog @@ */
! 65: /* List of already loaded domains. */
! 66: static struct loaded_l10nfile *_nl_loaded_domains;
! 67:
! 68:
! 69: /* Return a data structure describing the message catalog described by
! 70: the DOMAINNAME and CATEGORY parameters with respect to the currently
! 71: established bindings. */
! 72: struct loaded_l10nfile *
! 73: _nl_find_domain (dirname, locale, domainname)
! 74: const char *dirname;
! 75: char *locale;
! 76: const char *domainname;
! 77: {
! 78: struct loaded_l10nfile *retval;
! 79: const char *language;
! 80: const char *modifier;
! 81: const char *territory;
! 82: const char *codeset;
! 83: const char *normalized_codeset;
! 84: const char *special;
! 85: const char *sponsor;
! 86: const char *revision;
! 87: const char *alias_value;
! 88: int mask;
! 89:
! 90: /* LOCALE can consist of up to four recognized parts for the XPG syntax:
! 91:
! 92: language[_territory[.codeset]][@modifier]
! 93:
! 94: and six parts for the CEN syntax:
! 95:
! 96: language[_territory][+audience][+special][,[sponsor][_revision]]
! 97:
! 98: Beside the first all of them are allowed to be missing. If the
! 99: full specified locale is not found, the less specific one are
! 100: looked for. The various part will be stripped of according to
! 101: the following order:
! 102: (1) revision
! 103: (2) sponsor
! 104: (3) special
! 105: (4) codeset
! 106: (5) normalized codeset
! 107: (6) territory
! 108: (7) audience/modifier
! 109: */
! 110:
! 111: /* If we have already tested for this locale entry there has to
! 112: be one data set in the list of loaded domains. */
! 113: retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
! 114: strlen (dirname) + 1, 0, locale, NULL, NULL,
! 115: NULL, NULL, NULL, NULL, NULL, domainname, 0);
! 116: if (retval != NULL)
! 117: {
! 118: /* We know something about this locale. */
! 119: int cnt;
! 120:
! 121: if (retval->decided == 0)
! 122: _nl_load_domain (retval);
! 123:
! 124: if (retval->data != NULL)
! 125: return retval;
! 126:
! 127: for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
! 128: {
! 129: if (retval->successor[cnt]->decided == 0)
! 130: _nl_load_domain (retval->successor[cnt]);
! 131:
! 132: if (retval->successor[cnt]->data != NULL)
! 133: break;
! 134: }
! 135: return cnt >= 0 ? retval : NULL;
! 136: /* NOTREACHED */
! 137: }
! 138:
! 139: /* See whether the locale value is an alias. If yes its value
! 140: *overwrites* the alias name. No test for the original value is
! 141: done. */
! 142: alias_value = _nl_expand_alias (locale);
! 143: if (alias_value != NULL)
! 144: {
! 145: size_t len = strlen (alias_value) + 1;
! 146: locale = (char *) malloc (len);
! 147: if (locale == NULL)
! 148: return NULL;
! 149:
! 150: memcpy (locale, alias_value, len);
! 151: }
! 152:
! 153: /* Now we determine the single parts of the locale name. First
! 154: look for the language. Termination symbols are `_' and `@' if
! 155: we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
! 156: mask = _nl_explode_name (locale, &language, &modifier, &territory,
! 157: &codeset, &normalized_codeset, &special,
! 158: &sponsor, &revision);
! 159:
! 160: /* Create all possible locale entries which might be interested in
! 161: generalization. */
! 162: retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
! 163: strlen (dirname) + 1, mask, language, territory,
! 164: codeset, normalized_codeset, modifier, special,
! 165: sponsor, revision, domainname, 1);
! 166: if (retval == NULL)
! 167: /* This means we are out of core. */
! 168: return NULL;
! 169:
! 170: if (retval->decided == 0)
! 171: _nl_load_domain (retval);
! 172: if (retval->data == NULL)
! 173: {
! 174: int cnt;
! 175: for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
! 176: {
! 177: if (retval->successor[cnt]->decided == 0)
! 178: _nl_load_domain (retval->successor[cnt]);
! 179: if (retval->successor[cnt]->data != NULL)
! 180: break;
! 181: }
! 182: }
! 183:
! 184: /* The room for an alias was dynamically allocated. Free it now. */
! 185: if (alias_value != NULL)
! 186: free (locale);
! 187:
! 188: return retval;
! 189: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>