Fri Nov 10 14:15:21 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
authorRoland McGrath <roland@gnu.org>
Fri, 10 Nov 1995 20:38:31 +0000 (20:38 +0000)
committerRoland McGrath <roland@gnu.org>
Fri, 10 Nov 1995 20:38:31 +0000 (20:38 +0000)
* hurd/hurdsig.c (_hurd_internal_post_signal): For SIGNO == 0,
skip straight to pending check.  When UNTRACED, resume process
from suspension first.

* intl/Makefile (headers): New variable, libintl.h.
[gettext-srcdir]: New rules to copy source from $(gettext-srcdir)/intl.
* configure.in: Check for --with-gettext arg.

Fri Nov 10 13:51:30 1995  Richard Stallman  <rms@gnu.ai.mit.edu>

* malloc/malloc.c (get_contiguous_space): New function.
(morecore): Rewrite allocating new malloc info table.
(_malloc_internal): Use get_contiguous_space.

Fri Nov 10 13:03:40 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

* hurd/hurdexec.c (_hurd_exec): If exec'ing self, pass
_hurd_msgport to be destroyed.

* Makerules (installed-libcs): Filter out %_pic.a.

* hurd/hurdinit.c (_hurd_proc_init): When traced, use msg_sig_post
to our msgport to take SIGTRAP, instead of _hurd_raise_signal.

* hurd/Makefile (user-interfaces): Add hurd/process_request.

16 files changed:
ChangeLog
Makerules
configure
configure.in
hurd/Makefile
hurd/hurdexec.c
hurd/hurdinit.c
hurd/hurdsig.c
intl/Makefile
intl/dcgettext.c
intl/finddomain.c
intl/gettext.c
intl/libintl.h [moved from locale/libintl.h with 100% similarity]
intl/loadmsgcat.c
intl/localealias.c
libintl.h

index 207092e..c55cda9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,31 @@
+Fri Nov 10 14:15:21 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+
+       * hurd/hurdsig.c (_hurd_internal_post_signal): For SIGNO == 0,
+       skip straight to pending check.  When UNTRACED, resume process
+       from suspension first.
+
+       * intl/Makefile (headers): New variable, libintl.h.
+       [gettext-srcdir]: New rules to copy source from $(gettext-srcdir)/intl.
+       * configure.in: Check for --with-gettext arg.
+
+Fri Nov 10 13:51:30 1995  Richard Stallman  <rms@gnu.ai.mit.edu>
+
+       * malloc/malloc.c (get_contiguous_space): New function.
+       (morecore): Rewrite allocating new malloc info table.
+       (_malloc_internal): Use get_contiguous_space.
+
+Fri Nov 10 13:03:40 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+
+       * hurd/hurdexec.c (_hurd_exec): If exec'ing self, pass
+       _hurd_msgport to be destroyed.
+
+       * Makerules (installed-libcs): Filter out %_pic.a.
+
+       * hurd/hurdinit.c (_hurd_proc_init): When traced, use msg_sig_post
+       to our msgport to take SIGTRAP, instead of _hurd_raise_signal.
+
+       * hurd/Makefile (user-interfaces): Add hurd/process_request.
+
 Wed Nov  8 16:31:25 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * termios/Makefile (headers): Add sys/ttychars.h.
index 1ae1384..1f678d5 100644 (file)
--- a/Makerules
+++ b/Makerules
@@ -457,6 +457,7 @@ ifdef objects
 installed-libcs := $(foreach o,$(object-suffixes),\
                             $(libdir)/$(patsubst %,$(libtype$o),\
                                                  $(libprefix)$(libc-name)))
+installed-libcs := $(filter-out %_pic.a,$(installed-libcs))
 install: $(installed-libcs)
 $(installed-libcs): $(libdir)/lib$(libprefix)%: lib
        $(make-target-directory)
index 0476b00..26935c7 100755 (executable)
--- a/configure
+++ b/configure
@@ -15,6 +15,8 @@ ac_default_prefix=/usr/local
 ac_help="$ac_help
   --with-gmp=DIRECTORY   find GMP source code in DIRECTORY (not needed)"
 ac_help="$ac_help
+  --with-gettext=DIR     find GNU gettext source code in DIR (not needed)"
+ac_help="$ac_help
   --with-fp              if using floating-point hardware"
 ac_help="$ac_help
   --with-gnu-binutils    if using GNU binutils (as and ld)"
