Annotation of embedaddon/lrzsz/intl/loadmsgcat.c, revision 1.1

1.1     ! misho       1: /* Load needed message catalogs
        !             2:    Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
        !             3: 
        !             4:    This program is free software; you can redistribute it and/or modify
        !             5:    it under the terms of the GNU General Public License as published by
        !             6:    the Free Software Foundation; either version 2, or (at your option)
        !             7:    any later version.
        !             8: 
        !             9:    This program is distributed in the hope that it will be useful,
        !            10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            12:    GNU General Public License for more details.
        !            13: 
        !            14:    You should have received a copy of the GNU General Public License
        !            15:    along with this program; if not, write to the Free Software Foundation,
        !            16:    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
        !            17: 
        !            18: #ifdef HAVE_CONFIG_H
        !            19: # include <config.h>
        !            20: #endif
        !            21: 
        !            22: #include <fcntl.h>
        !            23: #include <sys/types.h>
        !            24: #include <sys/stat.h>
        !            25: 
        !            26: #if defined STDC_HEADERS || defined _LIBC
        !            27: # include <stdlib.h>
        !            28: #endif
        !            29: 
        !            30: #if defined HAVE_UNISTD_H || defined _LIBC
        !            31: # include <unistd.h>
        !            32: #endif
        !            33: 
        !            34: #if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC
        !            35: # include <sys/mman.h>
        !            36: #endif
        !            37: 
        !            38: #include "gettext.h"
        !            39: #include "gettextP.h"
        !            40: 
        !            41: /* @@ end of prolog @@ */
        !            42: 
        !            43: #ifdef _LIBC
        !            44: /* Rename the non ISO C functions.  This is required by the standard
        !            45:    because some ISO C functions will require linking with this object
        !            46:    file and the name space must not be polluted.  */
        !            47: # define fstat  __fstat
        !            48: # define open   __open
        !            49: # define close  __close
        !            50: # define read   __read
        !            51: # define mmap   __mmap
        !            52: # define munmap __munmap
        !            53: #endif
        !            54: 
        !            55: /* We need a sign, whether a new catalog was loaded, which can be associated
        !            56:    with all translations.  This is important if the translations are
        !            57:    cached by one of GCC's features.  */
        !            58: int _nl_msg_cat_cntr = 0;
        !            59: 
        !            60: 
        !            61: /* Load the message catalogs specified by FILENAME.  If it is no valid
        !            62:    message catalog do nothing.  */
        !            63: void
        !            64: _nl_load_domain (domain_file)
        !            65:      struct loaded_l10nfile *domain_file;
        !            66: {
        !            67:   int fd;
        !            68:   struct stat st;
        !            69:   struct mo_file_header *data = (struct mo_file_header *) -1;
        !            70: #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
        !            71:     || defined _LIBC
        !            72:   int use_mmap = 0;
        !            73: #endif
        !            74:   struct loaded_domain *domain;
        !            75: 
        !            76:   domain_file->decided = 1;
        !            77:   domain_file->data = NULL;
        !            78: 
        !            79:   /* If the record does not represent a valid locale the FILENAME
        !            80:      might be NULL.  This can happen when according to the given
        !            81:      specification the locale file name is different for XPG and CEN
        !            82:      syntax.  */
        !            83:   if (domain_file->filename == NULL)
        !            84:     return;
        !            85: 
        !            86:   /* Try to open the addressed file.  */
        !            87:   fd = open (domain_file->filename, O_RDONLY);
        !            88:   if (fd == -1)
        !            89:     return;
        !            90: 
        !            91:   /* We must know about the size of the file.  */
        !            92:   if (fstat (fd, &st) != 0
        !            93:       && st.st_size < (off_t) sizeof (struct mo_file_header))
        !            94:     {
        !            95:       /* Something went wrong.  */
        !            96:       close (fd);
        !            97:       return;
        !            98:     }
        !            99: 
        !           100: #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
        !           101:     || defined _LIBC
        !           102:   /* Now we are ready to load the file.  If mmap() is available we try
        !           103:      this first.  If not available or it failed we try to load it.  */
        !           104:   data = (struct mo_file_header *) mmap (NULL, st.st_size, PROT_READ,
        !           105:                                         MAP_PRIVATE, fd, 0);
        !           106: 
        !           107:   if (data != (struct mo_file_header *) -1)
        !           108:     {
        !           109:       /* mmap() call was successful.  */
        !           110:       close (fd);
        !           111:       use_mmap = 1;
        !           112:     }
        !           113: #endif
        !           114: 
        !           115:   /* If the data is not yet available (i.e. mmap'ed) we try to load
        !           116:      it manually.  */
        !           117:   if (data == (struct mo_file_header *) -1)
        !           118:     {
        !           119:       off_t to_read;
        !           120:       char *read_ptr;
        !           121: 
        !           122:       data = (struct mo_file_header *) malloc (st.st_size);
        !           123:       if (data == NULL)
        !           124:        return;
        !           125: 
        !           126:       to_read = st.st_size;
        !           127:       read_ptr = (char *) data;
        !           128:       do
        !           129:        {
        !           130:          long int nb = (long int) read (fd, read_ptr, to_read);
        !           131:          if (nb == -1)
        !           132:            {
        !           133:              close (fd);
        !           134:              return;
        !           135:            }
        !           136: 
        !           137:          read_ptr += nb;
        !           138:          to_read -= nb;
        !           139:        }
        !           140:       while (to_read > 0);
        !           141: 
        !           142:       close (fd);
        !           143:     }
        !           144: 
        !           145:   /* Using the magic number we can test whether it really is a message
        !           146:      catalog file.  */
        !           147:   if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED)
        !           148:     {
        !           149:       /* The magic number is wrong: not a message catalog file.  */
        !           150: #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
        !           151:     || defined _LIBC
        !           152:       if (use_mmap)
        !           153:        munmap ((caddr_t) data, st.st_size);
        !           154:       else
        !           155: #endif
        !           156:        free (data);
        !           157:       return;
        !           158:     }
        !           159: 
        !           160:   domain_file->data
        !           161:     = (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
        !           162:   if (domain_file->data == NULL)
        !           163:     return;
        !           164: 
        !           165:   domain = (struct loaded_domain *) domain_file->data;
        !           166:   domain->data = (char *) data;
        !           167:   domain->must_swap = data->magic != _MAGIC;
        !           168: 
        !           169:   /* Fill in the information about the available tables.  */
        !           170:   switch (W (domain->must_swap, data->revision))
        !           171:     {
        !           172:     case 0:
        !           173:       domain->nstrings = W (domain->must_swap, data->nstrings);
        !           174:       domain->orig_tab = (struct string_desc *)
        !           175:        ((char *) data + W (domain->must_swap, data->orig_tab_offset));
        !           176:       domain->trans_tab = (struct string_desc *)
        !           177:        ((char *) data + W (domain->must_swap, data->trans_tab_offset));
        !           178:       domain->hash_size = W (domain->must_swap, data->hash_tab_size);
        !           179:       domain->hash_tab = (nls_uint32 *)
        !           180:        ((char *) data + W (domain->must_swap, data->hash_tab_offset));
        !           181:       break;
        !           182:     default:
        !           183:       /* This is an illegal revision.  */
        !           184: #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
        !           185:     || defined _LIBC
        !           186:       if (use_mmap)
        !           187:        munmap ((caddr_t) data, st.st_size);
        !           188:       else
        !           189: #endif
        !           190:        free (data);
        !           191:       free (domain);
        !           192:       domain_file->data = NULL;
        !           193:       return;
        !           194:     }
        !           195: 
        !           196:   /* Show that one domain is changed.  This might make some cached
        !           197:      translations invalid.  */
        !           198:   ++_nl_msg_cat_cntr;
        !           199: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>