diff options
author | Ben Elliston <bje@au.ibm.com> | 2001-11-29 03:38:59 +0000 |
---|---|---|
committer | Ben Elliston <bje@au.ibm.com> | 2001-11-29 03:38:59 +0000 |
commit | 1491f078cfe48411f5e046fa25bbe7cb1b2d57db (patch) | |
tree | 384bb70ec362537a22be5c2edbb5ab294a8d532e /intl/loadmsgcat.c | |
parent | ba73e5c0425a23d60c2553775eaf1b4d921f290e (diff) | |
download | gdb-1491f078cfe48411f5e046fa25bbe7cb1b2d57db.zip gdb-1491f078cfe48411f5e046fa25bbe7cb1b2d57db.tar.gz gdb-1491f078cfe48411f5e046fa25bbe7cb1b2d57db.tar.bz2 |
* Import GNU gettext 0.10.35.
Diffstat (limited to 'intl/loadmsgcat.c')
-rw-r--r-- | intl/loadmsgcat.c | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c index 73e90a9..515892d 100644 --- a/intl/loadmsgcat.c +++ b/intl/loadmsgcat.c @@ -1,5 +1,5 @@ -/* Load needed message catalogs - Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. +/* Load needed message catalogs. + Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -44,7 +44,6 @@ /* Rename the non ISO C functions. This is required by the standard because some ISO C functions will require linking with this object file and the name space must not be polluted. */ -# define fstat __fstat # define open __open # define close __close # define read __read @@ -61,10 +60,12 @@ int _nl_msg_cat_cntr = 0; /* Load the message catalogs specified by FILENAME. If it is no valid message catalog do nothing. */ void +internal_function _nl_load_domain (domain_file) struct loaded_l10nfile *domain_file; { int fd; + size_t size; struct stat st; struct mo_file_header *data = (struct mo_file_header *) -1; #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ @@ -90,7 +91,8 @@ _nl_load_domain (domain_file) /* We must know about the size of the file. */ if (fstat (fd, &st) != 0 - && st.st_size < (off_t) sizeof (struct mo_file_header)) + || (size = (size_t) st.st_size) != st.st_size + || size < sizeof (struct mo_file_header)) { /* Something went wrong. */ close (fd); @@ -101,7 +103,7 @@ _nl_load_domain (domain_file) || defined _LIBC /* Now we are ready to load the file. If mmap() is available we try this first. If not available or it failed we try to load it. */ - data = (struct mo_file_header *) mmap (NULL, st.st_size, PROT_READ, + data = (struct mo_file_header *) mmap (NULL, size, PROT_READ, MAP_PRIVATE, fd, 0); if (data != (struct mo_file_header *) -1) @@ -116,14 +118,14 @@ _nl_load_domain (domain_file) it manually. */ if (data == (struct mo_file_header *) -1) { - off_t to_read; + size_t to_read; char *read_ptr; - data = (struct mo_file_header *) malloc (st.st_size); + data = (struct mo_file_header *) malloc (size); if (data == NULL) return; - to_read = st.st_size; + to_read = size; read_ptr = (char *) data; do { @@ -150,7 +152,7 @@ _nl_load_domain (domain_file) #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || defined _LIBC if (use_mmap) - munmap ((caddr_t) data, st.st_size); + munmap ((caddr_t) data, size); else #endif free (data); @@ -164,6 +166,11 @@ _nl_load_domain (domain_file) domain = (struct loaded_domain *) domain_file->data; domain->data = (char *) data; +#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ + || defined _LIBC + domain->use_mmap = use_mmap; +#endif + domain->mmap_size = size; domain->must_swap = data->magic != _MAGIC; /* Fill in the information about the available tables. */ @@ -184,7 +191,7 @@ _nl_load_domain (domain_file) #if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \ || defined _LIBC if (use_mmap) - munmap ((caddr_t) data, st.st_size); + munmap ((caddr_t) data, size); else #endif free (data); @@ -197,3 +204,19 @@ _nl_load_domain (domain_file) translations invalid. */ ++_nl_msg_cat_cntr; } + + +#ifdef _LIBC +void +internal_function +_nl_unload_domain (domain) + struct loaded_domain *domain; +{ + if (domain->use_mmap) + munmap ((caddr_t) domain->data, domain->mmap_size); + else + free ((void *) domain->data); + + free (domain); +} +#endif |