@@ -558,6 +560,21 @@ esac
 
 fi
 
+# Check for a --with-gettext argument and set gettext-srcdir in config.make.
+# Check whether --with-gettext or --without-gettext was given.
+if test "${with_gettext+set}" = set; then
+  withval="$with_gettext"
+  case "$with_gettext" in
+yes)
+  { echo "configure: error: --with-gettext requires an argument; use --with-gettext=DIR" 1>&2; exit 1; } ;;
+''|no) ;;
+*)
+  config_vars="$config_vars
+gettext-srcdir = $withval" ;;
+esac
+
+fi
+
 
 # Check whether --with-fp or --without-fp was given.
 if test "${with_fp+set}" = set; then
@@ -768,7 +785,7 @@ ostry=$os
 while o=`echo $tail | sed 's/\.[^.]*$//'`; test $o != $tail; do
   ostry="$ostry /$o"
   tail=$o
-done  
+done
 o=`echo $tail | sed 's/[0-9]*$//'`
 if test $o != $tail; then
   ostry="$ostry /$o"
@@ -1133,7 +1150,7 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1137 "configure"
+#line 1154 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
@@ -1147,7 +1164,7 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1151 "configure"
+#line 1168 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
@@ -1201,7 +1218,7 @@ if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&4
 else
   cat > conftest.$ac_ext <<EOF
-#line 1205 "configure"
+#line 1222 "configure"
 #include "confdefs.h"
 #define __need_size_t
 #define __need_wchar_t
@@ -1324,7 +1341,7 @@ if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&4
 else
   cat > conftest.$ac_ext <<EOF
-#line 1328 "configure"
+#line 1345 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
index ead6813..6b2624e 100644 (file)
@@ -18,6 +18,19 @@ yes) AC_MSG_ERROR(--with-gmp requires an argument; use --with-gmp=DIRECTORY) ;;
 gmp-srcdir = $withval" ;;
 esac
 ])
+# Check for a --with-gettext argument and set gettext-srcdir in config.make.
+AC_ARG_WITH(gettext, dnl
+  --with-gettext=DIR     find GNU gettext source code in DIR (not needed),
+           [dnl
+case "$with_gettext" in
+yes)
+  AC_MSG_ERROR(--with-gettext requires an argument; use --with-gettext=DIR) ;;
+''|no) ;;
+*)
+  config_vars="$config_vars
+gettext-srcdir = $withval" ;;
+esac
+])
 
 dnl Arguments to specify presence of other packages/features.
 AC_ARG_WITH(fp, dnl
@@ -133,7 +146,7 @@ ostry=$os
 while o=`echo $tail | sed 's/\.[^.]*$//'`; test $o != $tail; do
   ostry="$ostry /$o"
   tail=$o
-done  
+done
 o=`echo $tail | sed 's/[0-9]*$//'`
 if test $o != $tail; then
   ostry="$ostry /$o"
index 8d1f194..69f9e96 100644 (file)
@@ -33,7 +33,8 @@ distribute := hurdstartup.h hurdfault.h intr-rpc.defs STATUS
 # The RPC interfaces go in a separate library.
 interface-library := libhurduser
 user-interfaces                := $(addprefix hurd/,\
-                                      auth process startup \
+                                      auth startup \
+                                      process process_request \
                                       msg msg_reply msg_request \
                                       exec exec_startup crash interrupt \
                                       fs fsys io term socket ifsock)
index 0ac18e4..149e95c 100644 (file)
@@ -30,7 +30,7 @@ Cambridge, MA 02139, USA.  */
    If TASK == mach_task_self (), some ports are dealloc'd by the exec server.
    ARGV and ENVP are terminated by NULL pointers.  */
 error_t
-_hurd_exec (task_t task, file_t file, 
+_hurd_exec (task_t task, file_t file,
            char *const argv[], char *const envp[])
 {
   error_t err;
@@ -129,7 +129,7 @@ _hurd_exec (task_t task, file_t file,
      in the exec, or the signal will never be delivered.  Setting the
      critical section flag avoids anything we call trying to acquire the
      sigstate lock.  */
-  
+
   ss->critical_section = 1;
   __spin_unlock (&ss->lock);
 
@@ -224,7 +224,7 @@ _hurd_exec (task_t task, file_t file,
                       ports, MACH_MSG_TYPE_COPY_SEND, _hurd_nports,
                       ints, INIT_INT_MAX,
                       please_dealloc, pdp - please_dealloc,
-                      NULL, 0);
+                      &_hurd_msgport, task == __mach_task_self () ? 1 : 0);
   }
 
   /* Release references to the standard ports.  */
index 409d2d1..bed78b8 100644 (file)
@@ -151,7 +151,7 @@ _hurd_proc_init (char **argv)
     /* This process is "traced", meaning it should stop on signals or exec.
        We are all set up now to handle signals.  Stop ourselves, to inform
        our parent (presumably a debugger) that the exec has completed.  */
-    _hurd_raise_signal (NULL, SIGTRAP, 0, 0);
+    __msg_sig_post (_hurd_msgport, SIGTRAP, __mach_task_self ());
 }
 \f
 /* Called when we get a message telling us to change our proc server port.  */
index 7affb90..68be2e9 100644 (file)
@@ -265,11 +265,14 @@ interrupted_reply_port_location (struct machine_thread_all_state *thread_state,
    incoming signal, returns the reply port to be received on.  Otherwise
    returns MACH_PORT_NULL.
 
+   SIGNO is used to find the applicable SA_RESTART bit.  If SIGNO is zero,
+   the RPC fails with EINTR instead of restarting (thread_cancel).
+
    *STATE_CHANGE is set nonzero if STATE->basic was modified and should
    be applied back to the thread if it might ever run again, else zero.  */
 
 mach_port_t
-_hurdsig_abort_rpcs (struct hurd_sigstate *ss, int signo, int sigthread, 
+_hurdsig_abort_rpcs (struct hurd_sigstate *ss, int signo, int sigthread,
                     struct machine_thread_all_state *state, int *state_change,
                     mach_port_t *reply_port,
                     mach_msg_type_name_t reply_port_type,
@@ -480,6 +483,52 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
                 }));
       _hurd_stopped = 1;
     }
+  /* Resume the process after a suspension.  */
+  void resume (void)
+    {
+      /* Resume the process from being stopped.  */
+      thread_t *threads;
+      mach_msg_type_number_t nthreads, i;
+      error_t err;
+
+      if (! _hurd_stopped)
+       return;
+
+      /* Tell the proc server we are continuing.  */
+      __USEPORT (PROC, __proc_mark_cont (port));
+      /* Fetch ports to all our threads and resume them.  */
+      err = __task_threads (__mach_task_self (), &threads, &nthreads);
+      assert_perror (err);
+      for (i = 0; i < nthreads; ++i)
+       {
+         if (threads[i] != _hurd_msgport_thread &&
+             (act != handle || threads[i] != ss->thread))
+           {
+             err = __thread_resume (threads[i]);
+             assert_perror (err);
+           }
+         err = __mach_port_deallocate (__mach_task_self (),
+                                       threads[i]);
+         assert_perror (err);
+       }
+      __vm_deallocate (__mach_task_self (),
+                      (vm_address_t) threads,
+                      nthreads * sizeof *threads);
+      _hurd_stopped = 0;
+      /* The thread that will run the handler is already suspended.  */
+      ss_suspended = 1;
+    }
+
+  if (signo == 0)
+    {
+      if (untraced)
+       /* This is PTRACE_CONTINUE.  */
+       resume ();
+
+      /* This call is just to check for pending signals.  */
+      __spin_lock (&ss->lock);
+      goto check_pending_signals;
+    }
 
  post_signal:
 
@@ -514,8 +563,6 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
 
       __spin_lock (&ss->lock);
 
-      handler = ss->actions[signo].sa_handler;
-
       if (!untraced && (_hurd_exec_flags & EXEC_TRACED))
        {
          /* We are being traced.  Stop to tell the debugger of the signal.  */
@@ -530,6 +577,8 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
          return;
        }
 
+      handler = ss->actions[signo].sa_handler;
+
       if (handler == SIG_DFL)
        /* Figure out the default action for this signal.  */
        switch (signo)
@@ -604,35 +653,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
            ss->pending &= ~STOPSIGS;
 
          if (_hurd_stopped && act != stop && (untraced || signo == SIGCONT))
-           {
-             /* Resume the process from being stopped.  */
-             thread_t *threads;
-             mach_msg_type_number_t nthreads, i;
-             error_t err;
-             /* Tell the proc server we are continuing.  */
-             __USEPORT (PROC, __proc_mark_cont (port));
-             /* Fetch ports to all our threads and resume them.  */
-             err = __task_threads (__mach_task_self (), &threads, &nthreads);
-             assert_perror (err);
-             for (i = 0; i < nthreads; ++i)
-               {
-                 if (threads[i] != _hurd_msgport_thread &&
-                     (act != handle || threads[i] != ss->thread))
-                   {
-                     err = __thread_resume (threads[i]);
-                     assert_perror (err);
-                   }
-                 err = __mach_port_deallocate (__mach_task_self (),
-                                               threads[i]);
-                 assert_perror (err);
-               }
-             __vm_deallocate (__mach_task_self (),
-                              (vm_address_t) threads,
-                              nthreads * sizeof *threads);
-             _hurd_stopped = 0;
-             /* The thread that will run the handler is already suspended.  */
-             ss_suspended = 1;
-           }
+           resume ();
        }
     }
 
@@ -648,10 +669,8 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
       act = term;
     }
 
-  /* Handle receipt of a blocked signal, or any signal while stopped.
-     It matters that we test ACT first here, because we must never pass
-     SIGNO==0 to __sigismember.  */
-  if ((act != ignore && __sigismember (&ss->blocked, signo)) ||
+  /* Handle receipt of a blocked signal, or any signal while stopped.  */
+  if (__sigismember (&ss->blocked, signo) ||
       (signo != SIGKILL && _hurd_stopped))
     {
       mark_pending ();
@@ -754,7 +773,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
                ss->context = &ocontext;
              }
            _hurdsig_end_catch_fault ();
-           
+
            if (! machine_get_basic_state (ss->thread, &thread_state))
              goto sigbomb;
            loc = interrupted_reply_port_location (&thread_state, 1);
@@ -772,7 +791,7 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
        else
          {
            wait_for_reply
-             = (_hurdsig_abort_rpcs (ss, signo, 1, 
+             = (_hurdsig_abort_rpcs (ss, signo, 1,
                                      &thread_state, &state_changed,
                                      &reply_port, reply_port_type, untraced)
                 != MACH_PORT_NULL);
@@ -851,12 +870,8 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
     }
 
   /* The signal has either been ignored or is now being handled.  We can
-     consider it delivered and reply to the killer.  The exception is
-     signal 0, which can be sent by a user thread to make us check for
-     pending signals.  In that case we want to deliver the pending signals
-     before replying.  */
-  if (signo != 0)
-    reply ();
+     consider it delivered and reply to the killer.  */
+  reply ();
 
   /* We get here unless the signal was fatal.  We still hold SS->lock.
      Check for pending signals, and loop to post them.  */
@@ -874,6 +889,9 @@ _hurd_internal_post_signal (struct hurd_sigstate *ss,
        return pending = ss->pending & ~ss->blocked;
       }
 
+  check_pending_signals:
+    untraced = 0;
+
     if (signals_pending ())
       {
       pending:
@@ -974,7 +992,7 @@ signal_allowed (int signo, mach_port_t refport)
        /* A continue signal can be sent by anyone in the session.  */
        mach_port_t sessport;
        if (! __USEPORT (PROC, __proc_getsidport (port, &sessport)))
-         { 
+         {
            __mach_port_deallocate (__mach_task_self (), sessport);
            if (refport == sessport)
              goto win;
@@ -1099,7 +1117,7 @@ _hurdsig_init (void)
                                  MACH_PORT_RIGHT_RECEIVE,
                                  &_hurd_msgport))
     __libc_fatal ("hurd: Can't create message port receive right\n");
-  
+
   /* Make a send right to the signal port.  */
   if (err = __mach_port_insert_right (__mach_task_self (),
                                      _hurd_msgport,
@@ -1135,7 +1153,7 @@ _hurdsig_init (void)
 
   if (err = __thread_resume (_hurd_msgport_thread))
     __libc_fatal ("hurd: Can't resume signal thread\n");
-    
+
 #if 0                          /* Don't confuse poor gdb.  */
   /* Receive exceptions on the signal port.  */
   __task_set_special_port (__mach_task_self (),
index f7ef998..6e588fc 100644 (file)
@@ -19,6 +19,7 @@
 # Cambridge, MA 02139, USA.
 
 subdir = intl
+headers = libintl.h
 routines = bindtextdom dcgettext dgettext gettext      \
           finddomain loadmsgcat localealias textdomain
 distribute = gettext.h gettextP.h hash-string.h
@@ -27,3 +28,17 @@ include ../Rules
 
 CPPFLAGS += -D'GNULOCALEDIR="$(localedir)"' \
            -D'LOCALE_ALIAS_PATH="$(localedir):$(nlsdir)"'
+
+ifdef gettext-srcdir
+
+%:: $(gettext-srcdir)/intl/%.glibc; $(copysrc)
+%:: $(gettext-srcdir)/intl/%; $(copysrc)
+
+define copysrc
+cp -f $< $@.new
+chmod a-w $@.new
+mv -f $@.new $@
+test ! -d CVS || cvs commit -m'Updated from $<' $@
+endef
+
+endif
index 91025be..09e0443 100644 (file)
@@ -317,14 +317,13 @@ DCGETTEXT (domainname, msgid, category)
            {
              int cnt;
 
-             for (cnt = 6; cnt >= 0 && retval == NULL; --cnt)
-               if (domain->successor[cnt] != NULL)
-                 {
-                   retval = find_msg (domain->successor[cnt], msgid);
-
-                   if (domain->successor[cnt]->data == NULL)
-                     domain->successor[cnt] = NULL;
-                 }
+             for (cnt = 0; domain->successor[cnt] != NULL; --cnt)
+               {
+                 retval = find_msg (domain->successor[cnt], msgid);
+
+                 if (retval != NULL)
+                   break;
+               }
            }
 
          if (retval != NULL)
index 19cf2d7..007a87e 100644 (file)
@@ -95,6 +95,11 @@ static struct loaded_domain *make_entry_rec __P ((const char *dirname,
                                                  const char *domainname,
                                                  int do_allocate));
 
+/* Substitution for systems lacking this function in their C library.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *stpcpy __P ((char *dest, const char *src));
+#endif
+
 
 /* Return a data structure describing the message catalog described by
    the DOMAINNAME and CATEGORY parameters with respect to the currently
@@ -155,9 +160,9 @@ _nl_find_domain (dirname, locale, domainname)
       if (retval->data != NULL)
        return retval;
 
-      for (cnt = 6; cnt >= 0; --cnt)
+      for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
        {
-         if (retval->successor[cnt] == 0)
+         if (retval->successor[cnt]->decided == 0)
            _nl_load_domain (retval->successor[cnt]);
 
          if (retval->successor[cnt]->data != NULL)
@@ -279,13 +284,13 @@ _nl_find_domain (dirname, locale, domainname)
      separator character in the file name, not for XPG syntax.  */
   if (syntax == xpg)
     {
-      if (territory[0] == '\0')
+      if (territory != NULL && territory[0] == '\0')
        mask &= ~TERRITORY;
 
-      if (codeset[0] == '\0')
+      if (codeset != NULL && codeset[0] == '\0')
        mask &= ~XPG_CODESET;
 
-      if (modifier[0] == '\0')
+      if (modifier != NULL && modifier[0] == '\0')
        mask &= ~XPG_MODIFIER;
     }
 
@@ -340,107 +345,110 @@ make_entry_rec (dirname, mask, language, territory, codeset, modifier,
      const char *domain;
      int do_allocate;
 {
-  struct loaded_domain *retval, *last;
-  char *filename, *cp;
+  char *filename = NULL;
+  struct loaded_domain *last = NULL;
+  struct loaded_domain *retval;
+  char *cp;
   size_t entries;
   int cnt;
 
-  /* Allocate room for the full file name.  */
-  filename = (char *) malloc (strlen (dirname) + 1
-                             + strlen (language)
-                             + ((mask & TERRITORY) != 0
-                                ? strlen (territory) : 0)
-                             + ((mask & XPG_CODESET) != 0
-                                ? strlen (codeset) : 0)
-                             + ((mask & XPG_MODIFIER) != 0 ?
-                                strlen (modifier) : 0)
-                             + ((mask & CEN_SPECIAL) != 0
-                                ? strlen (special) : 0)
-                             + ((mask & CEN_SPONSOR) != 0
-                                ? strlen (sponsor) : 0)
-                             + ((mask & CEN_REVISION) != 0
-                                ? strlen (revision) : 0) + 1
-                             + strlen (domain) + 1);
-
-  if (filename == NULL)
-    return NULL;
 
-  retval = NULL;
-  last = NULL;
+  /* Process the current entry described by the MASK only when it is
+     valid.  Because the mask can have in the first call bits from
+     both syntaces set this is necessary to prevent constructing
+     illegal local names.  */
+  /* FIXME: Rewrite because test is necessary only in first round.  */
+  if ((mask & CEN_SPECIFIC) == 0 || (mask & XPG_SPECIFIC) == 0)
+    {
+      /* Allocate room for the full file name.  */
+      filename = (char *) malloc (strlen (dirname) + 1
+                                 + strlen (language)
+                                 + ((mask & TERRITORY) != 0
+                                    ? strlen (territory) : 0)
+                                 + ((mask & XPG_CODESET) != 0
+                                    ? strlen (codeset) : 0)
+                                 + ((mask & XPG_MODIFIER) != 0 ?
+                                    strlen (modifier) : 0)
+                                 + ((mask & CEN_SPECIAL) != 0
+                                    ? strlen (special) : 0)
+                                 + ((mask & CEN_SPONSOR) != 0
+                                    ? strlen (sponsor) : 0)
+                                 + ((mask & CEN_REVISION) != 0
+                                    ? strlen (revision) : 0) + 1
+                                 + strlen (domain) + 1);
+
+      if (filename == NULL)
+       return NULL;
 
-  /* We don't want libintl.a to depend on any other library.  So we
-     avoid the non-standard function stpcpy.  In GNU C Library this
-     function is available, though.  Also allow the symbol HAVE_STPCPY
-     to be defined.  */
-#if !defined _LIBC && !defined HAVE_STPCPY
-# define stpcpy(p, s)                                                      \
-  (strcpy (p, s), strchr (p, '\0'))
-#endif
+      retval = NULL;
+      last = NULL;
 
-  /* Construct file name.  */
-  cp = stpcpy (filename, dirname);
-  *cp++ = '/';
-  cp = stpcpy (cp, language);
+      /* Construct file name.  */
+      cp = stpcpy (filename, dirname);
+      *cp++ = '/';
+      cp = stpcpy (cp, language);
 
-  if ((mask & TERRITORY) != 0)
-    {
-      *cp++ = '_';
-      cp = stpcpy (cp, territory);
-    }
-  if ((mask & XPG_CODESET) != 0)
-    {
-      *cp++ = '.';
+      if ((mask & TERRITORY) != 0)
+       {
+         *cp++ = '_';
+         cp = stpcpy (cp, territory);
+       }
+      if ((mask & XPG_CODESET) != 0)
+       {
+         *cp++ = '.';
       cp = stpcpy (cp, codeset);
-    }
-  if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
-    {
-      /* This component can be part of both syntaces but has different
-        leading characters.  For CEN we use `+', else `@'.  */
-      *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
-      cp = stpcpy (cp, modifier);
-    }
-  if ((mask & CEN_SPECIAL) != 0)
-    {
-      *cp++ = '+';
-      cp = stpcpy (cp, special);
-    }
-  if ((mask & CEN_SPONSOR) != 0)
-    {
-      *cp++ = ',';
-      cp = stpcpy (cp, sponsor);
-    }
-  if ((mask & CEN_REVISION) != 0)
-    {
-      *cp++ = '_';
-      cp = stpcpy (cp, revision);
-    }
-
-  *cp++ = '/';
-  stpcpy (cp, domain);
-
-  /* Look in list of already loaded domains whether it is already
-     available.  */
-  last = NULL;
-  for (retval = _nl_loaded_domains; retval != NULL; retval = retval->next)
-    {
-      int compare = strcmp (retval->filename, filename);
-      if (compare == 0)
-       /* We found it!  */
-       break;
-      if (compare < 0)
+       }
+      if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
        {
-         /* It's not in the list.  */
-         retval = NULL;
-         break;
+         /* This component can be part of both syntaces but has different
+            leading characters.  For CEN we use `+', else `@'.  */
+         *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
+         cp = stpcpy (cp, modifier);
+       }
+      if ((mask & CEN_SPECIAL) != 0)
+       {
+         *cp++ = '+';
+         cp = stpcpy (cp, special);
+       }
+      if ((mask & CEN_SPONSOR) != 0)
+       {
+         *cp++ = ',';
+         cp = stpcpy (cp, sponsor);
+       }
+      if ((mask & CEN_REVISION) != 0)
+       {
+         *cp++ = '_';
+         cp = stpcpy (cp, revision);
        }
 
-      last = retval;
-    }
-
-  if (retval != NULL || do_allocate == 0)
-    {
-      free (filename);
-      return retval;
+      *cp++ = '/';
+      stpcpy (cp, domain);
+
+      /* Look in list of already loaded domains whether it is already
+        available.  */
+      last = NULL;
+      for (retval = _nl_loaded_domains; retval != NULL; retval = retval->next)
+       if (retval->filename != NULL)
+         {
+           int compare = strcmp (retval->filename, filename);
+           if (compare == 0)
+             /* We found it!  */
+             break;
+           if (compare < 0)
+             {
+               /* It's not in the list.  */
+               retval = NULL;
+               break;
+             }
+
+           last = retval;
+         }
+
+      if (retval != NULL || do_allocate == 0)
+       {
+         free (filename);
+         return retval;
+       }
     }
 
   retval = (struct loaded_domain *) malloc (sizeof (*retval));
@@ -453,8 +461,8 @@ make_entry_rec (dirname, mask, language, territory, codeset, modifier,
   if (last == NULL)
     {
       retval->next = _nl_loaded_domains;
-     _nl_loaded_domains = retval;
-     }
+      _nl_loaded_domains = retval;
+    }
   else
     {
       retval->next = last->next;
@@ -474,3 +482,22 @@ make_entry_rec (dirname, mask, language, territory, codeset, modifier,
 
   return retval;
 }
+
+
+/* @@ begin of epilog @@ */
+
+/* We don't want libintl.a to depend on any other library.  So we
+   avoid the non-standard function stpcpy.  In GNU C Library this
+   function is available, though.  Also allow the symbol HAVE_STPCPY
+   to be defined.  */
+#if !_LIBC && !HAVE_STPCPY
+static char *
+stpcpy (dest, src)
+     char *dest;
+     const char *src;
+{
+  while ((*dest++ = *src++) != '\0')
+    /* Do nothing. */ ;
+  return dest - 1;
+}
+#endif
index 204d85e..7bed636 100644 (file)
@@ -29,7 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 #  ifdef HAVE_STRING_H
 #   include <string.h>
 #  else
-#   define NULL 0
+#   define NULL ((void *) 0)
 #  endif
 # endif
 #endif
similarity index 100%
rename from locale/libintl.h
rename to intl/libintl.h
index b05c630..d98f365 100644 (file)
@@ -75,6 +75,13 @@ _nl_load_domain (domain)
   domain->decided = 1;
   domain->data = NULL;
 
+  /* If the record does not represent a valid locale the FILENAME
+     might be NULL.  This can happen when according to the given
+     specification the locale file name is different for XPG and CEN
+     syntax.  */
+  if (domain->filename == NULL)
+    return;
+
   /* Try to open the addressed file.  */
   fd = open (domain->filename, O_RDONLY);
   if (fd == -1)
index fc3bc12..47f2cbf 100644 (file)
@@ -1,5 +1,5 @@
 /* localealias.c -- handle aliases for locale names
-   Copyright (C) 1995 Software Foundation, Inc.
+   Copyright (C) 1995 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
@@ -125,7 +125,7 @@ _nl_expand_alias (name)
        {
          const char *start;
 
-         while (locale_alias_path[0] != '\0' && locale_alias_path[0] == ':')
+         while (locale_alias_path[0] == ':')
            ++locale_alias_path;
          start = locale_alias_path;
 
@@ -239,7 +239,7 @@ read_alias_file (fname, fname_len)
            }
        }
 
-      /* Possibily not the whole line fits into the buffer.  Ignore
+      /* Possibily not the whole line fitted into the buffer.  Ignore
         the rest of the line.  */
       while (strchr (cp, '\n') == NULL)
        {
@@ -305,8 +305,8 @@ alias_compare (map1, map2)
     {
       /* I know this seems to be odd but the tolower() function in
         some systems libc cannot handle nonalpha characters.  */
-      c1 = isalpha (*p1) ? tolower (*p1) : *p1;
-      c2 = isalpha (*p2) ? tolower (*p2) : *p2;
+      c1 = isupper (*p1) ? tolower (*p1) : *p1;
+      c2 = isupper (*p2) ? tolower (*p2) : *p2;
       if (c1 == '\0')
        break;
     }
index 38a33d2..be1062c 100644 (file)
--- a/libintl.h
+++ b/libintl.h
@@ -1 +1 @@
-#include <locale/libintl.h>
+#include <intl/libintl.h>