forked from Imagelibrary/binutils-gdb
This commit was manufactured by cvs2svn to create branch 'msnyder-fork-
checkpoint-branch'. Sprout from gdb-csl-gxxpro-6_3-branch 2005-11-17 00:00:03 UTC nobody 'This commit was manufactured by cvs2svn to create branch 'gdb-csl-gxxpro-' Cherrypick from master 2005-11-21 23:00:05 UTC Alan Modra <amodra@gmail.com> 'daily update': bfd/ChangeLog bfd/elf64-hppa.c bfd/elf64-ppc.c bfd/som.c bfd/version.h gdb/ChangeLog gdb/config/v850/v850.mt gdb/doc/ChangeLog gdb/doc/gdb.texinfo gdb/dwarf2loc.c gdb/hppa-hpux-tdep.c gdb/hppa-tdep.c gdb/inf-ptrace.c gdb/mi/gdb-mi.el gdb/mi/mi-main.c gdb/tracepoint.c gdb/version.in intl/ChangeLog intl/Makefile.in intl/acconfig.h intl/aclocal.m4 intl/bindtextdom.c intl/cat-compat.c intl/config.in intl/configure intl/configure.in intl/dcgettext.c intl/dgettext.c intl/explodename.c intl/finddomain.c intl/gettext.c intl/gettext.h intl/gettextP.h intl/hash-string.h intl/intl-compat.c intl/intlh.inst.in intl/l10nflist.c intl/libgettext.h intl/libintl.glibc intl/linux-msg.sed intl/loadinfo.h intl/loadmsgcat.c intl/localealias.c intl/po2tbl.sed.in intl/textdomain.c intl/xopen-msg.sed sim/ChangeLog sim/arm/ChangeLog sim/arm/armos.c sim/cris/sim-main.h sim/cris/traps.c sim/testsuite/ChangeLog Delete: texinfo/texinfo.tex
This commit is contained in:
@@ -1,3 +1,20 @@
|
|||||||
|
2005-11-20 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
||||||
|
|
||||||
|
* som.c (som_decode_symclass): Decode BSF_WEAK symbols in the same
|
||||||
|
manner as bfd_decode_symclass.
|
||||||
|
|
||||||
|
2005-11-18 Alan Modra <amodra@bigpond.net.au>
|
||||||
|
|
||||||
|
* elf64-ppc.c (ppc64_elf_check_relocs): Don't set has_14bit_branch
|
||||||
|
on branches to same section.
|
||||||
|
|
||||||
|
2005-11-17 Randolph Chung <tausq@debian.org>
|
||||||
|
|
||||||
|
* elf64-hppa.c (elf64_hppa_object_p): Recognize corefiles under
|
||||||
|
hppa64-hp-hpux11.11.
|
||||||
|
(elf64_hppa_section_from_phdr): New function.
|
||||||
|
(elf_backend_section_from_phdr): Define.
|
||||||
|
|
||||||
2005-11-11 Nick Clifton <nickc@redhat.com>
|
2005-11-11 Nick Clifton <nickc@redhat.com>
|
||||||
|
|
||||||
PR 1150
|
PR 1150
|
||||||
|
|||||||
@@ -381,13 +381,16 @@ elf64_hppa_object_p (abfd)
|
|||||||
{
|
{
|
||||||
/* GCC on hppa-linux produces binaries with OSABI=Linux,
|
/* GCC on hppa-linux produces binaries with OSABI=Linux,
|
||||||
but the kernel produces corefiles with OSABI=SysV. */
|
but the kernel produces corefiles with OSABI=SysV. */
|
||||||
if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_LINUX &&
|
if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_LINUX
|
||||||
i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
|
&& i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX)
|
/* HPUX produces binaries with OSABI=HPUX,
|
||||||
|
but the kernel produces corefiles with OSABI=SysV. */
|
||||||
|
if (i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_HPUX
|
||||||
|
&& i_ehdrp->e_ident[EI_OSABI] != ELFOSABI_NONE) /* aka SYSV */
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -399,7 +402,10 @@ elf64_hppa_object_p (abfd)
|
|||||||
case EFA_PARISC_1_1:
|
case EFA_PARISC_1_1:
|
||||||
return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
|
return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 11);
|
||||||
case EFA_PARISC_2_0:
|
case EFA_PARISC_2_0:
|
||||||
return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
|
if (i_ehdrp->e_ident[EI_CLASS] == ELFCLASS64)
|
||||||
|
return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
|
||||||
|
else
|
||||||
|
return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 20);
|
||||||
case EFA_PARISC_2_0 | EF_PARISC_WIDE:
|
case EFA_PARISC_2_0 | EF_PARISC_WIDE:
|
||||||
return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
|
return bfd_default_set_arch_mach (abfd, bfd_arch_hppa, 25);
|
||||||
}
|
}
|
||||||
@@ -2641,6 +2647,36 @@ elf64_hppa_elf_get_symbol_type (elf_sym, type)
|
|||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Support HP specific sections for core files. */
|
||||||
|
static bfd_boolean
|
||||||
|
elf64_hppa_section_from_phdr (bfd *abfd, Elf_Internal_Phdr *hdr, int index,
|
||||||
|
const char *typename)
|
||||||
|
{
|
||||||
|
if (hdr->p_type == PT_HP_CORE_PROC)
|
||||||
|
{
|
||||||
|
int sig;
|
||||||
|
|
||||||
|
if (bfd_seek (abfd, hdr->p_offset, SEEK_SET) != 0)
|
||||||
|
return FALSE;
|
||||||
|
if (bfd_bread (&sig, 4, abfd) != 4)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
elf_tdata (abfd)->core_signal = sig;
|
||||||
|
|
||||||
|
/* gdb uses the ".reg" section to read register contents. */
|
||||||
|
if (!_bfd_elfcore_make_pseudosection (abfd, ".reg", hdr->p_filesz,
|
||||||
|
hdr->p_offset))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hdr->p_type == PT_HP_CORE_LOADABLE
|
||||||
|
|| hdr->p_type == PT_HP_CORE_STACK
|
||||||
|
|| hdr->p_type == PT_HP_CORE_MMF)
|
||||||
|
hdr->p_type = PT_LOAD;
|
||||||
|
|
||||||
|
return _bfd_elf_make_section_from_phdr (abfd, hdr, index, typename);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct bfd_elf_special_section elf64_hppa_special_sections[] =
|
static const struct bfd_elf_special_section elf64_hppa_special_sections[] =
|
||||||
{
|
{
|
||||||
{ ".fini", 5, 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
|
{ ".fini", 5, 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
|
||||||
@@ -2751,6 +2787,7 @@ const struct elf_size_info hppa64_elf_size_info =
|
|||||||
#define elf_backend_rela_normal 1
|
#define elf_backend_rela_normal 1
|
||||||
#define elf_backend_special_sections elf64_hppa_special_sections
|
#define elf_backend_special_sections elf64_hppa_special_sections
|
||||||
#define elf_backend_action_discarded elf_hppa_action_discarded
|
#define elf_backend_action_discarded elf_hppa_action_discarded
|
||||||
|
#define elf_backend_section_from_phdr elf64_hppa_section_from_phdr
|
||||||
|
|
||||||
#include "elf64-target.h"
|
#include "elf64-target.h"
|
||||||
|
|
||||||
|
|||||||
@@ -4507,7 +4507,24 @@ ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
|
|||||||
case R_PPC64_REL14:
|
case R_PPC64_REL14:
|
||||||
case R_PPC64_REL14_BRTAKEN:
|
case R_PPC64_REL14_BRTAKEN:
|
||||||
case R_PPC64_REL14_BRNTAKEN:
|
case R_PPC64_REL14_BRNTAKEN:
|
||||||
htab->has_14bit_branch = 1;
|
{
|
||||||
|
asection *dest = NULL;
|
||||||
|
|
||||||
|
/* Heuristic: If jumping outside our section, chances are
|
||||||
|
we are going to need a stub. */
|
||||||
|
if (h != NULL)
|
||||||
|
{
|
||||||
|
/* If the sym is weak it may be overridden later, so
|
||||||
|
don't assume we know where a weak sym lives. */
|
||||||
|
if (h->root.type == bfd_link_hash_defined)
|
||||||
|
dest = h->root.u.def.section;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
dest = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
|
||||||
|
sec, r_symndx);
|
||||||
|
if (dest != sec)
|
||||||
|
htab->has_14bit_branch = 1;
|
||||||
|
}
|
||||||
/* Fall through. */
|
/* Fall through. */
|
||||||
|
|
||||||
case R_PPC64_REL24:
|
case R_PPC64_REL24:
|
||||||
|
|||||||
23
bfd/som.c
23
bfd/som.c
@@ -5355,11 +5355,30 @@ som_decode_symclass (asymbol *symbol)
|
|||||||
if (bfd_is_com_section (symbol->section))
|
if (bfd_is_com_section (symbol->section))
|
||||||
return 'C';
|
return 'C';
|
||||||
if (bfd_is_und_section (symbol->section))
|
if (bfd_is_und_section (symbol->section))
|
||||||
return 'U';
|
{
|
||||||
|
if (symbol->flags & BSF_WEAK)
|
||||||
|
{
|
||||||
|
/* If weak, determine if it's specifically an object
|
||||||
|
or non-object weak. */
|
||||||
|
if (symbol->flags & BSF_OBJECT)
|
||||||
|
return 'v';
|
||||||
|
else
|
||||||
|
return 'w';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return 'U';
|
||||||
|
}
|
||||||
if (bfd_is_ind_section (symbol->section))
|
if (bfd_is_ind_section (symbol->section))
|
||||||
return 'I';
|
return 'I';
|
||||||
if (symbol->flags & BSF_WEAK)
|
if (symbol->flags & BSF_WEAK)
|
||||||
return 'W';
|
{
|
||||||
|
/* If weak, determine if it's specifically an object
|
||||||
|
or non-object weak. */
|
||||||
|
if (symbol->flags & BSF_OBJECT)
|
||||||
|
return 'V';
|
||||||
|
else
|
||||||
|
return 'W';
|
||||||
|
}
|
||||||
if (!(symbol->flags & (BSF_GLOBAL | BSF_LOCAL)))
|
if (!(symbol->flags & (BSF_GLOBAL | BSF_LOCAL)))
|
||||||
return '?';
|
return '?';
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
#define BFD_VERSION_DATE 20051117
|
#define BFD_VERSION_DATE 20051122
|
||||||
#define BFD_VERSION @bfd_version@
|
#define BFD_VERSION @bfd_version@
|
||||||
#define BFD_VERSION_STRING @bfd_version_string@
|
#define BFD_VERSION_STRING @bfd_version_string@
|
||||||
|
|||||||
@@ -1,3 +1,79 @@
|
|||||||
|
2005-11-20 Mark Kettenis <kettenis@gnu.org>
|
||||||
|
|
||||||
|
* inf-ptrace.c (inf_ptrace_xfer_partial): Use PIOD_WRITE_I instead
|
||||||
|
of PIOD_WRITE_D.
|
||||||
|
|
||||||
|
2005-11-19 Jim Blandy <jimb@redhat.com>
|
||||||
|
|
||||||
|
* tracepoint.c (memrange_absolute): New enum constant.
|
||||||
|
(struct memrange, memrange_cmp, add_memrange, collect_symbol,
|
||||||
|
stringify_collection_list, encode_actions): Use it instead of '-1'
|
||||||
|
to indicate an fixed-address memory range.
|
||||||
|
(Suggested by Eli Zaretskii.)
|
||||||
|
|
||||||
|
* tracepoint.c (stringify_collection_list): Indicate absolute
|
||||||
|
memory ranges by using "-1" as the memory range's base register
|
||||||
|
number, not "FFFFFFFF".
|
||||||
|
|
||||||
|
2005-11-19 Randolph Chung <tausq@debian.org>
|
||||||
|
|
||||||
|
* dwarf2loc.c (dwarf2_tracepoint_var_ref): Remove extra add for
|
||||||
|
DW_OP_fbreg. Handle DW_OP_breg0 through DW_OP_breg31. Print
|
||||||
|
DWARF opcode for unsupported case.
|
||||||
|
|
||||||
|
2005-11-19 Randolph Chung <tausq@debian.org>
|
||||||
|
|
||||||
|
* hppa-hpux-tdep.c (hppa_hpux_sigtramp_frame_unwind_cache): Use
|
||||||
|
HPPA_HPUX_SS_* constants. Ensure "off" is large enough to hold
|
||||||
|
64-bit offset. Set proper signal context offset for 64-bit
|
||||||
|
programs. Set pc properly for signal frames.
|
||||||
|
|
||||||
|
2005-11-19 Randolph Chung <tausq@debian.org>
|
||||||
|
|
||||||
|
* hppa-hpux-tdep.c (hppa_hpux_sigtramp_unwind_sniffer): Rely on the
|
||||||
|
unwind record to determine a signal frame, instead of hardcoding
|
||||||
|
a function name.
|
||||||
|
|
||||||
|
2005-11-19 Randolph Chung <tausq@debian.org>
|
||||||
|
|
||||||
|
* hppa-tdep.c (skip_prologue_hard_way): Add one more insn pattern
|
||||||
|
for "std rp,-0x10(sp)".
|
||||||
|
(hppa_frame_cache): Likewise.
|
||||||
|
(hppa_fallback_frame_cache): Likewise.
|
||||||
|
|
||||||
|
2005-11-19 Randolph Chung <tausq@debian.org>
|
||||||
|
|
||||||
|
* hppa-tdep.c (hppa_frame_cache): Reformat code and enhance
|
||||||
|
debugging.
|
||||||
|
|
||||||
|
2005-11-18 Jim Blandy <jimb@redhat.com>
|
||||||
|
|
||||||
|
* tracepoint.c (struct memrange, collect_symbol): Doc fix.
|
||||||
|
|
||||||
|
2005-11-18 Andrew Stubbs <andrew.stubbs@st.com>
|
||||||
|
|
||||||
|
* mi/mi-main.c (mi_load_progress): Ensure the use of the correct mi
|
||||||
|
uiout for the duration of the function.
|
||||||
|
|
||||||
|
2005-11-18 Nick Roberts <nickrob@snap.net.nz>
|
||||||
|
|
||||||
|
* mi/gdb-mi.el (gdb-source-file-list): Declare.
|
||||||
|
(gdbmi): Bind new functions.
|
||||||
|
(gdbmi-var-list-children-handler, gdbmi-var-list-children-regexp):
|
||||||
|
Handle string expressions properly. Move "type" field into regexp.
|
||||||
|
(gdbmi-var-update-regexp, gdbmi-var-update-handler): Handle string
|
||||||
|
expressions properly. Update speedbar.
|
||||||
|
(gdbmi-breakpoints-buffer, gdb-stack-buffer, gdb-locals-buffer)
|
||||||
|
(gdb-registers-buffer): Use def-gdb-auto-update-trigger instead of
|
||||||
|
def-gdb-auto-updated-buffer as handlers is defined explicitly.
|
||||||
|
(gdb-stack-list-locals-handler): Handle string expressions properly.
|
||||||
|
(gdb-data-list-register-values-handler)
|
||||||
|
(gdb-data-list-register-values-custom): Fontify buffer.
|
||||||
|
|
||||||
|
2005-11-17 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
|
|
||||||
|
* version.in: Update to 6.4.50.
|
||||||
|
|
||||||
2005-11-16 Andrew Stubbs <andrew.stubbs@st.com>
|
2005-11-16 Andrew Stubbs <andrew.stubbs@st.com>
|
||||||
|
|
||||||
* NEWS (6.4): Mention $argc.
|
* NEWS (6.4): Mention $argc.
|
||||||
|
|||||||
4
gdb/config/v850/v850.mt
Normal file
4
gdb/config/v850/v850.mt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# Target: NEC V850 processor
|
||||||
|
TDEPFILES= v850-tdep.o
|
||||||
|
SIM_OBS = remote-sim.o
|
||||||
|
SIM = ../sim/v850/libsim.a
|
||||||
@@ -1,3 +1,31 @@
|
|||||||
|
2005-11-19 Jim Blandy <jimb@redhat.com>
|
||||||
|
|
||||||
|
* gdb.texinfo (Tracepoint Packets): New node.
|
||||||
|
(General Query Packets): Add entries for the tracepoint packets,
|
||||||
|
referring to the "Tracepoint Packets" node.
|
||||||
|
(Tracepoints): Add reference to "Tracepoint Packets".
|
||||||
|
|
||||||
|
2005-11-18 Kevin Buettner <kevinb@redhat.com>
|
||||||
|
|
||||||
|
* gdb.texinfo (set remotebreak): Add anchor.
|
||||||
|
(X packet): Likewise.
|
||||||
|
(Remote Protocol): Add new section `Interrupts' and new index
|
||||||
|
entry `interrupts (remote protocol)'.
|
||||||
|
|
||||||
|
2005-11-18 Jim Blandy <jimb@redhat.com>
|
||||||
|
|
||||||
|
* gdb.texinfo (Packets): Move information out of 'q' and 'Q'
|
||||||
|
entries into the General Query Packets section. Add a
|
||||||
|
cross-reference to that section. Drop description of replies, as
|
||||||
|
these are covered in the descriptions of each packet.
|
||||||
|
(General Query Packets): Add introductory text. Explain naming
|
||||||
|
conventions, and how the end of a name is recognized.
|
||||||
|
|
||||||
|
2005-11-17 Kevin Buettner <kevinb@redhat.com>
|
||||||
|
|
||||||
|
* gdb.texinfo (Remote configuration): Fix typo in description of
|
||||||
|
"set remotebreak" command.
|
||||||
|
|
||||||
2005-11-16 Jim Blandy <jimb@redhat.com>
|
2005-11-16 Jim Blandy <jimb@redhat.com>
|
||||||
|
|
||||||
* gdb.texinfo (Packets, Stop Reply Packets)
|
* gdb.texinfo (Packets, Stop Reply Packets)
|
||||||
|
|||||||
@@ -7126,10 +7126,12 @@ values without interacting with you, it can do so quickly and
|
|||||||
unobtrusively, hopefully not disturbing the program's behavior.
|
unobtrusively, hopefully not disturbing the program's behavior.
|
||||||
|
|
||||||
The tracepoint facility is currently available only for remote
|
The tracepoint facility is currently available only for remote
|
||||||
targets. @xref{Targets}. In addition, your remote target must know how
|
targets. @xref{Targets}. In addition, your remote target must know
|
||||||
to collect trace data. This functionality is implemented in the remote
|
how to collect trace data. This functionality is implemented in the
|
||||||
stub; however, none of the stubs distributed with @value{GDBN} support
|
remote stub; however, none of the stubs distributed with @value{GDBN}
|
||||||
tracepoints as of this writing.
|
support tracepoints as of this writing. The format of the remote
|
||||||
|
packets used to implement tracepoints are described in @ref{Tracepoint
|
||||||
|
Packets}.
|
||||||
|
|
||||||
This chapter describes the tracepoint commands and features.
|
This chapter describes the tracepoint commands and features.
|
||||||
|
|
||||||
@@ -12147,9 +12149,10 @@ Show the current speed of the remote connection.
|
|||||||
@item set remotebreak
|
@item set remotebreak
|
||||||
@cindex interrupt remote programs
|
@cindex interrupt remote programs
|
||||||
@cindex BREAK signal instead of Ctrl-C
|
@cindex BREAK signal instead of Ctrl-C
|
||||||
|
@anchor{set remotebreak}
|
||||||
If set to on, @value{GDBN} sends a @code{BREAK} signal to the remote
|
If set to on, @value{GDBN} sends a @code{BREAK} signal to the remote
|
||||||
when you press the @key{Ctrl-C} key to interrupt the program running
|
when you press the @key{Ctrl-C} key to interrupt the program running
|
||||||
on the remote. If set to off, @value{GDBN} sends the @samp{Strl-C}
|
on the remote. If set to off, @value{GDBN} sends the @samp{Ctrl-C}
|
||||||
character instead. The default is off, since most remote systems
|
character instead. The default is off, since most remote systems
|
||||||
expect to see @samp{Ctrl-C} as the interrupt signal.
|
expect to see @samp{Ctrl-C} as the interrupt signal.
|
||||||
|
|
||||||
@@ -22016,6 +22019,8 @@ Show the current setting of the target wait timeout.
|
|||||||
* Stop Reply Packets::
|
* Stop Reply Packets::
|
||||||
* General Query Packets::
|
* General Query Packets::
|
||||||
* Register Packet Format::
|
* Register Packet Format::
|
||||||
|
* Tracepoint Packets::
|
||||||
|
* Interrupts::
|
||||||
* Examples::
|
* Examples::
|
||||||
* File-I/O remote protocol extension::
|
* File-I/O remote protocol extension::
|
||||||
@end menu
|
@end menu
|
||||||
@@ -22397,30 +22402,12 @@ for success
|
|||||||
for an error
|
for an error
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item q @var{query}
|
@item q @var{name} @var{params}@dots{}
|
||||||
@anchor{general query packet}
|
@itemx Q @var{name} @var{params}@dots{}
|
||||||
@cindex @samp{q} packet
|
@cindex @samp{q} packet
|
||||||
General query. Request info about @var{query}. In general
|
|
||||||
@value{GDBN} queries have a leading upper case letter. Custom vendor
|
|
||||||
queries should use a company prefix (in lower case) ex:
|
|
||||||
@samp{qfsf.var}. @var{query} may optionally be followed by a @samp{,}
|
|
||||||
or @samp{;} separated list. Stubs must ensure that they match the
|
|
||||||
full @var{query} name.
|
|
||||||
|
|
||||||
Reply:
|
|
||||||
@table @samp
|
|
||||||
@item @var{XX@dots{}}
|
|
||||||
Hex encoded data from query. The reply must not be empty.
|
|
||||||
@item E @var{NN}
|
|
||||||
error reply
|
|
||||||
@item
|
|
||||||
Indicating an unrecognized @var{query}.
|
|
||||||
@end table
|
|
||||||
|
|
||||||
@item Q @var{var}=@var{val}
|
|
||||||
@cindex @samp{Q} packet
|
@cindex @samp{Q} packet
|
||||||
General set. Set value of @var{var} to @var{val}.
|
General query (@samp{q}) and set (@samp{Q}). These packets are
|
||||||
@xref{general query packet}, for a discussion of naming conventions.
|
described fully in @ref{General Query Packets}.
|
||||||
|
|
||||||
@item r
|
@item r
|
||||||
@cindex @samp{r} packet
|
@cindex @samp{r} packet
|
||||||
@@ -22514,6 +22501,7 @@ The @samp{vCont} packet is not supported.
|
|||||||
@end table
|
@end table
|
||||||
|
|
||||||
@item X @var{addr},@var{length}:@var{XX@dots{}}
|
@item X @var{addr},@var{length}:@var{XX@dots{}}
|
||||||
|
@anchor{X packet}
|
||||||
@cindex @samp{X} packet
|
@cindex @samp{X} packet
|
||||||
Write data to memory, where the data is transmitted in binary.
|
Write data to memory, where the data is transmitted in binary.
|
||||||
@var{addr} is address, @var{length} is number of bytes,
|
@var{addr} is address, @var{length} is number of bytes,
|
||||||
@@ -22735,7 +22723,33 @@ protocol extension}, for more details.
|
|||||||
@section General Query Packets
|
@section General Query Packets
|
||||||
@cindex remote query requests
|
@cindex remote query requests
|
||||||
|
|
||||||
The following set and query packets have already been defined.
|
Packets starting with @samp{q} are @dfn{general query packets};
|
||||||
|
packets starting with @samp{Q} are @dfn{general set packets}. General
|
||||||
|
query and set packets are a semi-unified form for retrieving and
|
||||||
|
sending information to and from the stub.
|
||||||
|
|
||||||
|
The initial letter of a query or set packet is followed by a name
|
||||||
|
indicating what sort of thing the packet applies to. For example,
|
||||||
|
@value{GDBN} may use a @samp{qSymbol} packet to exchange symbol
|
||||||
|
definitions with the stub. These packet names follow some
|
||||||
|
conventions:
|
||||||
|
|
||||||
|
@itemize @bullet
|
||||||
|
@item
|
||||||
|
The name must not contain commas, colons or semicolons.
|
||||||
|
@item
|
||||||
|
Most @value{GDBN} query and set packets have a leading upper case
|
||||||
|
letter.
|
||||||
|
@item
|
||||||
|
The names of custom vendor packets should use a company prefix, in
|
||||||
|
lower case, followed by a period. For example, packets designed at
|
||||||
|
the Acme Corporation might begin with @samp{qacme.foo} (for querying
|
||||||
|
foos) or @samp{Qacme.bar} (for setting bars).
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
A query or set packet may optionally be followed by a @samp{,} or
|
||||||
|
@samp{;} separated list. Stubs must be careful to match the full
|
||||||
|
packet name, in case packet names have common prefixes.
|
||||||
|
|
||||||
Like the descriptions of the other packets, each description here
|
Like the descriptions of the other packets, each description here
|
||||||
has a template showing the packet's overall syntax, followed by an
|
has a template showing the packet's overall syntax, followed by an
|
||||||
@@ -22743,6 +22757,8 @@ explanation of the packet's meaning. We include spaces in some of the
|
|||||||
templates for clarity; these are not part of the packet's syntax. No
|
templates for clarity; these are not part of the packet's syntax. No
|
||||||
@value{GDBN} packet uses spaces to separate its components.
|
@value{GDBN} packet uses spaces to separate its components.
|
||||||
|
|
||||||
|
Here are the currently defined query and set packets:
|
||||||
|
|
||||||
@table @samp
|
@table @samp
|
||||||
|
|
||||||
@item qC
|
@item qC
|
||||||
@@ -23016,6 +23032,10 @@ encoded). @value{GDBN} will continue to supply the values of symbols
|
|||||||
(if available), until the target ceases to request them.
|
(if available), until the target ceases to request them.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@item QTDP
|
||||||
|
@itemx QTFrame
|
||||||
|
@xref{Tracepoint Packets}.
|
||||||
|
|
||||||
@item qThreadExtraInfo,@var{id}
|
@item qThreadExtraInfo,@var{id}
|
||||||
@cindex thread attributes info, remote request
|
@cindex thread attributes info, remote request
|
||||||
@cindex @samp{qThreadExtraInfo} packet
|
@cindex @samp{qThreadExtraInfo} packet
|
||||||
@@ -23035,6 +23055,13 @@ comprising the printable string containing the extra information about
|
|||||||
the thread's attributes.
|
the thread's attributes.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@item QTStart
|
||||||
|
@itemx QTStop
|
||||||
|
@itemx QTinit
|
||||||
|
@itemx QTro
|
||||||
|
@itemx qTStatus
|
||||||
|
@xref{Tracepoint Packets}.
|
||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
@node Register Packet Format
|
@node Register Packet Format
|
||||||
@@ -23063,6 +23090,198 @@ as @code{MIPS32}.
|
|||||||
|
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
@node Tracepoint Packets
|
||||||
|
@section Tracepoint Packets
|
||||||
|
@cindex tracepoint packets
|
||||||
|
@cindex packets, tracepoint
|
||||||
|
|
||||||
|
Here we describe the packets @value{GDBN} uses to implement
|
||||||
|
tracepoints (@pxref{Tracepoints}).
|
||||||
|
|
||||||
|
@table @samp
|
||||||
|
|
||||||
|
@item QTDP:@var{n}:@var{addr}:@var{ena}:@var{step}:@var{pass}@r{[}-@r{]}
|
||||||
|
Create a new tracepoint, number @var{n}, at @var{addr}. If @var{ena}
|
||||||
|
is @samp{E}, then the tracepoint is enabled; if it is @samp{D}, then
|
||||||
|
the tracepoint is disabled. @var{step} is the tracepoint's step
|
||||||
|
count, and @var{pass} is its pass count. If the trailing @samp{-} is
|
||||||
|
present, further @samp{QTDP} packets will follow to specify this
|
||||||
|
tracepoint's actions.
|
||||||
|
|
||||||
|
Replies:
|
||||||
|
@table @samp
|
||||||
|
@item OK
|
||||||
|
The packet was understood and carried out.
|
||||||
|
@item
|
||||||
|
The packet was not recognized.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item QTDP:-@var{n}:@var{addr}:@r{[}S@r{]}@var{action}@dots{}@r{[}-@r{]}
|
||||||
|
Define actions to be taken when a tracepoint is hit. @var{n} and
|
||||||
|
@var{addr} must be the same as in the initial @samp{QTDP} packet for
|
||||||
|
this tracepoint. This packet may only be sent immediately after
|
||||||
|
another @samp{QTDP} packet that ended with a @samp{-}. If the
|
||||||
|
trailing @samp{-} is present, further @samp{QTDP} packets will follow,
|
||||||
|
specifying more actions for this tracepoint.
|
||||||
|
|
||||||
|
In the series of action packets for a given tracepoint, at most one
|
||||||
|
can have an @samp{S} before its first @var{action}. If such a packet
|
||||||
|
is sent, it and the following packets define ``while-stepping''
|
||||||
|
actions. Any prior packets define ordinary actions --- that is, those
|
||||||
|
taken when the tracepoint is first hit. If no action packet has an
|
||||||
|
@samp{S}, then all the packets in the series specify ordinary
|
||||||
|
tracepoint actions.
|
||||||
|
|
||||||
|
The @samp{@var{action}@dots{}} portion of the packet is a series of
|
||||||
|
actions, concatenated without separators. Each action has one of the
|
||||||
|
following forms:
|
||||||
|
|
||||||
|
@table @samp
|
||||||
|
|
||||||
|
@item R @var{mask}
|
||||||
|
Collect the registers whose bits are set in @var{mask}. @var{mask} is
|
||||||
|
a hexidecimal number whose @var{i}'th bit is set if register number
|
||||||
|
@var{i} should be collected. (The least significant bit is numbered
|
||||||
|
zero.) Note that @var{mask} may be any number of digits long; it may
|
||||||
|
not fit in a 32-bit word.
|
||||||
|
|
||||||
|
@item M @var{basereg},@var{offset},@var{len}
|
||||||
|
Collect @var{len} bytes of memory starting at the address in register
|
||||||
|
number @var{basereg}, plus @var{offset}. If @var{basereg} is
|
||||||
|
@samp{-1}, then the range has a fixed address: @var{offset} is the
|
||||||
|
address of the lowest byte to collect. The @var{basereg},
|
||||||
|
@var{offset}, and @var{len} parameters are all unsigned hexidecimal
|
||||||
|
values (the @samp{-1} value for @var{basereg} is a special case).
|
||||||
|
|
||||||
|
@item X @var{len},@var{expr}
|
||||||
|
Evaluate @var{expr}, whose length is @var{len}, and collect memory as
|
||||||
|
it directs. @var{expr} is an agent expression, as described in
|
||||||
|
@ref{Agent Expressions}. Each byte of the expression is encoded as a
|
||||||
|
two-digit hex number in the packet; @var{len} is the number of bytes
|
||||||
|
in the expression (and thus one-half the number of hex digits in the
|
||||||
|
packet).
|
||||||
|
|
||||||
|
@end table
|
||||||
|
|
||||||
|
Any number of actions may be packed together in a single @samp{QTDP}
|
||||||
|
packet, as long as the packet does not exceed the maximum packet
|
||||||
|
length (400 bytes, for many stubs).
|
||||||
|
|
||||||
|
Replies:
|
||||||
|
@table @samp
|
||||||
|
@item OK
|
||||||
|
The packet was understood and carried out.
|
||||||
|
@item
|
||||||
|
The packet was not recognized.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item QTFrame:@var{n}
|
||||||
|
Select the @var{n}'th tracepoint frame from the buffer, and use the
|
||||||
|
register and memory contents recorded there to answer subsequent
|
||||||
|
request packets from @value{GDBN}.
|
||||||
|
|
||||||
|
A successful reply from the stub indicates that the stub has found the
|
||||||
|
requested frame. The response is a series of parts, concatenated
|
||||||
|
without separators, describing the frame we selected. Each part has
|
||||||
|
one of the following forms:
|
||||||
|
|
||||||
|
@table @samp
|
||||||
|
@item F @var{f}
|
||||||
|
The selected frame is number @var{n} in the trace frame buffer;
|
||||||
|
@var{f} is a hexidecimal number. If @var{f} is @samp{-1}, then there
|
||||||
|
was no frame matching the criteria in the request packet.
|
||||||
|
|
||||||
|
@item T @var{t}
|
||||||
|
The selected trace frame records a hit of tracepoint number @var{t};
|
||||||
|
@var{t} is a hexidecimal number.
|
||||||
|
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@item QTFrame:pc:@var{addr}
|
||||||
|
Like @samp{QTFrame:@var{n}}, but select the first tracepoint frame after the
|
||||||
|
currently selected frame whose PC is @var{addr};
|
||||||
|
@var{addr} is a hexidecimal number.
|
||||||
|
|
||||||
|
@item QTFrame:tdp:@var{t}
|
||||||
|
Like @samp{QTFrame:@var{n}}, but select the first tracepoint frame after the
|
||||||
|
currently selected frame that is a hit of tracepoint @var{t}; @var{t}
|
||||||
|
is a hexidecimal number.
|
||||||
|
|
||||||
|
@item QTFrame:range:@var{start}:@var{end}
|
||||||
|
Like @samp{QTFrame:@var{n}}, but select the first tracepoint frame after the
|
||||||
|
currently selected frame whose PC is between @var{start} (inclusive)
|
||||||
|
and @var{end} (exclusive); @var{start} and @var{end} are hexidecimal
|
||||||
|
numbers.
|
||||||
|
|
||||||
|
@item QTFrame:outside:@var{start}:@var{end}
|
||||||
|
Like @samp{QTFrame:range:@var{start}:@var{end}}, but select the first
|
||||||
|
frame @emph{outside} the given range of addresses.
|
||||||
|
|
||||||
|
@item QTStart
|
||||||
|
Begin the tracepoint experiment. Begin collecting data from tracepoint
|
||||||
|
hits in the trace frame buffer.
|
||||||
|
|
||||||
|
@item QTStop
|
||||||
|
End the tracepoint experiment. Stop collecting trace frames.
|
||||||
|
|
||||||
|
@item QTinit
|
||||||
|
Clear the table of tracepoints, and empty the trace frame buffer.
|
||||||
|
|
||||||
|
@item QTro:@var{start1},@var{end1}:@var{start2},@var{end2}:@dots{}
|
||||||
|
Establish the given ranges of memory as ``transparent''. The stub
|
||||||
|
will answer requests for these ranges from memory's current contents,
|
||||||
|
if they were not collected as part of the tracepoint hit.
|
||||||
|
|
||||||
|
@value{GDBN} uses this to mark read-only regions of memory, like those
|
||||||
|
containing program code. Since these areas never change, they should
|
||||||
|
still have the same contents they did when the tracepoint was hit, so
|
||||||
|
there's no reason for the stub to refuse to provide their contents.
|
||||||
|
|
||||||
|
@item qTStatus
|
||||||
|
Ask the stub if there is a trace experiment running right now.
|
||||||
|
|
||||||
|
Replies:
|
||||||
|
@table @samp
|
||||||
|
@item T0
|
||||||
|
There is no trace experiment running.
|
||||||
|
@item T1
|
||||||
|
There is a trace experiment running.
|
||||||
|
@end table
|
||||||
|
|
||||||
|
@end table
|
||||||
|
|
||||||
|
|
||||||
|
@node Interrupts
|
||||||
|
@section Interrupts
|
||||||
|
@cindex interrupts (remote protocol)
|
||||||
|
|
||||||
|
When a program on the remote target is running, @value{GDBN} may
|
||||||
|
attempt to interrupt it by sending a @samp{Ctrl-C} or a @code{BREAK},
|
||||||
|
control of which is specified via @value{GDBN}'s @samp{remotebreak}
|
||||||
|
setting (@pxref{set remotebreak}).
|
||||||
|
|
||||||
|
The precise meaning of @code{BREAK} is defined by the transport
|
||||||
|
mechanism and may, in fact, be undefined. @value{GDBN} does
|
||||||
|
not currently define a @code{BREAK} mechanism for any of the network
|
||||||
|
interfaces.
|
||||||
|
|
||||||
|
@samp{Ctrl-C}, on the other hand, is defined and implemented for all
|
||||||
|
transport mechanisms. It is represented by sending the single byte
|
||||||
|
@code{0x03} without any of the usual packet overhead described in
|
||||||
|
the Overview section (@pxref{Overview}). When a @code{0x03} byte is
|
||||||
|
transmitted as part of a packet, it is considered to be packet data
|
||||||
|
and does @emph{not} represent an interrupt. E.g., an @samp{X} packet
|
||||||
|
(@pxref{X packet}, used for binary downloads, may include an unescaped
|
||||||
|
@code{0x03} as part of its packet.
|
||||||
|
|
||||||
|
Stubs are not required to recognize these interrupt mechanisms and the
|
||||||
|
precise meaning associated with receipt of the interrupt is
|
||||||
|
implementation defined. If the stub is successful at interrupting the
|
||||||
|
running program, it is expected that it will send one of the Stop
|
||||||
|
Reply Packets (@pxref{Stop Reply Packets}) to @value{GDBN} as a result
|
||||||
|
of successfully stopping the program. Interrupts received while the
|
||||||
|
program is stopped will be discarded.
|
||||||
|
|
||||||
@node Examples
|
@node Examples
|
||||||
@section Examples
|
@section Examples
|
||||||
|
|
||||||
|
|||||||
@@ -477,13 +477,30 @@ dwarf2_tracepoint_var_ref (struct symbol *symbol, struct agent_expr *ax,
|
|||||||
ax_const_l (ax, frame_offset);
|
ax_const_l (ax, frame_offset);
|
||||||
ax_simple (ax, aop_add);
|
ax_simple (ax, aop_add);
|
||||||
|
|
||||||
ax_const_l (ax, frame_offset);
|
value->kind = axs_lvalue_memory;
|
||||||
|
}
|
||||||
|
else if (data[0] >= DW_OP_breg0
|
||||||
|
&& data[0] <= DW_OP_breg31)
|
||||||
|
{
|
||||||
|
unsigned int reg;
|
||||||
|
LONGEST offset;
|
||||||
|
gdb_byte *buf_end;
|
||||||
|
|
||||||
|
reg = data[0] - DW_OP_breg0;
|
||||||
|
buf_end = read_sleb128 (data + 1, data + size, &offset);
|
||||||
|
if (buf_end != data + size)
|
||||||
|
error (_("Unexpected opcode after DW_OP_breg%u for symbol \"%s\"."),
|
||||||
|
reg, SYMBOL_PRINT_NAME (symbol));
|
||||||
|
|
||||||
|
ax_reg (ax, reg);
|
||||||
|
ax_const_l (ax, offset);
|
||||||
ax_simple (ax, aop_add);
|
ax_simple (ax, aop_add);
|
||||||
|
|
||||||
value->kind = axs_lvalue_memory;
|
value->kind = axs_lvalue_memory;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
error (_("Unsupported DWARF opcode in the location of \"%s\"."),
|
error (_("Unsupported DWARF opcode 0x%x in the location of \"%s\"."),
|
||||||
SYMBOL_PRINT_NAME (symbol));
|
data[0], SYMBOL_PRINT_NAME (symbol));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
|
/* Return the value of SYMBOL in FRAME using the DWARF-2 expression
|
||||||
|
|||||||
@@ -49,6 +49,26 @@
|
|||||||
#define IS_32BIT_TARGET(_gdbarch) \
|
#define IS_32BIT_TARGET(_gdbarch) \
|
||||||
((gdbarch_tdep (_gdbarch))->bytes_per_address == 4)
|
((gdbarch_tdep (_gdbarch))->bytes_per_address == 4)
|
||||||
|
|
||||||
|
/* Bit in the `ss_flag' member of `struct save_state' that indicates
|
||||||
|
that the 64-bit register values are live. From
|
||||||
|
<machine/save_state.h>. */
|
||||||
|
#define HPPA_HPUX_SS_WIDEREGS 0x40
|
||||||
|
|
||||||
|
/* Offsets of various parts of `struct save_state'. From
|
||||||
|
<machine/save_state.h>. */
|
||||||
|
#define HPPA_HPUX_SS_FLAGS_OFFSET 0
|
||||||
|
#define HPPA_HPUX_SS_NARROW_OFFSET 4
|
||||||
|
#define HPPA_HPUX_SS_FPBLOCK_OFFSET 256
|
||||||
|
#define HPPA_HPUX_SS_WIDE_OFFSET 640
|
||||||
|
|
||||||
|
/* The size of `struct save_state. */
|
||||||
|
#define HPPA_HPUX_SAVE_STATE_SIZE 1152
|
||||||
|
|
||||||
|
/* The size of `struct pa89_save_state', which corresponds to PA-RISC
|
||||||
|
1.1, the lowest common denominator that we support. */
|
||||||
|
#define HPPA_HPUX_PA89_SAVE_STATE_SIZE 512
|
||||||
|
|
||||||
|
|
||||||
/* Forward declarations. */
|
/* Forward declarations. */
|
||||||
extern void _initialize_hppa_hpux_tdep (void);
|
extern void _initialize_hppa_hpux_tdep (void);
|
||||||
extern initialize_file_ftype _initialize_hppa_hpux_tdep;
|
extern initialize_file_ftype _initialize_hppa_hpux_tdep;
|
||||||
@@ -1158,8 +1178,8 @@ hppa_hpux_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
|
|||||||
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
|
||||||
struct hppa_hpux_sigtramp_unwind_cache *info;
|
struct hppa_hpux_sigtramp_unwind_cache *info;
|
||||||
unsigned int flag;
|
unsigned int flag;
|
||||||
CORE_ADDR sp, scptr;
|
CORE_ADDR sp, scptr, off;
|
||||||
int i, incr, off, szoff;
|
int i, incr, szoff;
|
||||||
|
|
||||||
if (*this_cache)
|
if (*this_cache)
|
||||||
return *this_cache;
|
return *this_cache;
|
||||||
@@ -1170,25 +1190,29 @@ hppa_hpux_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
|
|||||||
|
|
||||||
sp = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM);
|
sp = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM);
|
||||||
|
|
||||||
scptr = sp - 1352;
|
if (IS_32BIT_TARGET (gdbarch))
|
||||||
|
scptr = sp - 1352;
|
||||||
|
else
|
||||||
|
scptr = sp - 1520;
|
||||||
|
|
||||||
off = scptr;
|
off = scptr;
|
||||||
|
|
||||||
/* See /usr/include/machine/save_state.h for the structure of the save_state_t
|
/* See /usr/include/machine/save_state.h for the structure of the save_state_t
|
||||||
structure. */
|
structure. */
|
||||||
|
|
||||||
flag = read_memory_unsigned_integer(scptr, 4);
|
flag = read_memory_unsigned_integer(scptr + HPPA_HPUX_SS_FLAGS_OFFSET, 4);
|
||||||
|
|
||||||
if (!(flag & 0x40))
|
if (!(flag & HPPA_HPUX_SS_WIDEREGS))
|
||||||
{
|
{
|
||||||
/* Narrow registers. */
|
/* Narrow registers. */
|
||||||
off = scptr + offsetof (save_state_t, ss_narrow);
|
off = scptr + HPPA_HPUX_SS_NARROW_OFFSET;
|
||||||
incr = 4;
|
incr = 4;
|
||||||
szoff = 0;
|
szoff = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Wide registers. */
|
/* Wide registers. */
|
||||||
off = scptr + offsetof (save_state_t, ss_wide) + 8;
|
off = scptr + HPPA_HPUX_SS_WIDE_OFFSET + 8;
|
||||||
incr = 8;
|
incr = 8;
|
||||||
szoff = (tdep->bytes_per_address == 4 ? 4 : 0);
|
szoff = (tdep->bytes_per_address == 4 ? 4 : 0);
|
||||||
}
|
}
|
||||||
@@ -1203,11 +1227,15 @@ hppa_hpux_sigtramp_frame_unwind_cache (struct frame_info *next_frame,
|
|||||||
{
|
{
|
||||||
if (hppa_hpux_tramp_reg[i] > 0)
|
if (hppa_hpux_tramp_reg[i] > 0)
|
||||||
info->saved_regs[hppa_hpux_tramp_reg[i]].addr = off + szoff;
|
info->saved_regs[hppa_hpux_tramp_reg[i]].addr = off + szoff;
|
||||||
|
|
||||||
off += incr;
|
off += incr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: fp regs */
|
/* TODO: fp regs */
|
||||||
|
|
||||||
|
info->saved_regs[HPPA_PCOQ_HEAD_REGNUM].addr =
|
||||||
|
info->saved_regs[HPPA_RP_REGNUM].addr;
|
||||||
|
|
||||||
info->base = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM);
|
info->base = frame_unwind_register_unsigned (next_frame, HPPA_SP_REGNUM);
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
@@ -1246,12 +1274,12 @@ static const struct frame_unwind hppa_hpux_sigtramp_frame_unwind = {
|
|||||||
static const struct frame_unwind *
|
static const struct frame_unwind *
|
||||||
hppa_hpux_sigtramp_unwind_sniffer (struct frame_info *next_frame)
|
hppa_hpux_sigtramp_unwind_sniffer (struct frame_info *next_frame)
|
||||||
{
|
{
|
||||||
|
struct unwind_table_entry *u;
|
||||||
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
CORE_ADDR pc = frame_pc_unwind (next_frame);
|
||||||
char *name;
|
|
||||||
|
|
||||||
find_pc_partial_function (pc, &name, NULL, NULL);
|
u = find_unwind_entry (pc);
|
||||||
|
|
||||||
if (name && strcmp(name, "_sigreturn") == 0)
|
if (u && u->HP_UX_interrupt_marker)
|
||||||
return &hppa_hpux_sigtramp_frame_unwind;
|
return &hppa_hpux_sigtramp_frame_unwind;
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1760,25 +1788,6 @@ hppa_hpux_push_dummy_code (struct gdbarch *gdbarch, CORE_ADDR sp,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Bit in the `ss_flag' member of `struct save_state' that indicates
|
|
||||||
that the 64-bit register values are live. From
|
|
||||||
<machine/save_state.h>. */
|
|
||||||
#define HPPA_HPUX_SS_WIDEREGS 0x40
|
|
||||||
|
|
||||||
/* Offsets of various parts of `struct save_state'. From
|
|
||||||
<machine/save_state.h>. */
|
|
||||||
#define HPPA_HPUX_SS_FLAGS_OFFSET 0
|
|
||||||
#define HPPA_HPUX_SS_NARROW_OFFSET 4
|
|
||||||
#define HPPA_HPUX_SS_FPBLOCK_OFFSET 256
|
|
||||||
#define HPPA_HPUX_SS_WIDE_OFFSET 640
|
|
||||||
|
|
||||||
/* The size of `struct save_state. */
|
|
||||||
#define HPPA_HPUX_SAVE_STATE_SIZE 1152
|
|
||||||
|
|
||||||
/* The size of `struct pa89_save_state', which corresponds to PA-RISC
|
|
||||||
1.1, the lowest common denominator that we support. */
|
|
||||||
#define HPPA_HPUX_PA89_SAVE_STATE_SIZE 512
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hppa_hpux_supply_ss_narrow (struct regcache *regcache,
|
hppa_hpux_supply_ss_narrow (struct regcache *regcache,
|
||||||
int regnum, const char *save_state)
|
int regnum, const char *save_state)
|
||||||
|
|||||||
@@ -1491,7 +1491,7 @@ restart:
|
|||||||
|
|
||||||
/* There are limited ways to store the return pointer into the
|
/* There are limited ways to store the return pointer into the
|
||||||
stack. */
|
stack. */
|
||||||
if (inst == 0x6bc23fd9 || inst == 0x0fc212c1)
|
if (inst == 0x6bc23fd9 || inst == 0x0fc212c1 || inst == 0x73c23fe1)
|
||||||
save_rp = 0;
|
save_rp = 0;
|
||||||
|
|
||||||
/* These are the only ways we save SP into the stack. At this time
|
/* These are the only ways we save SP into the stack. At this time
|
||||||
@@ -1846,7 +1846,8 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||||||
looking_for_rp = 0;
|
looking_for_rp = 0;
|
||||||
cache->saved_regs[HPPA_RP_REGNUM].addr = -24;
|
cache->saved_regs[HPPA_RP_REGNUM].addr = -24;
|
||||||
}
|
}
|
||||||
else if (inst == 0x0fc212c1) /* std rp,-0x10(sr0,sp) */
|
else if (inst == 0x0fc212c1
|
||||||
|
|| inst == 0x73c23fe1) /* std rp,-0x10(sr0,sp) */
|
||||||
{
|
{
|
||||||
looking_for_rp = 0;
|
looking_for_rp = 0;
|
||||||
cache->saved_regs[HPPA_RP_REGNUM].addr = -16;
|
cache->saved_regs[HPPA_RP_REGNUM].addr = -16;
|
||||||
@@ -1984,7 +1985,7 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||||||
cache->base = fp;
|
cache->base = fp;
|
||||||
|
|
||||||
if (hppa_debug)
|
if (hppa_debug)
|
||||||
fprintf_unfiltered (gdb_stdlog, " (base=0x%s) [frame pointer] }",
|
fprintf_unfiltered (gdb_stdlog, " (base=0x%s) [frame pointer]",
|
||||||
paddr_nz (cache->base));
|
paddr_nz (cache->base));
|
||||||
}
|
}
|
||||||
else if (u->Save_SP
|
else if (u->Save_SP
|
||||||
@@ -1996,7 +1997,7 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||||||
cache->base = read_memory_integer (this_sp, TARGET_PTR_BIT / 8);
|
cache->base = read_memory_integer (this_sp, TARGET_PTR_BIT / 8);
|
||||||
|
|
||||||
if (hppa_debug)
|
if (hppa_debug)
|
||||||
fprintf_unfiltered (gdb_stdlog, " (base=0x%s) [saved] }",
|
fprintf_unfiltered (gdb_stdlog, " (base=0x%s) [saved]",
|
||||||
paddr_nz (cache->base));
|
paddr_nz (cache->base));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -2005,7 +2006,7 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||||||
the SP back. */
|
the SP back. */
|
||||||
cache->base = this_sp - frame_size;
|
cache->base = this_sp - frame_size;
|
||||||
if (hppa_debug)
|
if (hppa_debug)
|
||||||
fprintf_unfiltered (gdb_stdlog, " (base=0x%s) [unwind adjust] } ",
|
fprintf_unfiltered (gdb_stdlog, " (base=0x%s) [unwind adjust]",
|
||||||
paddr_nz (cache->base));
|
paddr_nz (cache->base));
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2017,21 +2018,34 @@ hppa_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||||||
if (u->Millicode)
|
if (u->Millicode)
|
||||||
{
|
{
|
||||||
if (trad_frame_addr_p (cache->saved_regs, 31))
|
if (trad_frame_addr_p (cache->saved_regs, 31))
|
||||||
cache->saved_regs[HPPA_PCOQ_HEAD_REGNUM] = cache->saved_regs[31];
|
{
|
||||||
|
cache->saved_regs[HPPA_PCOQ_HEAD_REGNUM] = cache->saved_regs[31];
|
||||||
|
if (hppa_debug)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, " (pc=r31) [stack] } ");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ULONGEST r31 = frame_unwind_register_unsigned (next_frame, 31);
|
ULONGEST r31 = frame_unwind_register_unsigned (next_frame, 31);
|
||||||
trad_frame_set_value (cache->saved_regs, HPPA_PCOQ_HEAD_REGNUM, r31);
|
trad_frame_set_value (cache->saved_regs, HPPA_PCOQ_HEAD_REGNUM, r31);
|
||||||
|
if (hppa_debug)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, " (pc=r31) [frame] } ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (trad_frame_addr_p (cache->saved_regs, HPPA_RP_REGNUM))
|
if (trad_frame_addr_p (cache->saved_regs, HPPA_RP_REGNUM))
|
||||||
cache->saved_regs[HPPA_PCOQ_HEAD_REGNUM] = cache->saved_regs[HPPA_RP_REGNUM];
|
{
|
||||||
|
cache->saved_regs[HPPA_PCOQ_HEAD_REGNUM] =
|
||||||
|
cache->saved_regs[HPPA_RP_REGNUM];
|
||||||
|
if (hppa_debug)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, " (pc=rp) [stack] } ");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ULONGEST rp = frame_unwind_register_unsigned (next_frame, HPPA_RP_REGNUM);
|
ULONGEST rp = frame_unwind_register_unsigned (next_frame, HPPA_RP_REGNUM);
|
||||||
trad_frame_set_value (cache->saved_regs, HPPA_PCOQ_HEAD_REGNUM, rp);
|
trad_frame_set_value (cache->saved_regs, HPPA_PCOQ_HEAD_REGNUM, rp);
|
||||||
|
if (hppa_debug)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, " (pc=rp) [frame] } ");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2174,7 +2188,8 @@ hppa_fallback_frame_cache (struct frame_info *next_frame, void **this_cache)
|
|||||||
cache->saved_regs[HPPA_RP_REGNUM].addr = -20;
|
cache->saved_regs[HPPA_RP_REGNUM].addr = -20;
|
||||||
found_rp = 1;
|
found_rp = 1;
|
||||||
}
|
}
|
||||||
else if (insn == 0x0fc212c1) /* std rp,-0x10(sr0,sp) */
|
else if (insn == 0x0fc212c1
|
||||||
|
|| insn == 0x73c23fe1) /* std rp,-0x10(sr0,sp) */
|
||||||
{
|
{
|
||||||
cache->saved_regs[HPPA_RP_REGNUM].addr = -16;
|
cache->saved_regs[HPPA_RP_REGNUM].addr = -16;
|
||||||
found_rp = 1;
|
found_rp = 1;
|
||||||
|
|||||||
@@ -462,8 +462,12 @@ inf_ptrace_xfer_partial (struct target_ops *ops, enum target_object object,
|
|||||||
struct ptrace_io_desc piod;
|
struct ptrace_io_desc piod;
|
||||||
|
|
||||||
/* NOTE: We assume that there are no distinct address spaces
|
/* NOTE: We assume that there are no distinct address spaces
|
||||||
for instruction and data. */
|
for instruction and data. However, on OpenBSD 3.9 and
|
||||||
piod.piod_op = writebuf ? PIOD_WRITE_D : PIOD_READ_D;
|
later, PIOD_WRITE_D doesn't allow changing memory that's
|
||||||
|
mapped read-only. Since most code segments will be
|
||||||
|
read-only, using PIOD_WRITE_D will prevent us from
|
||||||
|
inserting breakpoints, so we use PIOD_WRITE_I instead. */
|
||||||
|
piod.piod_op = writebuf ? PIOD_WRITE_I : PIOD_READ_D;
|
||||||
piod.piod_addr = writebuf ? (void *) writebuf : readbuf;
|
piod.piod_addr = writebuf ? (void *) writebuf : readbuf;
|
||||||
piod.piod_offs = (void *) (long) offset;
|
piod.piod_offs = (void *) (long) offset;
|
||||||
piod.piod_len = len;
|
piod.piod_len = len;
|
||||||
|
|||||||
157
gdb/mi/gdb-mi.el
157
gdb/mi/gdb-mi.el
@@ -58,6 +58,7 @@
|
|||||||
(require 'gud)
|
(require 'gud)
|
||||||
(require 'gdb-ui)
|
(require 'gdb-ui)
|
||||||
|
|
||||||
|
(defvar gdb-source-file-list nil)
|
||||||
(defvar gdb-register-names nil "List of register names.")
|
(defvar gdb-register-names nil "List of register names.")
|
||||||
(defvar gdb-changed-registers nil
|
(defvar gdb-changed-registers nil
|
||||||
"List of changed register numbers (strings).")
|
"List of changed register numbers (strings).")
|
||||||
@@ -81,7 +82,7 @@ given in relevant buffer.
|
|||||||
|
|
||||||
Watch expressions appear in the speedbar/slowbar.
|
Watch expressions appear in the speedbar/slowbar.
|
||||||
|
|
||||||
The following interactive lisp functions help control operation :
|
The following commands help control operation :
|
||||||
|
|
||||||
`gdb-many-windows' - Toggle the number of windows gdb uses.
|
`gdb-many-windows' - Toggle the number of windows gdb uses.
|
||||||
`gdb-restore-windows' - To restore the window layout.
|
`gdb-restore-windows' - To restore the window layout.
|
||||||
@@ -90,29 +91,28 @@ See Info node `(emacs)GDB Graphical Interface' for a more
|
|||||||
detailed description of this mode.
|
detailed description of this mode.
|
||||||
|
|
||||||
|
|
||||||
---------------------------------------------------------------------
|
+--------------------------------------------------------------+
|
||||||
GDB Toolbar
|
| GDB Toolbar |
|
||||||
---------------------------------------------------------------------
|
+-------------------------------+------------------------------+
|
||||||
GUD buffer (I/O of GDB) | Locals buffer
|
| GUD buffer (I/O of GDB) | Locals buffer |
|
||||||
|
|
| | |
|
||||||
|
|
| | |
|
||||||
|
|
| | |
|
||||||
---------------------------------------------------------------------
|
+-------------------------------+------------------------------+
|
||||||
Source buffer | Input/Output (of inferior) buffer
|
| Source buffer |
|
||||||
| (comint-mode)
|
| |
|
||||||
|
|
| |
|
||||||
|
|
| |
|
||||||
|
|
| |
|
||||||
|
|
| |
|
||||||
|
|
| |
|
||||||
|
|
| |
|
||||||
---------------------------------------------------------------------
|
+-------------------------------+------------------------------+
|
||||||
Stack buffer | Breakpoints buffer
|
| Stack buffer | Breakpoints buffer |
|
||||||
RET gdb-frames-select | SPC gdb-toggle-breakpoint
|
| RET gdb-frames-select | SPC gdb-toggle-breakpoint |
|
||||||
| RET gdb-goto-breakpoint
|
| | RET gdb-goto-breakpoint |
|
||||||
| d gdb-delete-breakpoint
|
| | d gdb-delete-breakpoint |
|
||||||
---------------------------------------------------------------------
|
+-------------------------------+------------------------------+"
|
||||||
"
|
|
||||||
;;
|
;;
|
||||||
(interactive (list (gud-query-cmdline 'gdbmi)))
|
(interactive (list (gud-query-cmdline 'gdbmi)))
|
||||||
;;
|
;;
|
||||||
@@ -162,8 +162,14 @@ GUD buffer (I/O of GDB) | Locals buffer
|
|||||||
'gdb-mouse-set-clear-breakpoint)
|
'gdb-mouse-set-clear-breakpoint)
|
||||||
(define-key gud-minor-mode-map [left-fringe mouse-1]
|
(define-key gud-minor-mode-map [left-fringe mouse-1]
|
||||||
'gdb-mouse-set-clear-breakpoint)
|
'gdb-mouse-set-clear-breakpoint)
|
||||||
|
(define-key gud-minor-mode-map [left-fringe mouse-2]
|
||||||
|
'gdb-mouse-until)
|
||||||
|
(define-key gud-minor-mode-map [left-fringe drag-mouse-1]
|
||||||
|
'gdb-mouse-until)
|
||||||
(define-key gud-minor-mode-map [left-margin mouse-3]
|
(define-key gud-minor-mode-map [left-margin mouse-3]
|
||||||
'gdb-mouse-toggle-breakpoint)
|
'gdb-mouse-toggle-breakpoint-margin)
|
||||||
|
(define-key gud-minor-mode-map [left-fringe mouse-3]
|
||||||
|
'gdb-mouse-toggle-breakpoint-fringe)
|
||||||
|
|
||||||
(setq comint-input-sender 'gdbmi-send)
|
(setq comint-input-sender 'gdbmi-send)
|
||||||
;;
|
;;
|
||||||
@@ -223,8 +229,8 @@ GUD buffer (I/O of GDB) | Locals buffer
|
|||||||
`(lambda () (gdbmi-var-list-children-handler ,varnum)))))
|
`(lambda () (gdbmi-var-list-children-handler ,varnum)))))
|
||||||
|
|
||||||
(defconst gdbmi-var-list-children-regexp
|
(defconst gdbmi-var-list-children-regexp
|
||||||
"name=\"\\(.*?\\)\",exp=\"\\(.*?\\)\",numchild=\"\\(.*?\\)\",\
|
"name=\"\\(.+?\\)\",exp=\"\\(.+?\\)\",numchild=\"\\(.+?\\)\",\
|
||||||
value=\"\\(.*?\\)\"")
|
value=\\(\".*?\"\\),type=\"\\(.+?\\)\"}")
|
||||||
|
|
||||||
(defun gdbmi-var-list-children-handler (varnum)
|
(defun gdbmi-var-list-children-handler (varnum)
|
||||||
(with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer)
|
(with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer)
|
||||||
@@ -239,11 +245,9 @@ value=\"\\(.*?\\)\"")
|
|||||||
(let ((varchild (list (match-string 2)
|
(let ((varchild (list (match-string 2)
|
||||||
(match-string 1)
|
(match-string 1)
|
||||||
(match-string 3)
|
(match-string 3)
|
||||||
nil
|
(match-string 5)
|
||||||
(match-string 4)
|
(read (match-string 4))
|
||||||
nil)))
|
nil)))
|
||||||
(if (looking-at ",type=\"\\(.*?\\)\"")
|
|
||||||
(setcar (nthcdr 3 varchild) (match-string 1)))
|
|
||||||
(dolist (var1 gdb-var-list)
|
(dolist (var1 gdb-var-list)
|
||||||
(if (string-equal (cadr var1) (cadr varchild))
|
(if (string-equal (cadr var1) (cadr varchild))
|
||||||
(throw 'child-already-watched nil)))
|
(throw 'child-already-watched nil)))
|
||||||
@@ -257,24 +261,26 @@ value=\"\\(.*?\\)\"")
|
|||||||
(gdb-enqueue-input
|
(gdb-enqueue-input
|
||||||
(list "-var-update --all-values *\n" 'gdbmi-var-update-handler)))
|
(list "-var-update --all-values *\n" 'gdbmi-var-update-handler)))
|
||||||
|
|
||||||
(defconst gdbmi-var-update-regexp "name=\"\\(.*?\\)\",value=\"\\(.*?\\)\"")
|
(defconst gdbmi-var-update-regexp "name=\"\\(.*?\\)\",value=\\(\".*\"\\),")
|
||||||
|
|
||||||
(defun gdbmi-var-update-handler ()
|
(defun gdbmi-var-update-handler ()
|
||||||
(with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer)
|
(with-current-buffer (gdb-get-create-buffer 'gdb-partial-output-buffer)
|
||||||
(goto-char (point-min))
|
(goto-char (point-min))
|
||||||
(while (re-search-forward gdbmi-var-update-regexp nil t)
|
(while (re-search-forward gdbmi-var-update-regexp nil t)
|
||||||
(let ((varnum (match-string 1)))
|
(let ((varnum (match-string 1)))
|
||||||
(catch 'var-found1
|
(catch 'var-found-1
|
||||||
(let ((num 0))
|
(let ((num 0))
|
||||||
(dolist (var gdb-var-list)
|
(dolist (var gdb-var-list)
|
||||||
(if (string-equal varnum (cadr var))
|
(if (string-equal varnum (cadr var))
|
||||||
(progn
|
(progn
|
||||||
(setcar (nthcdr 5 var) t)
|
(setcar (nthcdr 5 var) t)
|
||||||
(setcar (nthcdr 4 var) (match-string 2))
|
(setcar (nthcdr 4 var) (read (match-string 2)))
|
||||||
(setcar (nthcdr num gdb-var-list) var)
|
(setcar (nthcdr num gdb-var-list) var)
|
||||||
(throw 'var-found1 nil)))
|
(throw 'var-found-1 nil)))
|
||||||
(setq num (+ num 1))))))
|
(setq num (+ num 1))))))
|
||||||
(setq gdb-var-changed t))))
|
(setq gdb-var-changed t)))
|
||||||
|
(with-current-buffer gud-comint-buffer
|
||||||
|
(speedbar-timer-fn)))
|
||||||
|
|
||||||
(defun gdbmi-send (proc string)
|
(defun gdbmi-send (proc string)
|
||||||
"A comint send filter for gdb."
|
"A comint send filter for gdb."
|
||||||
@@ -454,23 +460,10 @@ value=\"\\(.*?\\)\"")
|
|||||||
|
|
||||||
;; Breakpoint buffer : This displays the output of `-break-list'.
|
;; Breakpoint buffer : This displays the output of `-break-list'.
|
||||||
;;
|
;;
|
||||||
(def-gdb-auto-updated-buffer gdb-breakpoints-buffer
|
(def-gdb-auto-update-trigger gdbmi-invalidate-breakpoints
|
||||||
;; This defines the auto update rule for buffers of type
|
(gdb-get-buffer 'gdb-breakpoints-buffer)
|
||||||
;; `gdb-breakpoints-buffer'.
|
|
||||||
;;
|
|
||||||
;; It defines a function that queues the command below. That function is
|
|
||||||
;; called:
|
|
||||||
gdbmi-invalidate-breakpoints
|
|
||||||
;;
|
|
||||||
;; To update the buffer, this command is sent to gdb.
|
|
||||||
"-break-list\n"
|
"-break-list\n"
|
||||||
;;
|
gdb-break-list-handler)
|
||||||
;; This also defines a function to be the handler for the output
|
|
||||||
;; from the command above. That function will copy the output into
|
|
||||||
;; the appropriately typed buffer. That function will be called:
|
|
||||||
gdb-break-list-handler
|
|
||||||
;; buffer specific functions
|
|
||||||
gdb-break-list-custom)
|
|
||||||
|
|
||||||
(defconst gdb-break-list-regexp
|
(defconst gdb-break-list-regexp
|
||||||
"number=\"\\(.*?\\)\",type=\"\\(.*?\\)\",disp=\"\\(.*?\\)\",enabled=\"\\(.\\)\",\
|
"number=\"\\(.*?\\)\",type=\"\\(.*?\\)\",disp=\"\\(.*?\\)\",enabled=\"\\(.\\)\",\
|
||||||
@@ -560,6 +553,8 @@ addr=\"\\(.*?\\)\",func=\"\\(.*?\\)\",file=\"\\(.*?\\)\",line=\"\\(.*?\\)\"")
|
|||||||
(end-of-line)))
|
(end-of-line)))
|
||||||
(if (gdb-get-buffer 'gdb-assembler-buffer) (gdb-assembler-custom)))
|
(if (gdb-get-buffer 'gdb-assembler-buffer) (gdb-assembler-custom)))
|
||||||
|
|
||||||
|
(defvar gdb-source-file-regexp "fullname=\"\\(.*?\\)\"")
|
||||||
|
|
||||||
(defun gdbmi-get-location (bptno line flag)
|
(defun gdbmi-get-location (bptno line flag)
|
||||||
"Find the directory containing the relevant source file.
|
"Find the directory containing the relevant source file.
|
||||||
Put in buffer and place breakpoint icon."
|
Put in buffer and place breakpoint icon."
|
||||||
@@ -586,11 +581,11 @@ Add directory to search path for source files using the GDB command, dir."))
|
|||||||
|
|
||||||
;; Frames buffer. This displays a perpetually correct bactrack trace.
|
;; Frames buffer. This displays a perpetually correct bactrack trace.
|
||||||
;;
|
;;
|
||||||
(def-gdb-auto-updated-buffer gdb-stack-buffer
|
(def-gdb-auto-update-trigger gdbmi-invalidate-frames
|
||||||
gdbmi-invalidate-frames
|
(gdb-get-buffer 'gdb-stack-buffer)
|
||||||
"-stack-list-frames\n"
|
"-stack-list-frames\n"
|
||||||
gdb-stack-list-frames-handler
|
gdb-stack-list-frames-handler)
|
||||||
gdb-stack-list-frames-custom)
|
|
||||||
|
|
||||||
(defconst gdb-stack-list-frames-regexp
|
(defconst gdb-stack-list-frames-regexp
|
||||||
"level=\"\\(.*?\\)\",addr=\"\\(.*?\\)\",func=\"\\(.*?\\)\",\
|
"level=\"\\(.*?\\)\",addr=\"\\(.*?\\)\",func=\"\\(.*?\\)\",\
|
||||||
@@ -644,11 +639,10 @@ file=\".*?\",fullname=\"\\(.*?\\)\",line=\"\\(.*?\\)\"")
|
|||||||
|
|
||||||
;; Locals buffer.
|
;; Locals buffer.
|
||||||
;; uses "-stack-list-locals --simple-values". Needs GDB 6.1 onwards.
|
;; uses "-stack-list-locals --simple-values". Needs GDB 6.1 onwards.
|
||||||
(def-gdb-auto-updated-buffer gdb-locals-buffer
|
(def-gdb-auto-update-trigger gdbmi-invalidate-locals
|
||||||
gdbmi-invalidate-locals
|
(gdb-get-buffer 'gdb-locals-buffer)
|
||||||
"-stack-list-locals --simple-values\n"
|
"-stack-list-locals --simple-values\n"
|
||||||
gdb-stack-list-locals-handler
|
gdb-stack-list-locals-handler)
|
||||||
gdb-stack-list-locals-custom)
|
|
||||||
|
|
||||||
(defconst gdb-stack-list-locals-regexp
|
(defconst gdb-stack-list-locals-regexp
|
||||||
(concat "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\""))
|
(concat "name=\"\\(.*?\\)\",type=\"\\(.*?\\)\""))
|
||||||
@@ -666,12 +660,13 @@ file=\".*?\",fullname=\"\\(.*?\\)\",line=\"\\(.*?\\)\"")
|
|||||||
(let ((local (list (match-string 1)
|
(let ((local (list (match-string 1)
|
||||||
(match-string 2)
|
(match-string 2)
|
||||||
nil)))
|
nil)))
|
||||||
(if (looking-at ",value=\"\\(.*?\\)\"")
|
(if (looking-at ",value=\\(\".*\"\\)}")
|
||||||
(setcar (nthcdr 2 local) (match-string 1)))
|
(setcar (nthcdr 2 local) (read (match-string 1))))
|
||||||
(push local locals-list))))
|
(push local locals-list))))
|
||||||
(let ((buf (gdb-get-buffer 'gdb-locals-buffer)))
|
(let ((buf (gdb-get-buffer 'gdb-locals-buffer)))
|
||||||
(and buf (with-current-buffer buf
|
(and buf (with-current-buffer buf
|
||||||
(let ((p (window-point (get-buffer-window buf 0)))
|
(let* ((window (get-buffer-window buf 0))
|
||||||
|
(p (window-point window))
|
||||||
(buffer-read-only nil))
|
(buffer-read-only nil))
|
||||||
(erase-buffer)
|
(erase-buffer)
|
||||||
(dolist (local locals-list)
|
(dolist (local locals-list)
|
||||||
@@ -682,19 +677,15 @@ file=\".*?\",fullname=\"\\(.*?\\)\",line=\"\\(.*?\\)\"")
|
|||||||
"(structure)"
|
"(structure)"
|
||||||
"(array)"))
|
"(array)"))
|
||||||
"\n")))
|
"\n")))
|
||||||
(set-window-point (get-buffer-window buf 0) p)))))))
|
(set-window-point window p)))))))
|
||||||
|
|
||||||
(defun gdb-stack-list-locals-custom ()
|
|
||||||
nil)
|
|
||||||
|
|
||||||
|
|
||||||
;; Registers buffer.
|
;; Registers buffer.
|
||||||
;;
|
;;
|
||||||
(def-gdb-auto-updated-buffer gdb-registers-buffer
|
(def-gdb-auto-update-trigger gdbmi-invalidate-registers
|
||||||
gdbmi-invalidate-registers
|
(gdb-get-buffer 'gdb-registers-buffer)
|
||||||
"-data-list-register-values x\n"
|
"-data-list-register-values x\n"
|
||||||
gdb-data-list-register-values-handler
|
gdb-data-list-register-values-handler)
|
||||||
gdb-data-list-register-values-custom)
|
|
||||||
|
|
||||||
(defconst gdb-data-list-register-values-regexp
|
(defconst gdb-data-list-register-values-regexp
|
||||||
"number=\"\\(.*?\\)\",value=\"\\(.*?\\)\"")
|
"number=\"\\(.*?\\)\",value=\"\\(.*?\\)\"")
|
||||||
@@ -731,9 +722,21 @@ file=\".*?\",fullname=\"\\(.*?\\)\",line=\"\\(.*?\\)\"")
|
|||||||
(buffer-read-only nil))
|
(buffer-read-only nil))
|
||||||
(erase-buffer)
|
(erase-buffer)
|
||||||
(insert register-values)
|
(insert register-values)
|
||||||
(set-window-point (get-buffer-window buf 0) p))))))))
|
(set-window-point (get-buffer-window buf 0) p)))))))
|
||||||
|
(gdb-data-list-register-values-custom))
|
||||||
|
|
||||||
(defun gdb-data-list-register-values-custom ())
|
(defun gdb-data-list-register-values-custom ()
|
||||||
|
(with-current-buffer (gdb-get-buffer 'gdb-registers-buffer)
|
||||||
|
(save-excursion
|
||||||
|
(let ((buffer-read-only nil)
|
||||||
|
bl)
|
||||||
|
(goto-char (point-min))
|
||||||
|
(while (< (point) (point-max))
|
||||||
|
(setq bl (line-beginning-position))
|
||||||
|
(when (looking-at "^[^\t]+")
|
||||||
|
(put-text-property bl (match-end 0)
|
||||||
|
'face font-lock-variable-name-face))
|
||||||
|
(forward-line 1))))))
|
||||||
|
|
||||||
(defun gdb-get-changed-registers ()
|
(defun gdb-get-changed-registers ()
|
||||||
(if (and (gdb-get-buffer 'gdb-registers-buffer)
|
(if (and (gdb-get-buffer 'gdb-registers-buffer)
|
||||||
@@ -745,6 +748,8 @@ file=\".*?\",fullname=\"\\(.*?\\)\",line=\"\\(.*?\\)\"")
|
|||||||
'gdb-get-changed-registers-handler))
|
'gdb-get-changed-registers-handler))
|
||||||
(push 'gdb-get-changed-registers gdb-pending-triggers))))
|
(push 'gdb-get-changed-registers gdb-pending-triggers))))
|
||||||
|
|
||||||
|
(defconst gdb-data-list-register-names-regexp "\"\\(.*?\\)\"")
|
||||||
|
|
||||||
(defun gdb-get-changed-registers-handler ()
|
(defun gdb-get-changed-registers-handler ()
|
||||||
(setq gdb-pending-triggers
|
(setq gdb-pending-triggers
|
||||||
(delq 'gdb-get-changed-registers gdb-pending-triggers))
|
(delq 'gdb-get-changed-registers gdb-pending-triggers))
|
||||||
@@ -754,9 +759,6 @@ file=\".*?\",fullname=\"\\(.*?\\)\",line=\"\\(.*?\\)\"")
|
|||||||
(while (re-search-forward gdb-data-list-register-names-regexp nil t)
|
(while (re-search-forward gdb-data-list-register-names-regexp nil t)
|
||||||
(push (match-string 1) gdb-changed-registers))))
|
(push (match-string 1) gdb-changed-registers))))
|
||||||
|
|
||||||
|
|
||||||
(defconst gdb-data-list-register-names-regexp "\"\\(.*?\\)\"")
|
|
||||||
|
|
||||||
(defun gdb-get-register-names ()
|
(defun gdb-get-register-names ()
|
||||||
"Create a list of register names."
|
"Create a list of register names."
|
||||||
(goto-char (point-min))
|
(goto-char (point-min))
|
||||||
@@ -767,9 +769,6 @@ file=\".*?\",fullname=\"\\(.*?\\)\",line=\"\\(.*?\\)\"")
|
|||||||
;; these functions/variables may go into gdb-ui.el in the near future
|
;; these functions/variables may go into gdb-ui.el in the near future
|
||||||
;; (from gdb-nui.el)
|
;; (from gdb-nui.el)
|
||||||
|
|
||||||
(defvar gdb-source-file-list nil)
|
|
||||||
(defvar gdb-source-file-regexp "fullname=\"\\(.*?\\)\"")
|
|
||||||
|
|
||||||
(defun gdb-get-source-file ()
|
(defun gdb-get-source-file ()
|
||||||
"Find the source file where the program starts and display it with related
|
"Find the source file where the program starts and display it with related
|
||||||
buffers, if required."
|
buffers, if required."
|
||||||
|
|||||||
@@ -1365,9 +1365,18 @@ mi_load_progress (const char *section_name,
|
|||||||
static struct timeval last_update;
|
static struct timeval last_update;
|
||||||
static char *previous_sect_name = NULL;
|
static char *previous_sect_name = NULL;
|
||||||
int new_section;
|
int new_section;
|
||||||
|
struct ui_out *saved_uiout;
|
||||||
|
|
||||||
if (!current_interp_named_p (INTERP_MI)
|
/* This function is called through deprecated_show_load_progress
|
||||||
&& !current_interp_named_p (INTERP_MI1))
|
which means uiout may not be correct. Fix it for the duration
|
||||||
|
of this function. */
|
||||||
|
saved_uiout = uiout;
|
||||||
|
|
||||||
|
if (current_interp_named_p (INTERP_MI))
|
||||||
|
uiout = mi_out_new (2);
|
||||||
|
else if (current_interp_named_p (INTERP_MI1))
|
||||||
|
uiout = mi_out_new (1);
|
||||||
|
else
|
||||||
return;
|
return;
|
||||||
|
|
||||||
update_threshold.tv_sec = 0;
|
update_threshold.tv_sec = 0;
|
||||||
@@ -1424,6 +1433,9 @@ mi_load_progress (const char *section_name,
|
|||||||
fputs_unfiltered ("\n", raw_stdout);
|
fputs_unfiltered ("\n", raw_stdout);
|
||||||
gdb_flush (raw_stdout);
|
gdb_flush (raw_stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
xfree (uiout);
|
||||||
|
uiout = saved_uiout;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -1069,9 +1069,14 @@ make_cleanup_free_actions (struct tracepoint *t)
|
|||||||
return make_cleanup (do_free_actions_cleanup, t);
|
return make_cleanup (do_free_actions_cleanup, t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum {
|
||||||
|
memrange_absolute = -1
|
||||||
|
};
|
||||||
|
|
||||||
struct memrange
|
struct memrange
|
||||||
{
|
{
|
||||||
int type; /* 0 for absolute memory range, else basereg number */
|
int type; /* memrange_absolute for absolute memory range,
|
||||||
|
else basereg number */
|
||||||
bfd_signed_vma start;
|
bfd_signed_vma start;
|
||||||
bfd_signed_vma end;
|
bfd_signed_vma end;
|
||||||
};
|
};
|
||||||
@@ -1103,7 +1108,7 @@ memrange_cmp (const void *va, const void *vb)
|
|||||||
return -1;
|
return -1;
|
||||||
if (a->type > b->type)
|
if (a->type > b->type)
|
||||||
return 1;
|
return 1;
|
||||||
if (a->type == 0)
|
if (a->type == memrange_absolute)
|
||||||
{
|
{
|
||||||
if ((bfd_vma) a->start < (bfd_vma) b->start)
|
if ((bfd_vma) a->start < (bfd_vma) b->start)
|
||||||
return -1;
|
return -1;
|
||||||
@@ -1175,7 +1180,7 @@ add_memrange (struct collection_list *memranges,
|
|||||||
printf_filtered (",%ld)\n", len);
|
printf_filtered (",%ld)\n", len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* type: -1 == memory, n == basereg */
|
/* type: memrange_absolute == memory, other n == basereg */
|
||||||
memranges->list[memranges->next_memrange].type = type;
|
memranges->list[memranges->next_memrange].type = type;
|
||||||
/* base: addr if memory, offset if reg relative. */
|
/* base: addr if memory, offset if reg relative. */
|
||||||
memranges->list[memranges->next_memrange].start = base;
|
memranges->list[memranges->next_memrange].start = base;
|
||||||
@@ -1189,7 +1194,7 @@ add_memrange (struct collection_list *memranges,
|
|||||||
memranges->listsize);
|
memranges->listsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type != -1) /* Better collect the base register! */
|
if (type != memrange_absolute) /* Better collect the base register! */
|
||||||
add_register (memranges, type);
|
add_register (memranges, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1226,7 +1231,7 @@ collect_symbol (struct collection_list *collect,
|
|||||||
DEPRECATED_SYMBOL_NAME (sym), len,
|
DEPRECATED_SYMBOL_NAME (sym), len,
|
||||||
tmp /* address */);
|
tmp /* address */);
|
||||||
}
|
}
|
||||||
add_memrange (collect, -1, offset, len); /* 0 == memory */
|
add_memrange (collect, memrange_absolute, offset, len);
|
||||||
break;
|
break;
|
||||||
case LOC_REGISTER:
|
case LOC_REGISTER:
|
||||||
case LOC_REGPARM:
|
case LOC_REGPARM:
|
||||||
@@ -1437,10 +1442,18 @@ stringify_collection_list (struct collection_list *list, char *string)
|
|||||||
end = temp_buf;
|
end = temp_buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf (end, "M%X,%s,%lX",
|
{
|
||||||
list->list[i].type,
|
bfd_signed_vma length = list->list[i].end - list->list[i].start;
|
||||||
tmp2,
|
|
||||||
(long) (list->list[i].end - list->list[i].start));
|
/* The "%X" conversion specifier expects an unsigned argument,
|
||||||
|
so passing -1 (memrange_absolute) to it directly gives you
|
||||||
|
"FFFFFFFF" (or more, depending on sizeof (unsigned)).
|
||||||
|
Special-case it. */
|
||||||
|
if (list->list[i].type == memrange_absolute)
|
||||||
|
sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
|
||||||
|
else
|
||||||
|
sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
|
||||||
|
}
|
||||||
|
|
||||||
count += strlen (end);
|
count += strlen (end);
|
||||||
end = temp_buf + count;
|
end = temp_buf + count;
|
||||||
@@ -1598,7 +1611,7 @@ encode_actions (struct tracepoint *t, char ***tdp_actions,
|
|||||||
tempval = evaluate_expression (exp);
|
tempval = evaluate_expression (exp);
|
||||||
addr = VALUE_ADDRESS (tempval) + value_offset (tempval);
|
addr = VALUE_ADDRESS (tempval) + value_offset (tempval);
|
||||||
len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
|
len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
|
||||||
add_memrange (collect, -1, addr, len);
|
add_memrange (collect, memrange_absolute, addr, len);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OP_VAR_VALUE:
|
case OP_VAR_VALUE:
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
6.3.50.20051117-cvs
|
6.4.50.20051121-cvs
|
||||||
|
|||||||
1106
intl/ChangeLog
Normal file
1106
intl/ChangeLog
Normal file
File diff suppressed because it is too large
Load Diff
214
intl/Makefile.in
Normal file
214
intl/Makefile.in
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
# Makefile for directory with message catalog handling in GNU NLS Utilities.
|
||||||
|
# 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
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
PACKAGE = @PACKAGE@
|
||||||
|
VERSION = @VERSION@
|
||||||
|
|
||||||
|
SHELL = /bin/sh
|
||||||
|
|
||||||
|
srcdir = @srcdir@
|
||||||
|
top_srcdir = @top_srcdir@
|
||||||
|
top_builddir = ..
|
||||||
|
VPATH = @srcdir@
|
||||||
|
|
||||||
|
prefix = @prefix@
|
||||||
|
exec_prefix = @exec_prefix@
|
||||||
|
transform = @program_transform_name@
|
||||||
|
libdir = $(exec_prefix)/lib
|
||||||
|
includedir = $(prefix)/include
|
||||||
|
datadir = $(prefix)/@DATADIRNAME@
|
||||||
|
localedir = $(datadir)/locale
|
||||||
|
gnulocaledir = $(datadir)/locale
|
||||||
|
gettextsrcdir = @datadir@/gettext/intl
|
||||||
|
aliaspath = $(localedir):.
|
||||||
|
subdir = intl
|
||||||
|
|
||||||
|
INSTALL = @INSTALL@
|
||||||
|
INSTALL_DATA = @INSTALL_DATA@
|
||||||
|
MKINSTALLDIRS = @MKINSTALLDIRS@
|
||||||
|
|
||||||
|
l = @l@
|
||||||
|
|
||||||
|
AR = ar
|
||||||
|
CC = @CC@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
|
||||||
|
DEFS = -DLOCALEDIR=\"$(localedir)\" -DGNULOCALEDIR=\"$(gnulocaledir)\" \
|
||||||
|
-DLOCALE_ALIAS_PATH=\"$(aliaspath)\" @DEFS@
|
||||||
|
CPPFLAGS = @CPPFLAGS@
|
||||||
|
CFLAGS = @CFLAGS@
|
||||||
|
LDFLAGS = @LDFLAGS@
|
||||||
|
|
||||||
|
COMPILE = $(CC) -c $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS) $(XCFLAGS)
|
||||||
|
|
||||||
|
HEADERS = $(COMHDRS) libgettext.h loadinfo.h
|
||||||
|
COMHDRS = gettext.h gettextP.h hash-string.h
|
||||||
|
SOURCES = $(COMSRCS) intl-compat.c cat-compat.c
|
||||||
|
COMSRCS = bindtextdom.c dcgettext.c dgettext.c gettext.c \
|
||||||
|
finddomain.c loadmsgcat.c localealias.c textdomain.c l10nflist.c \
|
||||||
|
explodename.c
|
||||||
|
OBJECTS = @INTLOBJS@ bindtextdom.$lo dcgettext.$lo dgettext.$lo gettext.$lo \
|
||||||
|
finddomain.$lo loadmsgcat.$lo localealias.$lo textdomain.$lo l10nflist.$lo \
|
||||||
|
explodename.$lo
|
||||||
|
CATOBJS = cat-compat.$lo ../po/cat-id-tbl.$lo
|
||||||
|
GETTOBJS = intl-compat.$lo
|
||||||
|
DISTFILES.common = ChangeLog Makefile.in linux-msg.sed po2tbl.sed.in \
|
||||||
|
xopen-msg.sed $(HEADERS) $(SOURCES)
|
||||||
|
DISTFILES.normal = VERSION
|
||||||
|
DISTFILES.gettext = libintl.glibc intlh.inst.in
|
||||||
|
|
||||||
|
.SUFFIXES:
|
||||||
|
.SUFFIXES: .c .o .lo
|
||||||
|
.c.o:
|
||||||
|
$(COMPILE) $<
|
||||||
|
.c.lo:
|
||||||
|
$(LIBTOOL) --mode=compile $(COMPILE) $<
|
||||||
|
|
||||||
|
INCLUDES = -I. -I$(srcdir)
|
||||||
|
|
||||||
|
all: all-@USE_INCLUDED_LIBINTL@
|
||||||
|
|
||||||
|
all-yes: libintl.$la intlh.inst
|
||||||
|
all-no:
|
||||||
|
install-info:
|
||||||
|
|
||||||
|
libintl.a: $(OBJECTS)
|
||||||
|
rm -f $@
|
||||||
|
$(AR) cru $@ $(OBJECTS)
|
||||||
|
$(RANLIB) $@
|
||||||
|
|
||||||
|
libintl.la: $(OBJECTS)
|
||||||
|
$(LIBTOOL) --mode=link $(CC) $(LDFLAGS) -o $@ $(OBJECTS) \
|
||||||
|
-version-info 1:0 -rpath $(libdir)
|
||||||
|
|
||||||
|
../po/cat-id-tbl.$lo: ../po/cat-id-tbl.c $(top_srcdir)/po/$(PACKAGE).pot
|
||||||
|
cd ../po && $(MAKE) cat-id-tbl.$lo
|
||||||
|
|
||||||
|
check: all
|
||||||
|
|
||||||
|
# This installation goal is only used in GNU gettext. Packages which
|
||||||
|
# only use the library should use install instead.
|
||||||
|
|
||||||
|
# We must not install the libintl.h/libintl.a files if we are on a
|
||||||
|
# system which has the gettext() function in its C library or in a
|
||||||
|
# separate library or use the catgets interface. A special case is
|
||||||
|
# where configure found a previously installed GNU gettext library.
|
||||||
|
# If you want to use the one which comes with this version of the
|
||||||
|
# package, you have to use `configure --with-included-gettext'.
|
||||||
|
install: install-exec install-data
|
||||||
|
install-exec: all
|
||||||
|
if test "$(PACKAGE)" = "gettext" \
|
||||||
|
&& test '@INTLOBJS@' = '$(GETTOBJS)'; then \
|
||||||
|
if test -r $(MKINSTALLDIRS); then \
|
||||||
|
$(MKINSTALLDIRS) $(libdir) $(includedir); \
|
||||||
|
else \
|
||||||
|
$(top_srcdir)/mkinstalldirs $(libdir) $(includedir); \
|
||||||
|
fi; \
|
||||||
|
$(INSTALL_DATA) intlh.inst $(includedir)/libintl.h; \
|
||||||
|
$(INSTALL_DATA) libintl.a $(libdir)/libintl.a; \
|
||||||
|
else \
|
||||||
|
: ; \
|
||||||
|
fi
|
||||||
|
install-data: all
|
||||||
|
if test "$(PACKAGE)" = "gettext"; then \
|
||||||
|
if test -r $(MKINSTALLDIRS); then \
|
||||||
|
$(MKINSTALLDIRS) $(gettextsrcdir); \
|
||||||
|
else \
|
||||||
|
$(top_srcdir)/mkinstalldirs $(gettextsrcdir); \
|
||||||
|
fi; \
|
||||||
|
$(INSTALL_DATA) VERSION $(gettextsrcdir)/VERSION; \
|
||||||
|
dists="$(DISTFILES.common)"; \
|
||||||
|
for file in $$dists; do \
|
||||||
|
$(INSTALL_DATA) $(srcdir)/$$file $(gettextsrcdir)/$$file; \
|
||||||
|
done; \
|
||||||
|
else \
|
||||||
|
: ; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Define this as empty until I found a useful application.
|
||||||
|
installcheck:
|
||||||
|
|
||||||
|
uninstall:
|
||||||
|
dists="$(DISTFILES.common)"; \
|
||||||
|
for file in $$dists; do \
|
||||||
|
rm -f $(gettextsrcdir)/$$file; \
|
||||||
|
done
|
||||||
|
|
||||||
|
info dvi:
|
||||||
|
|
||||||
|
$(OBJECTS): config.h libgettext.h
|
||||||
|
bindtextdom.$lo finddomain.$lo loadmsgcat.$lo: gettextP.h gettext.h loadinfo.h
|
||||||
|
dcgettext.$lo: gettextP.h gettext.h hash-string.h loadinfo.h
|
||||||
|
|
||||||
|
tags: TAGS
|
||||||
|
|
||||||
|
TAGS: $(HEADERS) $(SOURCES)
|
||||||
|
here=`pwd`; cd $(srcdir) && etags -o $$here/TAGS $(HEADERS) $(SOURCES)
|
||||||
|
|
||||||
|
id: ID
|
||||||
|
|
||||||
|
ID: $(HEADERS) $(SOURCES)
|
||||||
|
here=`pwd`; cd $(srcdir) && mkid -f$$here/ID $(HEADERS) $(SOURCES)
|
||||||
|
|
||||||
|
|
||||||
|
mostlyclean:
|
||||||
|
rm -f *.a *.o *.lo core core.*
|
||||||
|
|
||||||
|
clean: mostlyclean
|
||||||
|
|
||||||
|
distclean: clean
|
||||||
|
rm -f Makefile ID TAGS po2msg.sed po2tbl.sed libintl.h config.log
|
||||||
|
|
||||||
|
maintainer-clean: distclean
|
||||||
|
@echo "This command is intended for maintainers to use;"
|
||||||
|
@echo "it deletes files that may require special tools to rebuild."
|
||||||
|
|
||||||
|
|
||||||
|
# GNU gettext needs not contain the file `VERSION' but contains some
|
||||||
|
# other files which should not be distributed in other packages.
|
||||||
|
distdir = ../$(PACKAGE)-$(VERSION)/$(subdir)
|
||||||
|
dist distdir: Makefile $(DISTFILES)
|
||||||
|
if test "$(PACKAGE)" = gettext; then \
|
||||||
|
additional="$(DISTFILES.gettext)"; \
|
||||||
|
else \
|
||||||
|
additional="$(DISTFILES.normal)"; \
|
||||||
|
fi; \
|
||||||
|
for file in $(DISTFILES.common) $$additional; do \
|
||||||
|
ln $(srcdir)/$$file $(distdir) 2> /dev/null \
|
||||||
|
|| cp -p $(srcdir)/$$file $(distdir); \
|
||||||
|
done
|
||||||
|
|
||||||
|
dist-libc:
|
||||||
|
tar zcvf intl-glibc.tar.gz $(COMSRCS) $(COMHDRS) libintl.h.glibc
|
||||||
|
|
||||||
|
Makefile: Makefile.in config.status
|
||||||
|
CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status
|
||||||
|
|
||||||
|
# The dependency for intlh.inst is different in gettext and all other
|
||||||
|
# packages. Because we cannot you GNU make features we have to solve
|
||||||
|
# the problem while rewriting Makefile.in.
|
||||||
|
@GT_YES@intlh.inst: intlh.inst.in ../config.status
|
||||||
|
@GT_YES@ cd .. \
|
||||||
|
@GT_YES@ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= \
|
||||||
|
@GT_YES@ $(SHELL) ./config.status
|
||||||
|
@GT_NO@.PHONY: intlh.inst
|
||||||
|
@GT_NO@intlh.inst:
|
||||||
|
|
||||||
|
# Tell versions [3.59,3.63) of GNU make not to export all variables.
|
||||||
|
# Otherwise a system limit (for SysV at least) may be exceeded.
|
||||||
|
.NOEXPORT:
|
||||||
14
intl/acconfig.h
Normal file
14
intl/acconfig.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
/* Define to 1 if NLS is requested. */
|
||||||
|
#undef ENABLE_NLS
|
||||||
|
|
||||||
|
/* Define as 1 if you have catgets and don't want to use GNU gettext. */
|
||||||
|
#undef HAVE_CATGETS
|
||||||
|
|
||||||
|
/* Define as 1 if you have gettext and don't want to use GNU gettext. */
|
||||||
|
#undef HAVE_GETTEXT
|
||||||
|
|
||||||
|
/* Define as 1 if you have the stpcpy function. */
|
||||||
|
#undef HAVE_STPCPY
|
||||||
|
|
||||||
|
/* Define if your locale.h file contains LC_MESSAGES. */
|
||||||
|
#undef HAVE_LC_MESSAGES
|
||||||
387
intl/aclocal.m4
vendored
Normal file
387
intl/aclocal.m4
vendored
Normal file
@@ -0,0 +1,387 @@
|
|||||||
|
dnl aclocal.m4 generated automatically by aclocal 1.3
|
||||||
|
|
||||||
|
dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
dnl This Makefile.in is free software; the Free Software Foundation
|
||||||
|
dnl gives unlimited permission to copy and/or distribute it,
|
||||||
|
dnl with or without modifications, as long as this notice is preserved.
|
||||||
|
|
||||||
|
dnl This program is distributed in the hope that it will be useful,
|
||||||
|
dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
||||||
|
dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
dnl PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
# Like AC_CONFIG_HEADER, but automatically create stamp file.
|
||||||
|
|
||||||
|
AC_DEFUN(AM_CONFIG_HEADER,
|
||||||
|
[AC_PREREQ([2.12])
|
||||||
|
AC_CONFIG_HEADER([$1])
|
||||||
|
dnl When config.status generates a header, we must update the stamp-h file.
|
||||||
|
dnl This file resides in the same directory as the config header
|
||||||
|
dnl that is generated. We must strip everything past the first ":",
|
||||||
|
dnl and everything past the last "/".
|
||||||
|
AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl
|
||||||
|
ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>,
|
||||||
|
<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>,
|
||||||
|
<<am_indx=1
|
||||||
|
for am_file in <<$1>>; do
|
||||||
|
case " <<$>>CONFIG_HEADERS " in
|
||||||
|
*" <<$>>am_file "*<<)>>
|
||||||
|
echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
am_indx=`expr "<<$>>am_indx" + 1`
|
||||||
|
done<<>>dnl>>)
|
||||||
|
changequote([,]))])
|
||||||
|
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
AC_DEFUN(AM_PROG_INSTALL,
|
||||||
|
[AC_REQUIRE([AC_PROG_INSTALL])
|
||||||
|
test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
|
||||||
|
AC_SUBST(INSTALL_SCRIPT)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
# This file is derived from `gettext.m4'. The difference is that the
|
||||||
|
# included macros assume Cygnus-style source and build trees.
|
||||||
|
|
||||||
|
# Macro to add for using GNU gettext.
|
||||||
|
# Ulrich Drepper <drepper@cygnus.com>, 1995.
|
||||||
|
#
|
||||||
|
# This file file be copied and used freely without restrictions. It can
|
||||||
|
# be used in projects which are not available under the GNU Public License
|
||||||
|
# but which still want to provide support for the GNU gettext functionality.
|
||||||
|
# Please note that the actual code is *not* freely available.
|
||||||
|
|
||||||
|
# serial 3
|
||||||
|
|
||||||
|
AC_DEFUN(CY_WITH_NLS,
|
||||||
|
[AC_MSG_CHECKING([whether NLS is requested])
|
||||||
|
dnl Default is enabled NLS
|
||||||
|
AC_ARG_ENABLE(nls,
|
||||||
|
[ --disable-nls do not use Native Language Support],
|
||||||
|
USE_NLS=$enableval, USE_NLS=yes)
|
||||||
|
AC_MSG_RESULT($USE_NLS)
|
||||||
|
AC_SUBST(USE_NLS)
|
||||||
|
|
||||||
|
USE_INCLUDED_LIBINTL=no
|
||||||
|
|
||||||
|
dnl If we use NLS figure out what method
|
||||||
|
if test "$USE_NLS" = "yes"; then
|
||||||
|
AC_DEFINE(ENABLE_NLS)
|
||||||
|
AC_MSG_CHECKING([whether included gettext is requested])
|
||||||
|
AC_ARG_WITH(included-gettext,
|
||||||
|
[ --with-included-gettext use the GNU gettext library included here],
|
||||||
|
nls_cv_force_use_gnu_gettext=$withval,
|
||||||
|
nls_cv_force_use_gnu_gettext=no)
|
||||||
|
AC_MSG_RESULT($nls_cv_force_use_gnu_gettext)
|
||||||
|
|
||||||
|
nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext"
|
||||||
|
if test "$nls_cv_force_use_gnu_gettext" != "yes"; then
|
||||||
|
dnl User does not insist on using GNU NLS library. Figure out what
|
||||||
|
dnl to use. If gettext or catgets are available (in this order) we
|
||||||
|
dnl use this. Else we have to fall back to GNU NLS library.
|
||||||
|
dnl catgets is only used if permitted by option --with-catgets.
|
||||||
|
nls_cv_header_intl=
|
||||||
|
nls_cv_header_libgt=
|
||||||
|
CATOBJEXT=NONE
|
||||||
|
|
||||||
|
AC_CHECK_HEADER(libintl.h,
|
||||||
|
[AC_CACHE_CHECK([for gettext in libc], gt_cv_func_gettext_libc,
|
||||||
|
[AC_TRY_LINK([#include <libintl.h>], [return (int) gettext ("")],
|
||||||
|
gt_cv_func_gettext_libc=yes, gt_cv_func_gettext_libc=no)])
|
||||||
|
|
||||||
|
if test "$gt_cv_func_gettext_libc" != "yes"; then
|
||||||
|
AC_CHECK_LIB(intl, bindtextdomain,
|
||||||
|
[AC_CACHE_CHECK([for gettext in libintl],
|
||||||
|
gt_cv_func_gettext_libintl,
|
||||||
|
[AC_TRY_LINK([], [return (int) gettext ("")],
|
||||||
|
gt_cv_func_gettext_libintl=yes,
|
||||||
|
gt_cv_func_gettext_libintl=no)])])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$gt_cv_func_gettext_libc" = "yes" \
|
||||||
|
|| test "$gt_cv_func_gettext_libintl" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_GETTEXT)
|
||||||
|
AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
|
||||||
|
if test "$MSGFMT" != "no"; then
|
||||||
|
AC_CHECK_FUNCS(dcgettext)
|
||||||
|
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
|
||||||
|
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
|
||||||
|
AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
|
||||||
|
return _nl_msg_cat_cntr],
|
||||||
|
[CATOBJEXT=.gmo
|
||||||
|
DATADIRNAME=share],
|
||||||
|
[CATOBJEXT=.mo
|
||||||
|
DATADIRNAME=lib])
|
||||||
|
INSTOBJEXT=.mo
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl In the standard gettext, we would now check for catgets.
|
||||||
|
dnl However, we never want to use catgets for our releases.
|
||||||
|
|
||||||
|
if test "$CATOBJEXT" = "NONE"; then
|
||||||
|
dnl Neither gettext nor catgets in included in the C library.
|
||||||
|
dnl Fall back on GNU gettext library.
|
||||||
|
nls_cv_use_gnu_gettext=yes
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test "$nls_cv_use_gnu_gettext" = "yes"; then
|
||||||
|
dnl Mark actions used to generate GNU NLS library.
|
||||||
|
INTLOBJS="\$(GETTOBJS)"
|
||||||
|
AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], msgfmt)
|
||||||
|
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
|
||||||
|
AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
|
||||||
|
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
|
||||||
|
AC_SUBST(MSGFMT)
|
||||||
|
USE_INCLUDED_LIBINTL=yes
|
||||||
|
CATOBJEXT=.gmo
|
||||||
|
INSTOBJEXT=.mo
|
||||||
|
DATADIRNAME=share
|
||||||
|
INTLDEPS='$(top_builddir)/../intl/libintl.a'
|
||||||
|
INTLLIBS=$INTLDEPS
|
||||||
|
LIBS=`echo $LIBS | sed -e 's/-lintl//'`
|
||||||
|
nls_cv_header_intl=libintl.h
|
||||||
|
nls_cv_header_libgt=libgettext.h
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Test whether we really found GNU xgettext.
|
||||||
|
if test "$XGETTEXT" != ":"; then
|
||||||
|
dnl If it is no GNU xgettext we define it as : so that the
|
||||||
|
dnl Makefiles still can work.
|
||||||
|
if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
|
||||||
|
: ;
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(
|
||||||
|
[found xgettext programs is not GNU xgettext; ignore it])
|
||||||
|
XGETTEXT=":"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# We need to process the po/ directory.
|
||||||
|
POSUB=po
|
||||||
|
else
|
||||||
|
DATADIRNAME=share
|
||||||
|
nls_cv_header_intl=libintl.h
|
||||||
|
nls_cv_header_libgt=libgettext.h
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If this is used in GNU gettext we have to set USE_NLS to `yes'
|
||||||
|
# because some of the sources are only built for this goal.
|
||||||
|
if test "$PACKAGE" = gettext; then
|
||||||
|
USE_NLS=yes
|
||||||
|
USE_INCLUDED_LIBINTL=yes
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl These rules are solely for the distribution goal. While doing this
|
||||||
|
dnl we only have to keep exactly one list of the available catalogs
|
||||||
|
dnl in configure.in.
|
||||||
|
for lang in $ALL_LINGUAS; do
|
||||||
|
GMOFILES="$GMOFILES $lang.gmo"
|
||||||
|
POFILES="$POFILES $lang.po"
|
||||||
|
done
|
||||||
|
|
||||||
|
dnl Make all variables we use known to autoconf.
|
||||||
|
AC_SUBST(USE_INCLUDED_LIBINTL)
|
||||||
|
AC_SUBST(CATALOGS)
|
||||||
|
AC_SUBST(CATOBJEXT)
|
||||||
|
AC_SUBST(DATADIRNAME)
|
||||||
|
AC_SUBST(GMOFILES)
|
||||||
|
AC_SUBST(INSTOBJEXT)
|
||||||
|
AC_SUBST(INTLDEPS)
|
||||||
|
AC_SUBST(INTLLIBS)
|
||||||
|
AC_SUBST(INTLOBJS)
|
||||||
|
AC_SUBST(POFILES)
|
||||||
|
AC_SUBST(POSUB)
|
||||||
|
])
|
||||||
|
|
||||||
|
AC_DEFUN(CY_GNU_GETTEXT,
|
||||||
|
[AC_REQUIRE([AC_PROG_MAKE_SET])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_CC])dnl
|
||||||
|
AC_REQUIRE([AC_PROG_RANLIB])dnl
|
||||||
|
AC_REQUIRE([AC_ISC_POSIX])dnl
|
||||||
|
AC_REQUIRE([AC_HEADER_STDC])dnl
|
||||||
|
AC_REQUIRE([AC_C_CONST])dnl
|
||||||
|
AC_REQUIRE([AC_C_INLINE])dnl
|
||||||
|
AC_REQUIRE([AC_TYPE_OFF_T])dnl
|
||||||
|
AC_REQUIRE([AC_TYPE_SIZE_T])dnl
|
||||||
|
AC_REQUIRE([AC_FUNC_ALLOCA])dnl
|
||||||
|
AC_REQUIRE([AC_FUNC_MMAP])dnl
|
||||||
|
|
||||||
|
AC_CHECK_HEADERS([argz.h limits.h locale.h nl_types.h malloc.h string.h \
|
||||||
|
unistd.h values.h sys/param.h])
|
||||||
|
AC_CHECK_FUNCS([getcwd munmap putenv setenv setlocale strchr strcasecmp \
|
||||||
|
__argz_count __argz_stringify __argz_next])
|
||||||
|
|
||||||
|
if test "${ac_cv_func_stpcpy+set}" != "set"; then
|
||||||
|
AC_CHECK_FUNCS(stpcpy)
|
||||||
|
fi
|
||||||
|
if test "${ac_cv_func_stpcpy}" = "yes"; then
|
||||||
|
AC_DEFINE(HAVE_STPCPY)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AM_LC_MESSAGES
|
||||||
|
CY_WITH_NLS
|
||||||
|
|
||||||
|
if test "x$CATOBJEXT" != "x"; then
|
||||||
|
if test "x$ALL_LINGUAS" = "x"; then
|
||||||
|
LINGUAS=
|
||||||
|
else
|
||||||
|
AC_MSG_CHECKING(for catalogs to be installed)
|
||||||
|
NEW_LINGUAS=
|
||||||
|
for lang in ${LINGUAS=$ALL_LINGUAS}; do
|
||||||
|
case "$ALL_LINGUAS" in
|
||||||
|
*$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
LINGUAS=$NEW_LINGUAS
|
||||||
|
AC_MSG_RESULT($LINGUAS)
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl Construct list of names of catalog files to be constructed.
|
||||||
|
if test -n "$LINGUAS"; then
|
||||||
|
for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl The reference to <locale.h> in the installed <libintl.h> file
|
||||||
|
dnl must be resolved because we cannot expect the users of this
|
||||||
|
dnl to define HAVE_LOCALE_H.
|
||||||
|
if test $ac_cv_header_locale_h = yes; then
|
||||||
|
INCLUDE_LOCALE_H="#include <locale.h>"
|
||||||
|
else
|
||||||
|
INCLUDE_LOCALE_H="\
|
||||||
|
/* The system does not provide the header <locale.h>. Take care yourself. */"
|
||||||
|
fi
|
||||||
|
AC_SUBST(INCLUDE_LOCALE_H)
|
||||||
|
|
||||||
|
dnl Determine which catalog format we have (if any is needed)
|
||||||
|
dnl For now we know about two different formats:
|
||||||
|
dnl Linux libc-5 and the normal X/Open format
|
||||||
|
if test -f $srcdir/po2tbl.sed.in; then
|
||||||
|
if test "$CATOBJEXT" = ".cat"; then
|
||||||
|
AC_CHECK_HEADER(linux/version.h, msgformat=linux, msgformat=xopen)
|
||||||
|
|
||||||
|
dnl Transform the SED scripts while copying because some dumb SEDs
|
||||||
|
dnl cannot handle comments.
|
||||||
|
sed -e '/^#/d' $srcdir/$msgformat-msg.sed > po2msg.sed
|
||||||
|
fi
|
||||||
|
dnl po2tbl.sed is always needed.
|
||||||
|
sed -e '/^#.*[^\\]$/d' -e '/^#$/d' \
|
||||||
|
$srcdir/po2tbl.sed.in > po2tbl.sed
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl In the intl/Makefile.in we have a special dependency which makes
|
||||||
|
dnl only sense for gettext. We comment this out for non-gettext
|
||||||
|
dnl packages.
|
||||||
|
if test "$PACKAGE" = "gettext"; then
|
||||||
|
GT_NO="#NO#"
|
||||||
|
GT_YES=
|
||||||
|
else
|
||||||
|
GT_NO=
|
||||||
|
GT_YES="#YES#"
|
||||||
|
fi
|
||||||
|
AC_SUBST(GT_NO)
|
||||||
|
AC_SUBST(GT_YES)
|
||||||
|
|
||||||
|
MKINSTALLDIRS="\$(srcdir)/../../mkinstalldirs"
|
||||||
|
AC_SUBST(MKINSTALLDIRS)
|
||||||
|
|
||||||
|
dnl *** For now the libtool support in intl/Makefile is not for real.
|
||||||
|
l=
|
||||||
|
AC_SUBST(l)
|
||||||
|
|
||||||
|
dnl Generate list of files to be processed by xgettext which will
|
||||||
|
dnl be included in po/Makefile. But only do this if the po directory
|
||||||
|
dnl exists in srcdir.
|
||||||
|
if test -d $srcdir/po; then
|
||||||
|
test -d po || mkdir po
|
||||||
|
if test "x$srcdir" != "x."; then
|
||||||
|
if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
|
||||||
|
posrcprefix="$srcdir/"
|
||||||
|
else
|
||||||
|
posrcprefix="../$srcdir/"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
posrcprefix="../"
|
||||||
|
fi
|
||||||
|
rm -f po/POTFILES
|
||||||
|
sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
|
||||||
|
< $srcdir/po/POTFILES.in > po/POTFILES
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
|
||||||
|
# Search path for a program which passes the given test.
|
||||||
|
# Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
#
|
||||||
|
# This file file be copied and used freely without restrictions. It can
|
||||||
|
# be used in projects which are not available under the GNU Public License
|
||||||
|
# but which still want to provide support for the GNU gettext functionality.
|
||||||
|
# Please note that the actual code is *not* freely available.
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
|
||||||
|
dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
|
||||||
|
AC_DEFUN(AM_PATH_PROG_WITH_TEST,
|
||||||
|
[# Extract the first word of "$2", so it can be a program name with args.
|
||||||
|
set dummy $2; ac_word=[$]2
|
||||||
|
AC_MSG_CHECKING([for $ac_word])
|
||||||
|
AC_CACHE_VAL(ac_cv_path_$1,
|
||||||
|
[case "[$]$1" in
|
||||||
|
/*)
|
||||||
|
ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
|
||||||
|
for ac_dir in ifelse([$5], , $PATH, [$5]); do
|
||||||
|
test -z "$ac_dir" && ac_dir=.
|
||||||
|
if test -f $ac_dir/$ac_word; then
|
||||||
|
if [$3]; then
|
||||||
|
ac_cv_path_$1="$ac_dir/$ac_word"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
IFS="$ac_save_ifs"
|
||||||
|
dnl If no 4th arg is given, leave the cache variable unset,
|
||||||
|
dnl so AC_PATH_PROGS will keep looking.
|
||||||
|
ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
|
||||||
|
])dnl
|
||||||
|
;;
|
||||||
|
esac])dnl
|
||||||
|
$1="$ac_cv_path_$1"
|
||||||
|
if test -n "[$]$1"; then
|
||||||
|
AC_MSG_RESULT([$]$1)
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT(no)
|
||||||
|
fi
|
||||||
|
AC_SUBST($1)dnl
|
||||||
|
])
|
||||||
|
|
||||||
|
# Check whether LC_MESSAGES is available in <locale.h>.
|
||||||
|
# Ulrich Drepper <drepper@cygnus.com>, 1995.
|
||||||
|
#
|
||||||
|
# This file file be copied and used freely without restrictions. It can
|
||||||
|
# be used in projects which are not available under the GNU Public License
|
||||||
|
# but which still want to provide support for the GNU gettext functionality.
|
||||||
|
# Please note that the actual code is *not* freely available.
|
||||||
|
|
||||||
|
# serial 1
|
||||||
|
|
||||||
|
AC_DEFUN(AM_LC_MESSAGES,
|
||||||
|
[if test $ac_cv_header_locale_h = yes; then
|
||||||
|
AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
|
||||||
|
[AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
|
||||||
|
am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
|
||||||
|
if test $am_cv_val_LC_MESSAGES = yes; then
|
||||||
|
AC_DEFINE(HAVE_LC_MESSAGES)
|
||||||
|
fi
|
||||||
|
fi])
|
||||||
|
|
||||||
203
intl/bindtextdom.c
Normal file
203
intl/bindtextdom.c
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
/* Implementation of the bindtextdomain(3) function
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
# ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
# else
|
||||||
|
void free ();
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
# ifndef memcpy
|
||||||
|
# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
#include "gettext.h"
|
||||||
|
#include "gettextP.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* Contains the default location of the message catalogs. */
|
||||||
|
extern const char _nl_default_dirname[];
|
||||||
|
|
||||||
|
/* List with bindings of specific domains. */
|
||||||
|
extern struct binding *_nl_domain_bindings;
|
||||||
|
|
||||||
|
|
||||||
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
|
with existing names and they should follow ANSI C. But this source
|
||||||
|
code is also used in GNU C Library where the names have a __
|
||||||
|
prefix. So we have to make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define BINDTEXTDOMAIN __bindtextdomain
|
||||||
|
# ifndef strdup
|
||||||
|
# define strdup(str) __strdup (str)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define BINDTEXTDOMAIN bindtextdomain__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Specify that the DOMAINNAME message catalog will be found
|
||||||
|
in DIRNAME rather than in the system locale data base. */
|
||||||
|
char *
|
||||||
|
BINDTEXTDOMAIN (domainname, dirname)
|
||||||
|
const char *domainname;
|
||||||
|
const char *dirname;
|
||||||
|
{
|
||||||
|
struct binding *binding;
|
||||||
|
|
||||||
|
/* Some sanity checks. */
|
||||||
|
if (domainname == NULL || domainname[0] == '\0')
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
|
||||||
|
{
|
||||||
|
int compare = strcmp (domainname, binding->domainname);
|
||||||
|
if (compare == 0)
|
||||||
|
/* We found it! */
|
||||||
|
break;
|
||||||
|
if (compare < 0)
|
||||||
|
{
|
||||||
|
/* It is not in the list. */
|
||||||
|
binding = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dirname == NULL)
|
||||||
|
/* The current binding has be to returned. */
|
||||||
|
return binding == NULL ? (char *) _nl_default_dirname : binding->dirname;
|
||||||
|
|
||||||
|
if (binding != NULL)
|
||||||
|
{
|
||||||
|
/* The domain is already bound. If the new value and the old
|
||||||
|
one are equal we simply do nothing. Otherwise replace the
|
||||||
|
old binding. */
|
||||||
|
if (strcmp (dirname, binding->dirname) != 0)
|
||||||
|
{
|
||||||
|
char *new_dirname;
|
||||||
|
|
||||||
|
if (strcmp (dirname, _nl_default_dirname) == 0)
|
||||||
|
new_dirname = (char *) _nl_default_dirname;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
|
new_dirname = strdup (dirname);
|
||||||
|
if (new_dirname == NULL)
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
size_t len = strlen (dirname) + 1;
|
||||||
|
new_dirname = (char *) malloc (len);
|
||||||
|
if (new_dirname == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memcpy (new_dirname, dirname, len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding->dirname != _nl_default_dirname)
|
||||||
|
free (binding->dirname);
|
||||||
|
|
||||||
|
binding->dirname = new_dirname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We have to create a new binding. */
|
||||||
|
#if !defined _LIBC && !defined HAVE_STRDUP
|
||||||
|
size_t len;
|
||||||
|
#endif
|
||||||
|
struct binding *new_binding =
|
||||||
|
(struct binding *) malloc (sizeof (*new_binding));
|
||||||
|
|
||||||
|
if (new_binding == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
|
new_binding->domainname = strdup (domainname);
|
||||||
|
if (new_binding->domainname == NULL)
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
len = strlen (domainname) + 1;
|
||||||
|
new_binding->domainname = (char *) malloc (len);
|
||||||
|
if (new_binding->domainname == NULL)
|
||||||
|
return NULL;
|
||||||
|
memcpy (new_binding->domainname, domainname, len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (strcmp (dirname, _nl_default_dirname) == 0)
|
||||||
|
new_binding->dirname = (char *) _nl_default_dirname;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
|
new_binding->dirname = strdup (dirname);
|
||||||
|
if (new_binding->dirname == NULL)
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
len = strlen (dirname) + 1;
|
||||||
|
new_binding->dirname = (char *) malloc (len);
|
||||||
|
if (new_binding->dirname == NULL)
|
||||||
|
return NULL;
|
||||||
|
memcpy (new_binding->dirname, dirname, len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now enqueue it. */
|
||||||
|
if (_nl_domain_bindings == NULL
|
||||||
|
|| strcmp (domainname, _nl_domain_bindings->domainname) < 0)
|
||||||
|
{
|
||||||
|
new_binding->next = _nl_domain_bindings;
|
||||||
|
_nl_domain_bindings = new_binding;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
binding = _nl_domain_bindings;
|
||||||
|
while (binding->next != NULL
|
||||||
|
&& strcmp (domainname, binding->next->domainname) > 0)
|
||||||
|
binding = binding->next;
|
||||||
|
|
||||||
|
new_binding->next = binding->next;
|
||||||
|
binding->next = new_binding;
|
||||||
|
}
|
||||||
|
|
||||||
|
binding = new_binding;
|
||||||
|
}
|
||||||
|
|
||||||
|
return binding->dirname;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Alias for function name in GNU C Library. */
|
||||||
|
weak_alias (__bindtextdomain, bindtextdomain);
|
||||||
|
#endif
|
||||||
262
intl/cat-compat.c
Normal file
262
intl/cat-compat.c
Normal file
@@ -0,0 +1,262 @@
|
|||||||
|
/* Compatibility code for gettext-using-catgets interface.
|
||||||
|
Copyright (C) 1995, 1997 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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#ifdef STDC_HEADERS
|
||||||
|
# include <stdlib.h>
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
char *getenv ();
|
||||||
|
# ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_NL_TYPES_H
|
||||||
|
# include <nl_types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libgettext.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* XPG3 defines the result of `setlocale (category, NULL)' as:
|
||||||
|
``Directs `setlocale()' to query `category' and return the current
|
||||||
|
setting of `local'.''
|
||||||
|
However it does not specify the exact format. And even worse: POSIX
|
||||||
|
defines this not at all. So we can use this feature only on selected
|
||||||
|
system (e.g. those using GNU C Library). */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define HAVE_LOCALE_NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The catalog descriptor. */
|
||||||
|
static nl_catd catalog = (nl_catd) -1;
|
||||||
|
|
||||||
|
/* Name of the default catalog. */
|
||||||
|
static const char default_catalog_name[] = "messages";
|
||||||
|
|
||||||
|
/* Name of currently used catalog. */
|
||||||
|
static const char *catalog_name = default_catalog_name;
|
||||||
|
|
||||||
|
/* Get ID for given string. If not found return -1. */
|
||||||
|
static int msg_to_cat_id PARAMS ((const char *msg));
|
||||||
|
|
||||||
|
/* Substitution for systems lacking this function in their C library. */
|
||||||
|
#if !_LIBC && !HAVE_STPCPY
|
||||||
|
static char *stpcpy PARAMS ((char *dest, const char *src));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Set currently used domain/catalog. */
|
||||||
|
char *
|
||||||
|
textdomain (domainname)
|
||||||
|
const char *domainname;
|
||||||
|
{
|
||||||
|
nl_catd new_catalog;
|
||||||
|
char *new_name;
|
||||||
|
size_t new_name_len;
|
||||||
|
char *lang;
|
||||||
|
|
||||||
|
#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES \
|
||||||
|
&& defined HAVE_LOCALE_NULL
|
||||||
|
lang = setlocale (LC_MESSAGES, NULL);
|
||||||
|
#else
|
||||||
|
lang = getenv ("LC_ALL");
|
||||||
|
if (lang == NULL || lang[0] == '\0')
|
||||||
|
{
|
||||||
|
lang = getenv ("LC_MESSAGES");
|
||||||
|
if (lang == NULL || lang[0] == '\0')
|
||||||
|
lang = getenv ("LANG");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (lang == NULL || lang[0] == '\0')
|
||||||
|
lang = "C";
|
||||||
|
|
||||||
|
/* See whether name of currently used domain is asked. */
|
||||||
|
if (domainname == NULL)
|
||||||
|
return (char *) catalog_name;
|
||||||
|
|
||||||
|
if (domainname[0] == '\0')
|
||||||
|
domainname = default_catalog_name;
|
||||||
|
|
||||||
|
/* Compute length of added path element. */
|
||||||
|
new_name_len = sizeof (LOCALEDIR) - 1 + 1 + strlen (lang)
|
||||||
|
+ sizeof ("/LC_MESSAGES/") - 1 + sizeof (PACKAGE) - 1
|
||||||
|
+ sizeof (".cat");
|
||||||
|
|
||||||
|
new_name = (char *) malloc (new_name_len);
|
||||||
|
if (new_name == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
strcpy (new_name, PACKAGE);
|
||||||
|
new_catalog = catopen (new_name, 0);
|
||||||
|
|
||||||
|
if (new_catalog == (nl_catd) -1)
|
||||||
|
{
|
||||||
|
/* NLSPATH search didn't work, try absolute path */
|
||||||
|
sprintf (new_name, "%s/%s/LC_MESSAGES/%s.cat", LOCALEDIR, lang,
|
||||||
|
PACKAGE);
|
||||||
|
new_catalog = catopen (new_name, 0);
|
||||||
|
|
||||||
|
if (new_catalog == (nl_catd) -1)
|
||||||
|
{
|
||||||
|
free (new_name);
|
||||||
|
return (char *) catalog_name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close old catalog. */
|
||||||
|
if (catalog != (nl_catd) -1)
|
||||||
|
catclose (catalog);
|
||||||
|
if (catalog_name != default_catalog_name)
|
||||||
|
free ((char *) catalog_name);
|
||||||
|
|
||||||
|
catalog = new_catalog;
|
||||||
|
catalog_name = new_name;
|
||||||
|
|
||||||
|
return (char *) catalog_name;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
bindtextdomain (domainname, dirname)
|
||||||
|
const char *domainname;
|
||||||
|
const char *dirname;
|
||||||
|
{
|
||||||
|
#if HAVE_SETENV || HAVE_PUTENV
|
||||||
|
char *old_val, *new_val, *cp;
|
||||||
|
size_t new_val_len;
|
||||||
|
|
||||||
|
/* This does not make much sense here but to be compatible do it. */
|
||||||
|
if (domainname == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Compute length of added path element. If we use setenv we don't need
|
||||||
|
the first byts for NLSPATH=, but why complicate the code for this
|
||||||
|
peanuts. */
|
||||||
|
new_val_len = sizeof ("NLSPATH=") - 1 + strlen (dirname)
|
||||||
|
+ sizeof ("/%L/LC_MESSAGES/%N.cat");
|
||||||
|
|
||||||
|
old_val = getenv ("NLSPATH");
|
||||||
|
if (old_val == NULL || old_val[0] == '\0')
|
||||||
|
{
|
||||||
|
old_val = NULL;
|
||||||
|
new_val_len += 1 + sizeof (LOCALEDIR) - 1
|
||||||
|
+ sizeof ("/%L/LC_MESSAGES/%N.cat");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
new_val_len += strlen (old_val);
|
||||||
|
|
||||||
|
new_val = (char *) malloc (new_val_len);
|
||||||
|
if (new_val == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
# if HAVE_SETENV
|
||||||
|
cp = new_val;
|
||||||
|
# else
|
||||||
|
cp = stpcpy (new_val, "NLSPATH=");
|
||||||
|
# endif
|
||||||
|
|
||||||
|
cp = stpcpy (cp, dirname);
|
||||||
|
cp = stpcpy (cp, "/%L/LC_MESSAGES/%N.cat:");
|
||||||
|
|
||||||
|
if (old_val == NULL)
|
||||||
|
{
|
||||||
|
# if __STDC__
|
||||||
|
stpcpy (cp, LOCALEDIR "/%L/LC_MESSAGES/%N.cat");
|
||||||
|
# else
|
||||||
|
|
||||||
|
cp = stpcpy (cp, LOCALEDIR);
|
||||||
|
stpcpy (cp, "/%L/LC_MESSAGES/%N.cat");
|
||||||
|
# endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
stpcpy (cp, old_val);
|
||||||
|
|
||||||
|
# if HAVE_SETENV
|
||||||
|
setenv ("NLSPATH", new_val, 1);
|
||||||
|
free (new_val);
|
||||||
|
# else
|
||||||
|
putenv (new_val);
|
||||||
|
/* Do *not* free the environment entry we just entered. It is used
|
||||||
|
from now on. */
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return (char *) domainname;
|
||||||
|
}
|
||||||
|
|
||||||
|
#undef gettext
|
||||||
|
char *
|
||||||
|
gettext (msg)
|
||||||
|
const char *msg;
|
||||||
|
{
|
||||||
|
int msgid;
|
||||||
|
|
||||||
|
if (msg == NULL || catalog == (nl_catd) -1)
|
||||||
|
return (char *) msg;
|
||||||
|
|
||||||
|
/* Get the message from the catalog. We always use set number 1.
|
||||||
|
The message ID is computed by the function `msg_to_cat_id'
|
||||||
|
which works on the table generated by `po-to-tbl'. */
|
||||||
|
msgid = msg_to_cat_id (msg);
|
||||||
|
if (msgid == -1)
|
||||||
|
return (char *) msg;
|
||||||
|
|
||||||
|
return catgets (catalog, 1, msgid, (char *) msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Look through the table `_msg_tbl' which has `_msg_tbl_length' entries
|
||||||
|
for the one equal to msg. If it is found return the ID. In case when
|
||||||
|
the string is not found return -1. */
|
||||||
|
static int
|
||||||
|
msg_to_cat_id (msg)
|
||||||
|
const char *msg;
|
||||||
|
{
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
for (cnt = 0; cnt < _msg_tbl_length; ++cnt)
|
||||||
|
if (strcmp (msg, _msg_tbl[cnt]._msg) == 0)
|
||||||
|
return _msg_tbl[cnt]._msg_number;
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* @@ 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
|
||||||
128
intl/config.in
Normal file
128
intl/config.in
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
/* config.in. Generated automatically from configure.in by autoheader. */
|
||||||
|
|
||||||
|
/* Define if using alloca.c. */
|
||||||
|
#undef C_ALLOCA
|
||||||
|
|
||||||
|
/* Define to empty if the keyword does not work. */
|
||||||
|
#undef const
|
||||||
|
|
||||||
|
/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
|
||||||
|
This function is required for alloca.c support on those systems. */
|
||||||
|
#undef CRAY_STACKSEG_END
|
||||||
|
|
||||||
|
/* Define if you have alloca, as a function or macro. */
|
||||||
|
#undef HAVE_ALLOCA
|
||||||
|
|
||||||
|
/* Define if you have <alloca.h> and it should be used (not on Ultrix). */
|
||||||
|
#undef HAVE_ALLOCA_H
|
||||||
|
|
||||||
|
/* Define if you have a working `mmap' system call. */
|
||||||
|
#undef HAVE_MMAP
|
||||||
|
|
||||||
|
/* Define as __inline if that's what the C compiler calls it. */
|
||||||
|
#undef inline
|
||||||
|
|
||||||
|
/* Define to `long' if <sys/types.h> doesn't define. */
|
||||||
|
#undef off_t
|
||||||
|
|
||||||
|
/* Define if you need to in order for stat and other things to work. */
|
||||||
|
#undef _POSIX_SOURCE
|
||||||
|
|
||||||
|
/* Define to `unsigned' if <sys/types.h> doesn't define. */
|
||||||
|
#undef size_t
|
||||||
|
|
||||||
|
/* If using the C implementation of alloca, define if you know the
|
||||||
|
direction of stack growth for your system; otherwise it will be
|
||||||
|
automatically deduced at run-time.
|
||||||
|
STACK_DIRECTION > 0 => grows toward higher addresses
|
||||||
|
STACK_DIRECTION < 0 => grows toward lower addresses
|
||||||
|
STACK_DIRECTION = 0 => direction of growth unknown
|
||||||
|
*/
|
||||||
|
#undef STACK_DIRECTION
|
||||||
|
|
||||||
|
/* Define if you have the ANSI C header files. */
|
||||||
|
#undef STDC_HEADERS
|
||||||
|
|
||||||
|
/* Define to 1 if NLS is requested. */
|
||||||
|
#undef ENABLE_NLS
|
||||||
|
|
||||||
|
/* Define as 1 if you have catgets and don't want to use GNU gettext. */
|
||||||
|
#undef HAVE_CATGETS
|
||||||
|
|
||||||
|
/* Define as 1 if you have gettext and don't want to use GNU gettext. */
|
||||||
|
#undef HAVE_GETTEXT
|
||||||
|
|
||||||
|
/* Define as 1 if you have the stpcpy function. */
|
||||||
|
#undef HAVE_STPCPY
|
||||||
|
|
||||||
|
/* Define if your locale.h file contains LC_MESSAGES. */
|
||||||
|
#undef HAVE_LC_MESSAGES
|
||||||
|
|
||||||
|
/* Define if you have the __argz_count function. */
|
||||||
|
#undef HAVE___ARGZ_COUNT
|
||||||
|
|
||||||
|
/* Define if you have the __argz_next function. */
|
||||||
|
#undef HAVE___ARGZ_NEXT
|
||||||
|
|
||||||
|
/* Define if you have the __argz_stringify function. */
|
||||||
|
#undef HAVE___ARGZ_STRINGIFY
|
||||||
|
|
||||||
|
/* Define if you have the dcgettext function. */
|
||||||
|
#undef HAVE_DCGETTEXT
|
||||||
|
|
||||||
|
/* Define if you have the getcwd function. */
|
||||||
|
#undef HAVE_GETCWD
|
||||||
|
|
||||||
|
/* Define if you have the getpagesize function. */
|
||||||
|
#undef HAVE_GETPAGESIZE
|
||||||
|
|
||||||
|
/* Define if you have the munmap function. */
|
||||||
|
#undef HAVE_MUNMAP
|
||||||
|
|
||||||
|
/* Define if you have the putenv function. */
|
||||||
|
#undef HAVE_PUTENV
|
||||||
|
|
||||||
|
/* Define if you have the setenv function. */
|
||||||
|
#undef HAVE_SETENV
|
||||||
|
|
||||||
|
/* Define if you have the setlocale function. */
|
||||||
|
#undef HAVE_SETLOCALE
|
||||||
|
|
||||||
|
/* Define if you have the stpcpy function. */
|
||||||
|
#undef HAVE_STPCPY
|
||||||
|
|
||||||
|
/* Define if you have the strcasecmp function. */
|
||||||
|
#undef HAVE_STRCASECMP
|
||||||
|
|
||||||
|
/* Define if you have the strchr function. */
|
||||||
|
#undef HAVE_STRCHR
|
||||||
|
|
||||||
|
/* Define if you have the <argz.h> header file. */
|
||||||
|
#undef HAVE_ARGZ_H
|
||||||
|
|
||||||
|
/* Define if you have the <limits.h> header file. */
|
||||||
|
#undef HAVE_LIMITS_H
|
||||||
|
|
||||||
|
/* Define if you have the <locale.h> header file. */
|
||||||
|
#undef HAVE_LOCALE_H
|
||||||
|
|
||||||
|
/* Define if you have the <malloc.h> header file. */
|
||||||
|
#undef HAVE_MALLOC_H
|
||||||
|
|
||||||
|
/* Define if you have the <nl_types.h> header file. */
|
||||||
|
#undef HAVE_NL_TYPES_H
|
||||||
|
|
||||||
|
/* Define if you have the <string.h> header file. */
|
||||||
|
#undef HAVE_STRING_H
|
||||||
|
|
||||||
|
/* Define if you have the <sys/param.h> header file. */
|
||||||
|
#undef HAVE_SYS_PARAM_H
|
||||||
|
|
||||||
|
/* Define if you have the <unistd.h> header file. */
|
||||||
|
#undef HAVE_UNISTD_H
|
||||||
|
|
||||||
|
/* Define if you have the <values.h> header file. */
|
||||||
|
#undef HAVE_VALUES_H
|
||||||
|
|
||||||
|
/* Define if you have the i library (-li). */
|
||||||
|
#undef HAVE_LIBI
|
||||||
2950
intl/configure
vendored
Executable file
2950
intl/configure
vendored
Executable file
File diff suppressed because it is too large
Load Diff
10
intl/configure.in
Normal file
10
intl/configure.in
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
|
AC_INIT(dgettext.c)
|
||||||
|
AM_CONFIG_HEADER(config.h:config.in)
|
||||||
|
|
||||||
|
AM_PROG_INSTALL
|
||||||
|
CY_GNU_GETTEXT
|
||||||
|
AC_LINK_FILES($nls_cv_header_libgt, $nls_cv_header_intl)
|
||||||
|
|
||||||
|
AC_OUTPUT(Makefile)
|
||||||
624
intl/dcgettext.c
Normal file
624
intl/dcgettext.c
Normal file
@@ -0,0 +1,624 @@
|
|||||||
|
/* Implementation of the dcgettext(3) function.
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define alloca __builtin_alloca
|
||||||
|
# define HAVE_ALLOCA 1
|
||||||
|
#else
|
||||||
|
# if defined HAVE_ALLOCA_H || defined _LIBC
|
||||||
|
# include <alloca.h>
|
||||||
|
# else
|
||||||
|
# ifdef _AIX
|
||||||
|
#pragma alloca
|
||||||
|
# else
|
||||||
|
# ifndef alloca
|
||||||
|
char *alloca ();
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#ifndef errno
|
||||||
|
extern int errno;
|
||||||
|
#endif
|
||||||
|
#ifndef __set_errno
|
||||||
|
# define __set_errno(val) errno = (val)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
char *getenv ();
|
||||||
|
# ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
# else
|
||||||
|
void free ();
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# ifndef _GNU_SOURCE
|
||||||
|
# define _GNU_SOURCE 1
|
||||||
|
# endif
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
#endif
|
||||||
|
#if !HAVE_STRCHR && !defined _LIBC
|
||||||
|
# ifndef strchr
|
||||||
|
# define strchr index
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_UNISTD_H || defined _LIBC
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "gettext.h"
|
||||||
|
#include "gettextP.h"
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
#include "hash-string.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Rename the non ANSI C functions. This is required by the standard
|
||||||
|
because some ANSI C functions will require linking with this object
|
||||||
|
file and the name space must not be polluted. */
|
||||||
|
# define getcwd __getcwd
|
||||||
|
# ifndef stpcpy
|
||||||
|
# define stpcpy __stpcpy
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# if !defined HAVE_GETCWD
|
||||||
|
char *getwd ();
|
||||||
|
# define getcwd(buf, max) getwd (buf)
|
||||||
|
# else
|
||||||
|
char *getcwd ();
|
||||||
|
# endif
|
||||||
|
# ifndef HAVE_STPCPY
|
||||||
|
static char *stpcpy PARAMS ((char *dest, const char *src));
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Amount to increase buffer size by in each try. */
|
||||||
|
#define PATH_INCR 32
|
||||||
|
|
||||||
|
/* The following is from pathmax.h. */
|
||||||
|
/* Non-POSIX BSD systems might have gcc's limits.h, which doesn't define
|
||||||
|
PATH_MAX but might cause redefinition warnings when sys/param.h is
|
||||||
|
later included (as on MORE/BSD 4.3). */
|
||||||
|
#if defined(_POSIX_VERSION) || (defined(HAVE_LIMITS_H) && !defined(__GNUC__))
|
||||||
|
# include <limits.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _POSIX_PATH_MAX
|
||||||
|
# define _POSIX_PATH_MAX 255
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(PATH_MAX) && defined(_PC_PATH_MAX)
|
||||||
|
# define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 : pathconf ("/", _PC_PATH_MAX))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Don't include sys/param.h if it already has been. */
|
||||||
|
#if defined(HAVE_SYS_PARAM_H) && !defined(PATH_MAX) && !defined(MAXPATHLEN)
|
||||||
|
# include <sys/param.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !defined(PATH_MAX) && defined(MAXPATHLEN)
|
||||||
|
# define PATH_MAX MAXPATHLEN
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef PATH_MAX
|
||||||
|
# define PATH_MAX _POSIX_PATH_MAX
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* XPG3 defines the result of `setlocale (category, NULL)' as:
|
||||||
|
``Directs `setlocale()' to query `category' and return the current
|
||||||
|
setting of `local'.''
|
||||||
|
However it does not specify the exact format. And even worse: POSIX
|
||||||
|
defines this not at all. So we can use this feature only on selected
|
||||||
|
system (e.g. those using GNU C Library). */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define HAVE_LOCALE_NULL
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Name of the default domain used for gettext(3) prior any call to
|
||||||
|
textdomain(3). The default value for this is "messages". */
|
||||||
|
const char _nl_default_default_domain[] = "messages";
|
||||||
|
|
||||||
|
/* Value used as the default domain for gettext(3). */
|
||||||
|
const char *_nl_current_default_domain = _nl_default_default_domain;
|
||||||
|
|
||||||
|
/* Contains the default location of the message catalogs. */
|
||||||
|
const char _nl_default_dirname[] = GNULOCALEDIR;
|
||||||
|
|
||||||
|
/* List with bindings of specific domains created by bindtextdomain()
|
||||||
|
calls. */
|
||||||
|
struct binding *_nl_domain_bindings;
|
||||||
|
|
||||||
|
/* Prototypes for local functions. */
|
||||||
|
static char *find_msg PARAMS ((struct loaded_l10nfile *domain_file,
|
||||||
|
const char *msgid)) internal_function;
|
||||||
|
static const char *category_to_name PARAMS ((int category)) internal_function;
|
||||||
|
static const char *guess_category_value PARAMS ((int category,
|
||||||
|
const char *categoryname))
|
||||||
|
internal_function;
|
||||||
|
|
||||||
|
|
||||||
|
/* For those loosing systems which don't have `alloca' we have to add
|
||||||
|
some additional code emulating it. */
|
||||||
|
#ifdef HAVE_ALLOCA
|
||||||
|
/* Nothing has to be done. */
|
||||||
|
# define ADD_BLOCK(list, address) /* nothing */
|
||||||
|
# define FREE_BLOCKS(list) /* nothing */
|
||||||
|
#else
|
||||||
|
struct block_list
|
||||||
|
{
|
||||||
|
void *address;
|
||||||
|
struct block_list *next;
|
||||||
|
};
|
||||||
|
# define ADD_BLOCK(list, addr) \
|
||||||
|
do { \
|
||||||
|
struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
|
||||||
|
/* If we cannot get a free block we cannot add the new element to \
|
||||||
|
the list. */ \
|
||||||
|
if (newp != NULL) { \
|
||||||
|
newp->address = (addr); \
|
||||||
|
newp->next = (list); \
|
||||||
|
(list) = newp; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
# define FREE_BLOCKS(list) \
|
||||||
|
do { \
|
||||||
|
while (list != NULL) { \
|
||||||
|
struct block_list *old = list; \
|
||||||
|
list = list->next; \
|
||||||
|
free (old); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
# undef alloca
|
||||||
|
# define alloca(size) (malloc (size))
|
||||||
|
#endif /* have alloca */
|
||||||
|
|
||||||
|
|
||||||
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
|
with existing names and they should follow ANSI C. But this source
|
||||||
|
code is also used in GNU C Library where the names have a __
|
||||||
|
prefix. So we have to make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define DCGETTEXT __dcgettext
|
||||||
|
#else
|
||||||
|
# define DCGETTEXT dcgettext__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
||||||
|
locale. */
|
||||||
|
char *
|
||||||
|
DCGETTEXT (domainname, msgid, category)
|
||||||
|
const char *domainname;
|
||||||
|
const char *msgid;
|
||||||
|
int category;
|
||||||
|
{
|
||||||
|
#ifndef HAVE_ALLOCA
|
||||||
|
struct block_list *block_list = NULL;
|
||||||
|
#endif
|
||||||
|
struct loaded_l10nfile *domain;
|
||||||
|
struct binding *binding;
|
||||||
|
const char *categoryname;
|
||||||
|
const char *categoryvalue;
|
||||||
|
char *dirname, *xdomainname;
|
||||||
|
char *single_locale;
|
||||||
|
char *retval;
|
||||||
|
int saved_errno = errno;
|
||||||
|
|
||||||
|
/* If no real MSGID is given return NULL. */
|
||||||
|
if (msgid == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* If DOMAINNAME is NULL, we are interested in the default domain. If
|
||||||
|
CATEGORY is not LC_MESSAGES this might not make much sense but the
|
||||||
|
defintion left this undefined. */
|
||||||
|
if (domainname == NULL)
|
||||||
|
domainname = _nl_current_default_domain;
|
||||||
|
|
||||||
|
/* First find matching binding. */
|
||||||
|
for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
|
||||||
|
{
|
||||||
|
int compare = strcmp (domainname, binding->domainname);
|
||||||
|
if (compare == 0)
|
||||||
|
/* We found it! */
|
||||||
|
break;
|
||||||
|
if (compare < 0)
|
||||||
|
{
|
||||||
|
/* It is not in the list. */
|
||||||
|
binding = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (binding == NULL)
|
||||||
|
dirname = (char *) _nl_default_dirname;
|
||||||
|
else if (binding->dirname[0] == '/')
|
||||||
|
dirname = binding->dirname;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* We have a relative path. Make it absolute now. */
|
||||||
|
size_t dirname_len = strlen (binding->dirname) + 1;
|
||||||
|
size_t path_max;
|
||||||
|
char *ret;
|
||||||
|
|
||||||
|
path_max = (unsigned) PATH_MAX;
|
||||||
|
path_max += 2; /* The getcwd docs say to do this. */
|
||||||
|
|
||||||
|
dirname = (char *) alloca (path_max + dirname_len);
|
||||||
|
ADD_BLOCK (block_list, dirname);
|
||||||
|
|
||||||
|
__set_errno (0);
|
||||||
|
while ((ret = getcwd (dirname, path_max)) == NULL && errno == ERANGE)
|
||||||
|
{
|
||||||
|
path_max += PATH_INCR;
|
||||||
|
dirname = (char *) alloca (path_max + dirname_len);
|
||||||
|
ADD_BLOCK (block_list, dirname);
|
||||||
|
__set_errno (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ret == NULL)
|
||||||
|
{
|
||||||
|
/* We cannot get the current working directory. Don't signal an
|
||||||
|
error but simply return the default string. */
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
__set_errno (saved_errno);
|
||||||
|
return (char *) msgid;
|
||||||
|
}
|
||||||
|
|
||||||
|
stpcpy (stpcpy (strchr (dirname, '\0'), "/"), binding->dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now determine the symbolic name of CATEGORY and its value. */
|
||||||
|
categoryname = category_to_name (category);
|
||||||
|
categoryvalue = guess_category_value (category, categoryname);
|
||||||
|
|
||||||
|
xdomainname = (char *) alloca (strlen (categoryname)
|
||||||
|
+ strlen (domainname) + 5);
|
||||||
|
ADD_BLOCK (block_list, xdomainname);
|
||||||
|
|
||||||
|
stpcpy (stpcpy (stpcpy (stpcpy (xdomainname, categoryname), "/"),
|
||||||
|
domainname),
|
||||||
|
".mo");
|
||||||
|
|
||||||
|
/* Creating working area. */
|
||||||
|
single_locale = (char *) alloca (strlen (categoryvalue) + 1);
|
||||||
|
ADD_BLOCK (block_list, single_locale);
|
||||||
|
|
||||||
|
|
||||||
|
/* Search for the given string. This is a loop because we perhaps
|
||||||
|
got an ordered list of languages to consider for th translation. */
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
/* Make CATEGORYVALUE point to the next element of the list. */
|
||||||
|
while (categoryvalue[0] != '\0' && categoryvalue[0] == ':')
|
||||||
|
++categoryvalue;
|
||||||
|
if (categoryvalue[0] == '\0')
|
||||||
|
{
|
||||||
|
/* The whole contents of CATEGORYVALUE has been searched but
|
||||||
|
no valid entry has been found. We solve this situation
|
||||||
|
by implicitly appending a "C" entry, i.e. no translation
|
||||||
|
will take place. */
|
||||||
|
single_locale[0] = 'C';
|
||||||
|
single_locale[1] = '\0';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char *cp = single_locale;
|
||||||
|
while (categoryvalue[0] != '\0' && categoryvalue[0] != ':')
|
||||||
|
*cp++ = *categoryvalue++;
|
||||||
|
*cp = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If the current locale value is C (or POSIX) we don't load a
|
||||||
|
domain. Return the MSGID. */
|
||||||
|
if (strcmp (single_locale, "C") == 0
|
||||||
|
|| strcmp (single_locale, "POSIX") == 0)
|
||||||
|
{
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
__set_errno (saved_errno);
|
||||||
|
return (char *) msgid;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Find structure describing the message catalog matching the
|
||||||
|
DOMAINNAME and CATEGORY. */
|
||||||
|
domain = _nl_find_domain (dirname, single_locale, xdomainname);
|
||||||
|
|
||||||
|
if (domain != NULL)
|
||||||
|
{
|
||||||
|
retval = find_msg (domain, msgid);
|
||||||
|
|
||||||
|
if (retval == NULL)
|
||||||
|
{
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
|
||||||
|
{
|
||||||
|
retval = find_msg (domain->successor[cnt], msgid);
|
||||||
|
|
||||||
|
if (retval != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (retval != NULL)
|
||||||
|
{
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
__set_errno (saved_errno);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Alias for function name in GNU C Library. */
|
||||||
|
weak_alias (__dcgettext, dcgettext);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static char *
|
||||||
|
internal_function
|
||||||
|
find_msg (domain_file, msgid)
|
||||||
|
struct loaded_l10nfile *domain_file;
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
size_t top, act, bottom;
|
||||||
|
struct loaded_domain *domain;
|
||||||
|
|
||||||
|
if (domain_file->decided == 0)
|
||||||
|
_nl_load_domain (domain_file);
|
||||||
|
|
||||||
|
if (domain_file->data == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
domain = (struct loaded_domain *) domain_file->data;
|
||||||
|
|
||||||
|
/* Locate the MSGID and its translation. */
|
||||||
|
if (domain->hash_size > 2 && domain->hash_tab != NULL)
|
||||||
|
{
|
||||||
|
/* Use the hashing table. */
|
||||||
|
nls_uint32 len = strlen (msgid);
|
||||||
|
nls_uint32 hash_val = hash_string (msgid);
|
||||||
|
nls_uint32 idx = hash_val % domain->hash_size;
|
||||||
|
nls_uint32 incr = 1 + (hash_val % (domain->hash_size - 2));
|
||||||
|
nls_uint32 nstr = W (domain->must_swap, domain->hash_tab[idx]);
|
||||||
|
|
||||||
|
if (nstr == 0)
|
||||||
|
/* Hash table entry is empty. */
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
|
||||||
|
&& strcmp (msgid,
|
||||||
|
domain->data + W (domain->must_swap,
|
||||||
|
domain->orig_tab[nstr - 1].offset)) == 0)
|
||||||
|
return (char *) domain->data + W (domain->must_swap,
|
||||||
|
domain->trans_tab[nstr - 1].offset);
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
|
if (idx >= domain->hash_size - incr)
|
||||||
|
idx -= domain->hash_size - incr;
|
||||||
|
else
|
||||||
|
idx += incr;
|
||||||
|
|
||||||
|
nstr = W (domain->must_swap, domain->hash_tab[idx]);
|
||||||
|
if (nstr == 0)
|
||||||
|
/* Hash table entry is empty. */
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (W (domain->must_swap, domain->orig_tab[nstr - 1].length) == len
|
||||||
|
&& strcmp (msgid,
|
||||||
|
domain->data + W (domain->must_swap,
|
||||||
|
domain->orig_tab[nstr - 1].offset))
|
||||||
|
== 0)
|
||||||
|
return (char *) domain->data
|
||||||
|
+ W (domain->must_swap, domain->trans_tab[nstr - 1].offset);
|
||||||
|
}
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now we try the default method: binary search in the sorted
|
||||||
|
array of messages. */
|
||||||
|
bottom = 0;
|
||||||
|
top = domain->nstrings;
|
||||||
|
while (bottom < top)
|
||||||
|
{
|
||||||
|
int cmp_val;
|
||||||
|
|
||||||
|
act = (bottom + top) / 2;
|
||||||
|
cmp_val = strcmp (msgid, domain->data
|
||||||
|
+ W (domain->must_swap,
|
||||||
|
domain->orig_tab[act].offset));
|
||||||
|
if (cmp_val < 0)
|
||||||
|
top = act;
|
||||||
|
else if (cmp_val > 0)
|
||||||
|
bottom = act + 1;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If an translation is found return this. */
|
||||||
|
return bottom >= top ? NULL : (char *) domain->data
|
||||||
|
+ W (domain->must_swap,
|
||||||
|
domain->trans_tab[act].offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Return string representation of locale CATEGORY. */
|
||||||
|
static const char *
|
||||||
|
internal_function
|
||||||
|
category_to_name (category)
|
||||||
|
int category;
|
||||||
|
{
|
||||||
|
const char *retval;
|
||||||
|
|
||||||
|
switch (category)
|
||||||
|
{
|
||||||
|
#ifdef LC_COLLATE
|
||||||
|
case LC_COLLATE:
|
||||||
|
retval = "LC_COLLATE";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_CTYPE
|
||||||
|
case LC_CTYPE:
|
||||||
|
retval = "LC_CTYPE";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_MONETARY
|
||||||
|
case LC_MONETARY:
|
||||||
|
retval = "LC_MONETARY";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_NUMERIC
|
||||||
|
case LC_NUMERIC:
|
||||||
|
retval = "LC_NUMERIC";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_TIME
|
||||||
|
case LC_TIME:
|
||||||
|
retval = "LC_TIME";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_MESSAGES
|
||||||
|
case LC_MESSAGES:
|
||||||
|
retval = "LC_MESSAGES";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_RESPONSE
|
||||||
|
case LC_RESPONSE:
|
||||||
|
retval = "LC_RESPONSE";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#ifdef LC_ALL
|
||||||
|
case LC_ALL:
|
||||||
|
/* This might not make sense but is perhaps better than any other
|
||||||
|
value. */
|
||||||
|
retval = "LC_ALL";
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
/* If you have a better idea for a default value let me know. */
|
||||||
|
retval = "LC_XXX";
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Guess value of current locale from value of the environment variables. */
|
||||||
|
static const char *
|
||||||
|
internal_function
|
||||||
|
guess_category_value (category, categoryname)
|
||||||
|
int category;
|
||||||
|
const char *categoryname;
|
||||||
|
{
|
||||||
|
const char *retval;
|
||||||
|
|
||||||
|
/* The highest priority value is the `LANGUAGE' environment
|
||||||
|
variable. This is a GNU extension. */
|
||||||
|
retval = getenv ("LANGUAGE");
|
||||||
|
if (retval != NULL && retval[0] != '\0')
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* `LANGUAGE' is not set. So we have to proceed with the POSIX
|
||||||
|
methods of looking to `LC_ALL', `LC_xxx', and `LANG'. On some
|
||||||
|
systems this can be done by the `setlocale' function itself. */
|
||||||
|
#if defined HAVE_SETLOCALE && defined HAVE_LC_MESSAGES && defined HAVE_LOCALE_NULL
|
||||||
|
return setlocale (category, NULL);
|
||||||
|
#else
|
||||||
|
/* Setting of LC_ALL overwrites all other. */
|
||||||
|
retval = getenv ("LC_ALL");
|
||||||
|
if (retval != NULL && retval[0] != '\0')
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* Next comes the name of the desired category. */
|
||||||
|
retval = getenv (categoryname);
|
||||||
|
if (retval != NULL && retval[0] != '\0')
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* Last possibility is the LANG environment variable. */
|
||||||
|
retval = getenv ("LANG");
|
||||||
|
if (retval != NULL && retval[0] != '\0')
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
/* We use C as the default domain. POSIX says this is implementation
|
||||||
|
defined. */
|
||||||
|
return "C";
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* @@ 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
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* If we want to free all resources we have to do some work at
|
||||||
|
program's end. */
|
||||||
|
static void __attribute__ ((unused))
|
||||||
|
free_mem (void)
|
||||||
|
{
|
||||||
|
struct binding *runp;
|
||||||
|
|
||||||
|
for (runp = _nl_domain_bindings; runp != NULL; runp = runp->next)
|
||||||
|
{
|
||||||
|
free (runp->domainname);
|
||||||
|
if (runp->dirname != _nl_default_dirname)
|
||||||
|
/* Yes, this is a pointer comparison. */
|
||||||
|
free (runp->dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_nl_current_default_domain != _nl_default_default_domain)
|
||||||
|
/* Yes, again a pointer comparison. */
|
||||||
|
free ((char *) _nl_current_default_domain);
|
||||||
|
}
|
||||||
|
|
||||||
|
text_set_element (__libc_subfreeres, free_mem);
|
||||||
|
#endif
|
||||||
59
intl/dgettext.c
Normal file
59
intl/dgettext.c
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/* Implementation of the dgettext(3) function
|
||||||
|
Copyright (C) 1995, 1996, 1997 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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_LOCALE_H || defined _LIBC
|
||||||
|
# include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
|
with existing names and they should follow ANSI C. But this source
|
||||||
|
code is also used in GNU C Library where the names have a __
|
||||||
|
prefix. So we have to make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define DGETTEXT __dgettext
|
||||||
|
# define DCGETTEXT __dcgettext
|
||||||
|
#else
|
||||||
|
# define DGETTEXT dgettext__
|
||||||
|
# define DCGETTEXT dcgettext__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog of the current
|
||||||
|
LC_MESSAGES locale. */
|
||||||
|
char *
|
||||||
|
DGETTEXT (domainname, msgid)
|
||||||
|
const char *domainname;
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
return DCGETTEXT (domainname, msgid, LC_MESSAGES);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Alias for function name in GNU C Library. */
|
||||||
|
weak_alias (__dgettext, dgettext);
|
||||||
|
#endif
|
||||||
188
intl/explodename.c
Normal file
188
intl/explodename.c
Normal file
@@ -0,0 +1,188 @@
|
|||||||
|
/* Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
#endif
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#include "loadinfo.h"
|
||||||
|
|
||||||
|
/* On some strange systems still no definition of NULL is found. Sigh! */
|
||||||
|
#ifndef NULL
|
||||||
|
# if defined __STDC__ && __STDC__
|
||||||
|
# define NULL ((void *) 0)
|
||||||
|
# else
|
||||||
|
# define NULL 0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
int
|
||||||
|
_nl_explode_name (name, language, modifier, territory, codeset,
|
||||||
|
normalized_codeset, special, sponsor, revision)
|
||||||
|
char *name;
|
||||||
|
const char **language;
|
||||||
|
const char **modifier;
|
||||||
|
const char **territory;
|
||||||
|
const char **codeset;
|
||||||
|
const char **normalized_codeset;
|
||||||
|
const char **special;
|
||||||
|
const char **sponsor;
|
||||||
|
const char **revision;
|
||||||
|
{
|
||||||
|
enum { undecided, xpg, cen } syntax;
|
||||||
|
char *cp;
|
||||||
|
int mask;
|
||||||
|
|
||||||
|
*modifier = NULL;
|
||||||
|
*territory = NULL;
|
||||||
|
*codeset = NULL;
|
||||||
|
*normalized_codeset = NULL;
|
||||||
|
*special = NULL;
|
||||||
|
*sponsor = NULL;
|
||||||
|
*revision = NULL;
|
||||||
|
|
||||||
|
/* Now we determine the single parts of the locale name. First
|
||||||
|
look for the language. Termination symbols are `_' and `@' if
|
||||||
|
we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
|
||||||
|
mask = 0;
|
||||||
|
syntax = undecided;
|
||||||
|
*language = cp = name;
|
||||||
|
while (cp[0] != '\0' && cp[0] != '_' && cp[0] != '@'
|
||||||
|
&& cp[0] != '+' && cp[0] != ',')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
if (*language == cp)
|
||||||
|
/* This does not make sense: language has to be specified. Use
|
||||||
|
this entry as it is without exploding. Perhaps it is an alias. */
|
||||||
|
cp = strchr (*language, '\0');
|
||||||
|
else if (cp[0] == '_')
|
||||||
|
{
|
||||||
|
/* Next is the territory. */
|
||||||
|
cp[0] = '\0';
|
||||||
|
*territory = ++cp;
|
||||||
|
|
||||||
|
while (cp[0] != '\0' && cp[0] != '.' && cp[0] != '@'
|
||||||
|
&& cp[0] != '+' && cp[0] != ',' && cp[0] != '_')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= TERRITORY;
|
||||||
|
|
||||||
|
if (cp[0] == '.')
|
||||||
|
{
|
||||||
|
/* Next is the codeset. */
|
||||||
|
syntax = xpg;
|
||||||
|
cp[0] = '\0';
|
||||||
|
*codeset = ++cp;
|
||||||
|
|
||||||
|
while (cp[0] != '\0' && cp[0] != '@')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= XPG_CODESET;
|
||||||
|
|
||||||
|
if (*codeset != cp && (*codeset)[0] != '\0')
|
||||||
|
{
|
||||||
|
*normalized_codeset = _nl_normalize_codeset (*codeset,
|
||||||
|
cp - *codeset);
|
||||||
|
if (strcmp (*codeset, *normalized_codeset) == 0)
|
||||||
|
free ((char *) *normalized_codeset);
|
||||||
|
else
|
||||||
|
mask |= XPG_NORM_CODESET;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cp[0] == '@' || (syntax != xpg && cp[0] == '+'))
|
||||||
|
{
|
||||||
|
/* Next is the modifier. */
|
||||||
|
syntax = cp[0] == '@' ? xpg : cen;
|
||||||
|
cp[0] = '\0';
|
||||||
|
*modifier = ++cp;
|
||||||
|
|
||||||
|
while (syntax == cen && cp[0] != '\0' && cp[0] != '+'
|
||||||
|
&& cp[0] != ',' && cp[0] != '_')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= XPG_MODIFIER | CEN_AUDIENCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (syntax != xpg && (cp[0] == '+' || cp[0] == ',' || cp[0] == '_'))
|
||||||
|
{
|
||||||
|
syntax = cen;
|
||||||
|
|
||||||
|
if (cp[0] == '+')
|
||||||
|
{
|
||||||
|
/* Next is special application (CEN syntax). */
|
||||||
|
cp[0] = '\0';
|
||||||
|
*special = ++cp;
|
||||||
|
|
||||||
|
while (cp[0] != '\0' && cp[0] != ',' && cp[0] != '_')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= CEN_SPECIAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cp[0] == ',')
|
||||||
|
{
|
||||||
|
/* Next is sponsor (CEN syntax). */
|
||||||
|
cp[0] = '\0';
|
||||||
|
*sponsor = ++cp;
|
||||||
|
|
||||||
|
while (cp[0] != '\0' && cp[0] != '_')
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
mask |= CEN_SPONSOR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cp[0] == '_')
|
||||||
|
{
|
||||||
|
/* Next is revision (CEN syntax). */
|
||||||
|
cp[0] = '\0';
|
||||||
|
*revision = ++cp;
|
||||||
|
|
||||||
|
mask |= CEN_REVISION;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For CEN syntax values it might be important to have the
|
||||||
|
separator character in the file name, not for XPG syntax. */
|
||||||
|
if (syntax == xpg)
|
||||||
|
{
|
||||||
|
if (*territory != NULL && (*territory)[0] == '\0')
|
||||||
|
mask &= ~TERRITORY;
|
||||||
|
|
||||||
|
if (*codeset != NULL && (*codeset)[0] == '\0')
|
||||||
|
mask &= ~XPG_CODESET;
|
||||||
|
|
||||||
|
if (*modifier != NULL && (*modifier)[0] == '\0')
|
||||||
|
mask &= ~XPG_MODIFIER;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mask;
|
||||||
|
}
|
||||||
216
intl/finddomain.c
Normal file
216
intl/finddomain.c
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
/* Handle list of needed message catalogs
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
# ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
# else
|
||||||
|
void free ();
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
# ifndef memcpy
|
||||||
|
# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !HAVE_STRCHR && !defined _LIBC
|
||||||
|
# ifndef strchr
|
||||||
|
# define strchr index
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_UNISTD_H || defined _LIBC
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "gettext.h"
|
||||||
|
#include "gettextP.h"
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
/* List of already loaded domains. */
|
||||||
|
static struct loaded_l10nfile *_nl_loaded_domains;
|
||||||
|
|
||||||
|
|
||||||
|
/* Return a data structure describing the message catalog described by
|
||||||
|
the DOMAINNAME and CATEGORY parameters with respect to the currently
|
||||||
|
established bindings. */
|
||||||
|
struct loaded_l10nfile *
|
||||||
|
internal_function
|
||||||
|
_nl_find_domain (dirname, locale, domainname)
|
||||||
|
const char *dirname;
|
||||||
|
char *locale;
|
||||||
|
const char *domainname;
|
||||||
|
{
|
||||||
|
struct loaded_l10nfile *retval;
|
||||||
|
const char *language;
|
||||||
|
const char *modifier;
|
||||||
|
const char *territory;
|
||||||
|
const char *codeset;
|
||||||
|
const char *normalized_codeset;
|
||||||
|
const char *special;
|
||||||
|
const char *sponsor;
|
||||||
|
const char *revision;
|
||||||
|
const char *alias_value;
|
||||||
|
int mask;
|
||||||
|
|
||||||
|
/* LOCALE can consist of up to four recognized parts for the XPG syntax:
|
||||||
|
|
||||||
|
language[_territory[.codeset]][@modifier]
|
||||||
|
|
||||||
|
and six parts for the CEN syntax:
|
||||||
|
|
||||||
|
language[_territory][+audience][+special][,[sponsor][_revision]]
|
||||||
|
|
||||||
|
Beside the first part all of them are allowed to be missing. If
|
||||||
|
the full specified locale is not found, the less specific one are
|
||||||
|
looked for. The various parts will be stripped off according to
|
||||||
|
the following order:
|
||||||
|
(1) revision
|
||||||
|
(2) sponsor
|
||||||
|
(3) special
|
||||||
|
(4) codeset
|
||||||
|
(5) normalized codeset
|
||||||
|
(6) territory
|
||||||
|
(7) audience/modifier
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* If we have already tested for this locale entry there has to
|
||||||
|
be one data set in the list of loaded domains. */
|
||||||
|
retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
|
||||||
|
strlen (dirname) + 1, 0, locale, NULL, NULL,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, domainname, 0);
|
||||||
|
if (retval != NULL)
|
||||||
|
{
|
||||||
|
/* We know something about this locale. */
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
if (retval->decided == 0)
|
||||||
|
_nl_load_domain (retval);
|
||||||
|
|
||||||
|
if (retval->data != NULL)
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
|
||||||
|
{
|
||||||
|
if (retval->successor[cnt]->decided == 0)
|
||||||
|
_nl_load_domain (retval->successor[cnt]);
|
||||||
|
|
||||||
|
if (retval->successor[cnt]->data != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return cnt >= 0 ? retval : NULL;
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* See whether the locale value is an alias. If yes its value
|
||||||
|
*overwrites* the alias name. No test for the original value is
|
||||||
|
done. */
|
||||||
|
alias_value = _nl_expand_alias (locale);
|
||||||
|
if (alias_value != NULL)
|
||||||
|
{
|
||||||
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
|
locale = strdup (alias_value);
|
||||||
|
if (locale == NULL)
|
||||||
|
return NULL;
|
||||||
|
#else
|
||||||
|
size_t len = strlen (alias_value) + 1;
|
||||||
|
locale = (char *) malloc (len);
|
||||||
|
if (locale == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
memcpy (locale, alias_value, len);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now we determine the single parts of the locale name. First
|
||||||
|
look for the language. Termination symbols are `_' and `@' if
|
||||||
|
we use XPG4 style, and `_', `+', and `,' if we use CEN syntax. */
|
||||||
|
mask = _nl_explode_name (locale, &language, &modifier, &territory,
|
||||||
|
&codeset, &normalized_codeset, &special,
|
||||||
|
&sponsor, &revision);
|
||||||
|
|
||||||
|
/* Create all possible locale entries which might be interested in
|
||||||
|
generalization. */
|
||||||
|
retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
|
||||||
|
strlen (dirname) + 1, mask, language, territory,
|
||||||
|
codeset, normalized_codeset, modifier, special,
|
||||||
|
sponsor, revision, domainname, 1);
|
||||||
|
if (retval == NULL)
|
||||||
|
/* This means we are out of core. */
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (retval->decided == 0)
|
||||||
|
_nl_load_domain (retval);
|
||||||
|
if (retval->data == NULL)
|
||||||
|
{
|
||||||
|
int cnt;
|
||||||
|
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
|
||||||
|
{
|
||||||
|
if (retval->successor[cnt]->decided == 0)
|
||||||
|
_nl_load_domain (retval->successor[cnt]);
|
||||||
|
if (retval->successor[cnt]->data != NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The room for an alias was dynamically allocated. Free it now. */
|
||||||
|
if (alias_value != NULL)
|
||||||
|
free (locale);
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
static void __attribute__ ((unused))
|
||||||
|
free_mem (void)
|
||||||
|
{
|
||||||
|
struct loaded_l10nfile *runp = _nl_loaded_domains;
|
||||||
|
|
||||||
|
while (runp != NULL)
|
||||||
|
{
|
||||||
|
struct loaded_l10nfile *here = runp;
|
||||||
|
if (runp->data != NULL)
|
||||||
|
_nl_unload_domain ((struct loaded_domain *) runp->data);
|
||||||
|
runp = runp->next;
|
||||||
|
free (here);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
text_set_element (__libc_subfreeres, free_mem);
|
||||||
|
#endif
|
||||||
70
intl/gettext.c
Normal file
70
intl/gettext.c
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
/* Implementation of gettext(3) function.
|
||||||
|
Copyright (C) 1995, 1997 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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define __need_NULL
|
||||||
|
# include <stddef.h>
|
||||||
|
#else
|
||||||
|
# ifdef STDC_HEADERS
|
||||||
|
# include <stdlib.h> /* Just for NULL. */
|
||||||
|
# else
|
||||||
|
# ifdef HAVE_STRING_H
|
||||||
|
# include <string.h>
|
||||||
|
# else
|
||||||
|
# define NULL ((void *) 0)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
|
with existing names and they should follow ANSI C. But this source
|
||||||
|
code is also used in GNU C Library where the names have a __
|
||||||
|
prefix. So we have to make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define GETTEXT __gettext
|
||||||
|
# define DGETTEXT __dgettext
|
||||||
|
#else
|
||||||
|
# define GETTEXT gettext__
|
||||||
|
# define DGETTEXT dgettext__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Look up MSGID in the current default message catalog for the current
|
||||||
|
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
||||||
|
text). */
|
||||||
|
char *
|
||||||
|
GETTEXT (msgid)
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
return DGETTEXT (NULL, msgid);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Alias for function name in GNU C Library. */
|
||||||
|
weak_alias (__gettext, gettext);
|
||||||
|
#endif
|
||||||
105
intl/gettext.h
Normal file
105
intl/gettext.h
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/* Internal header for GNU gettext internationalization functions.
|
||||||
|
Copyright (C) 1995, 1997 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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef _GETTEXT_H
|
||||||
|
#define _GETTEXT_H 1
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#if HAVE_LIMITS_H || _LIBC
|
||||||
|
# include <limits.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* The magic number of the GNU message catalog format. */
|
||||||
|
#define _MAGIC 0x950412de
|
||||||
|
#define _MAGIC_SWAPPED 0xde120495
|
||||||
|
|
||||||
|
/* Revision number of the currently used .mo (binary) file format. */
|
||||||
|
#define MO_REVISION_NUMBER 0
|
||||||
|
|
||||||
|
/* The following contortions are an attempt to use the C preprocessor
|
||||||
|
to determine an unsigned integral type that is 32 bits wide. An
|
||||||
|
alternative approach is to use autoconf's AC_CHECK_SIZEOF macro, but
|
||||||
|
doing that would require that the configure script compile and *run*
|
||||||
|
the resulting executable. Locally running cross-compiled executables
|
||||||
|
is usually not possible. */
|
||||||
|
|
||||||
|
#if __STDC__
|
||||||
|
# define UINT_MAX_32_BITS 4294967295U
|
||||||
|
#else
|
||||||
|
# define UINT_MAX_32_BITS 0xFFFFFFFF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If UINT_MAX isn't defined, assume it's a 32-bit type.
|
||||||
|
This should be valid for all systems GNU cares about because
|
||||||
|
that doesn't include 16-bit systems, and only modern systems
|
||||||
|
(that certainly have <limits.h>) have 64+-bit integral types. */
|
||||||
|
|
||||||
|
#ifndef UINT_MAX
|
||||||
|
# define UINT_MAX UINT_MAX_32_BITS
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if UINT_MAX == UINT_MAX_32_BITS
|
||||||
|
typedef unsigned nls_uint32;
|
||||||
|
#else
|
||||||
|
# if USHRT_MAX == UINT_MAX_32_BITS
|
||||||
|
typedef unsigned short nls_uint32;
|
||||||
|
# else
|
||||||
|
# if ULONG_MAX == UINT_MAX_32_BITS
|
||||||
|
typedef unsigned long nls_uint32;
|
||||||
|
# else
|
||||||
|
/* The following line is intended to throw an error. Using #error is
|
||||||
|
not portable enough. */
|
||||||
|
"Cannot determine unsigned 32-bit data type."
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Header for binary .mo file format. */
|
||||||
|
struct mo_file_header
|
||||||
|
{
|
||||||
|
/* The magic number. */
|
||||||
|
nls_uint32 magic;
|
||||||
|
/* The revision number of the file format. */
|
||||||
|
nls_uint32 revision;
|
||||||
|
/* The number of strings pairs. */
|
||||||
|
nls_uint32 nstrings;
|
||||||
|
/* Offset of table with start offsets of original strings. */
|
||||||
|
nls_uint32 orig_tab_offset;
|
||||||
|
/* Offset of table with start offsets of translation strings. */
|
||||||
|
nls_uint32 trans_tab_offset;
|
||||||
|
/* Size of hashing table. */
|
||||||
|
nls_uint32 hash_tab_size;
|
||||||
|
/* Offset of first hashing entry. */
|
||||||
|
nls_uint32 hash_tab_offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct string_desc
|
||||||
|
{
|
||||||
|
/* Length of addressed string. */
|
||||||
|
nls_uint32 length;
|
||||||
|
/* Offset of string in file. */
|
||||||
|
nls_uint32 offset;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
|
#endif /* gettext.h */
|
||||||
89
intl/gettextP.h
Normal file
89
intl/gettextP.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* Header describing internals of gettext library
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef _GETTEXTP_H
|
||||||
|
#define _GETTEXTP_H
|
||||||
|
|
||||||
|
#include "loadinfo.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifndef PARAMS
|
||||||
|
# if __STDC__
|
||||||
|
# define PARAMS(args) args
|
||||||
|
# else
|
||||||
|
# define PARAMS(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef internal_function
|
||||||
|
# define internal_function
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef W
|
||||||
|
# define W(flag, data) ((flag) ? SWAP (data) : (data))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <byteswap.h>
|
||||||
|
# define SWAP(i) bswap_32 (i)
|
||||||
|
#else
|
||||||
|
static nls_uint32 SWAP PARAMS ((nls_uint32 i));
|
||||||
|
|
||||||
|
static inline nls_uint32
|
||||||
|
SWAP (i)
|
||||||
|
nls_uint32 i;
|
||||||
|
{
|
||||||
|
return (i << 24) | ((i & 0xff00) << 8) | ((i >> 8) & 0xff00) | (i >> 24);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
struct loaded_domain
|
||||||
|
{
|
||||||
|
const char *data;
|
||||||
|
int use_mmap;
|
||||||
|
size_t mmap_size;
|
||||||
|
int must_swap;
|
||||||
|
nls_uint32 nstrings;
|
||||||
|
struct string_desc *orig_tab;
|
||||||
|
struct string_desc *trans_tab;
|
||||||
|
nls_uint32 hash_size;
|
||||||
|
nls_uint32 *hash_tab;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct binding
|
||||||
|
{
|
||||||
|
struct binding *next;
|
||||||
|
char *domainname;
|
||||||
|
char *dirname;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
|
||||||
|
char *__locale,
|
||||||
|
const char *__domainname))
|
||||||
|
internal_function;
|
||||||
|
void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain))
|
||||||
|
internal_function;
|
||||||
|
void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
|
||||||
|
internal_function;
|
||||||
|
|
||||||
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
|
#endif /* gettextP.h */
|
||||||
59
intl/hash-string.h
Normal file
59
intl/hash-string.h
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
/* Implements a string hashing function.
|
||||||
|
Copyright (C) 1995, 1997 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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifndef PARAMS
|
||||||
|
# if __STDC__
|
||||||
|
# define PARAMS(Args) Args
|
||||||
|
# else
|
||||||
|
# define PARAMS(Args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* We assume to have `unsigned long int' value with at least 32 bits. */
|
||||||
|
#define HASHWORDBITS 32
|
||||||
|
|
||||||
|
|
||||||
|
/* Defines the so called `hashpjw' function by P.J. Weinberger
|
||||||
|
[see Aho/Sethi/Ullman, COMPILERS: Principles, Techniques and Tools,
|
||||||
|
1986, 1987 Bell Telephone Laboratories, Inc.] */
|
||||||
|
static unsigned long hash_string PARAMS ((const char *__str_param));
|
||||||
|
|
||||||
|
static inline unsigned long
|
||||||
|
hash_string (str_param)
|
||||||
|
const char *str_param;
|
||||||
|
{
|
||||||
|
unsigned long int hval, g;
|
||||||
|
const char *str = str_param;
|
||||||
|
|
||||||
|
/* Compute the hash value for the given string. */
|
||||||
|
hval = 0;
|
||||||
|
while (*str != '\0')
|
||||||
|
{
|
||||||
|
hval <<= 4;
|
||||||
|
hval += (unsigned long) *str++;
|
||||||
|
g = hval & ((unsigned long) 0xf << (HASHWORDBITS - 4));
|
||||||
|
if (g != 0)
|
||||||
|
{
|
||||||
|
hval ^= g >> (HASHWORDBITS - 8);
|
||||||
|
hval ^= g;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return hval;
|
||||||
|
}
|
||||||
76
intl/intl-compat.c
Normal file
76
intl/intl-compat.c
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* intl-compat.c - Stub functions to call gettext functions from GNU gettext
|
||||||
|
Library.
|
||||||
|
Copyright (C) 1995 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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "libgettext.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
|
||||||
|
#undef gettext
|
||||||
|
#undef dgettext
|
||||||
|
#undef dcgettext
|
||||||
|
#undef textdomain
|
||||||
|
#undef bindtextdomain
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
bindtextdomain (domainname, dirname)
|
||||||
|
const char *domainname;
|
||||||
|
const char *dirname;
|
||||||
|
{
|
||||||
|
return bindtextdomain__ (domainname, dirname);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
dcgettext (domainname, msgid, category)
|
||||||
|
const char *domainname;
|
||||||
|
const char *msgid;
|
||||||
|
int category;
|
||||||
|
{
|
||||||
|
return dcgettext__ (domainname, msgid, category);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
dgettext (domainname, msgid)
|
||||||
|
const char *domainname;
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
return dgettext__ (domainname, msgid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
gettext (msgid)
|
||||||
|
const char *msgid;
|
||||||
|
{
|
||||||
|
return gettext__ (msgid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char *
|
||||||
|
textdomain (domainname)
|
||||||
|
const char *domainname;
|
||||||
|
{
|
||||||
|
return textdomain__ (domainname);
|
||||||
|
}
|
||||||
111
intl/intlh.inst.in
Normal file
111
intl/intlh.inst.in
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
/* Message catalogs for internationalization.
|
||||||
|
Copyright (C) 1995, 1996, 1997 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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
|
||||||
|
USA. */
|
||||||
|
|
||||||
|
#ifndef _LIBINTL_H
|
||||||
|
#define _LIBINTL_H 1
|
||||||
|
|
||||||
|
@INCLUDE_LOCALE_H@
|
||||||
|
|
||||||
|
/* We define an additional symbol to signal that we use the GNU
|
||||||
|
implementation of gettext. */
|
||||||
|
#define __USE_GNU_GETTEXT 1
|
||||||
|
|
||||||
|
#ifndef PARAMS
|
||||||
|
# if __STDC__ || defined __cplusplus
|
||||||
|
# define PARAMS(args) args
|
||||||
|
# else
|
||||||
|
# define PARAMS(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Look up MSGID in the current default message catalog for the current
|
||||||
|
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
||||||
|
text). */
|
||||||
|
extern char *gettext PARAMS ((const char *__msgid));
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current
|
||||||
|
LC_MESSAGES locale. */
|
||||||
|
extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
||||||
|
locale. */
|
||||||
|
extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
|
||||||
|
int __category));
|
||||||
|
|
||||||
|
|
||||||
|
/* Set the current default message catalog to DOMAINNAME.
|
||||||
|
If DOMAINNAME is null, return the current default.
|
||||||
|
If DOMAINNAME is "", reset to the default of "messages". */
|
||||||
|
extern char *textdomain PARAMS ((const char *__domainname));
|
||||||
|
|
||||||
|
/* Specify that the DOMAINNAME message catalog will be found
|
||||||
|
in DIRNAME rather than in the system locale data base. */
|
||||||
|
extern char *bindtextdomain PARAMS ((const char *__domainname,
|
||||||
|
const char *__dirname));
|
||||||
|
|
||||||
|
|
||||||
|
/* Optimized version of the functions above. */
|
||||||
|
#if defined __OPTIMIZED
|
||||||
|
/* These must be a macro. Inlined functions are useless because the
|
||||||
|
`__builtin_constant_p' predicate in dcgettext would always return
|
||||||
|
false. */
|
||||||
|
|
||||||
|
# define gettext(msgid) dgettext ((char *) 0, msgid)
|
||||||
|
|
||||||
|
# define dgettext(domainname, msgid) \
|
||||||
|
dcgettext (domainname, msgid, LC_MESSAGES)
|
||||||
|
|
||||||
|
# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
/* This global variable is defined in loadmsgcat.c. We need a sign,
|
||||||
|
whether a new catalog was loaded, which can be associated with all
|
||||||
|
translations. */
|
||||||
|
extern int _nl_msg_cat_cntr;
|
||||||
|
|
||||||
|
# define dcgettext(domainname, msgid, category) \
|
||||||
|
(__extension__ \
|
||||||
|
({ \
|
||||||
|
char *__result; \
|
||||||
|
if (__builtin_constant_p (msgid)) \
|
||||||
|
{ \
|
||||||
|
static char *__translation__; \
|
||||||
|
static int __catalog_counter__; \
|
||||||
|
if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \
|
||||||
|
{ \
|
||||||
|
__translation__ = \
|
||||||
|
(dcgettext) ((domainname), (msgid), (category)); \
|
||||||
|
__catalog_counter__ = _nl_msg_cat_cntr; \
|
||||||
|
} \
|
||||||
|
__result = __translation__; \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
__result = (dcgettext) ((domainname), (msgid), (category)); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
# endif
|
||||||
|
#endif /* Optimizing. */
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* libintl.h */
|
||||||
411
intl/l10nflist.c
Normal file
411
intl/l10nflist.c
Normal file
@@ -0,0 +1,411 @@
|
|||||||
|
/* Handle list of needed message catalogs
|
||||||
|
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# ifndef _GNU_SOURCE
|
||||||
|
# define _GNU_SOURCE 1
|
||||||
|
# endif
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
# ifndef memcpy
|
||||||
|
# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !HAVE_STRCHR && !defined _LIBC
|
||||||
|
# ifndef strchr
|
||||||
|
# define strchr index
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined _LIBC || defined HAVE_ARGZ_H
|
||||||
|
# include <argz.h>
|
||||||
|
#endif
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "loadinfo.h"
|
||||||
|
|
||||||
|
/* On some strange systems still no definition of NULL is found. Sigh! */
|
||||||
|
#ifndef NULL
|
||||||
|
# if defined __STDC__ && __STDC__
|
||||||
|
# define NULL ((void *) 0)
|
||||||
|
# else
|
||||||
|
# define NULL 0
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Rename the non ANSI C functions. This is required by the standard
|
||||||
|
because some ANSI C functions will require linking with this object
|
||||||
|
file and the name space must not be polluted. */
|
||||||
|
# ifndef stpcpy
|
||||||
|
# define stpcpy(dest, src) __stpcpy(dest, src)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# ifndef HAVE_STPCPY
|
||||||
|
static char *stpcpy PARAMS ((char *dest, const char *src));
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Define function which are usually not available. */
|
||||||
|
|
||||||
|
#if !defined _LIBC && !defined HAVE___ARGZ_COUNT
|
||||||
|
/* Returns the number of strings in ARGZ. */
|
||||||
|
static size_t argz_count__ PARAMS ((const char *argz, size_t len));
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
argz_count__ (argz, len)
|
||||||
|
const char *argz;
|
||||||
|
size_t len;
|
||||||
|
{
|
||||||
|
size_t count = 0;
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
size_t part_len = strlen (argz);
|
||||||
|
argz += part_len + 1;
|
||||||
|
len -= part_len + 1;
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
# undef __argz_count
|
||||||
|
# define __argz_count(argz, len) argz_count__ (argz, len)
|
||||||
|
#endif /* !_LIBC && !HAVE___ARGZ_COUNT */
|
||||||
|
|
||||||
|
#if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
|
||||||
|
/* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
|
||||||
|
except the last into the character SEP. */
|
||||||
|
static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
|
||||||
|
|
||||||
|
static void
|
||||||
|
argz_stringify__ (argz, len, sep)
|
||||||
|
char *argz;
|
||||||
|
size_t len;
|
||||||
|
int sep;
|
||||||
|
{
|
||||||
|
while (len > 0)
|
||||||
|
{
|
||||||
|
size_t part_len = strlen (argz);
|
||||||
|
argz += part_len;
|
||||||
|
len -= part_len + 1;
|
||||||
|
if (len > 0)
|
||||||
|
*argz++ = sep;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# undef __argz_stringify
|
||||||
|
# define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
|
||||||
|
#endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
|
||||||
|
|
||||||
|
#if !defined _LIBC && !defined HAVE___ARGZ_NEXT
|
||||||
|
static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
|
||||||
|
const char *entry));
|
||||||
|
|
||||||
|
static char *
|
||||||
|
argz_next__ (argz, argz_len, entry)
|
||||||
|
char *argz;
|
||||||
|
size_t argz_len;
|
||||||
|
const char *entry;
|
||||||
|
{
|
||||||
|
if (entry)
|
||||||
|
{
|
||||||
|
if (entry < argz + argz_len)
|
||||||
|
entry = strchr (entry, '\0') + 1;
|
||||||
|
|
||||||
|
return entry >= argz + argz_len ? NULL : (char *) entry;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (argz_len > 0)
|
||||||
|
return argz;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
# undef __argz_next
|
||||||
|
# define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
|
||||||
|
#endif /* !_LIBC && !HAVE___ARGZ_NEXT */
|
||||||
|
|
||||||
|
|
||||||
|
/* Return number of bits set in X. */
|
||||||
|
static int pop PARAMS ((int x));
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
pop (x)
|
||||||
|
int x;
|
||||||
|
{
|
||||||
|
/* We assume that no more than 16 bits are used. */
|
||||||
|
x = ((x & ~0x5555) >> 1) + (x & 0x5555);
|
||||||
|
x = ((x & ~0x3333) >> 2) + (x & 0x3333);
|
||||||
|
x = ((x >> 4) + x) & 0x0f0f;
|
||||||
|
x = ((x >> 8) + x) & 0xff;
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct loaded_l10nfile *
|
||||||
|
_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
|
||||||
|
territory, codeset, normalized_codeset, modifier, special,
|
||||||
|
sponsor, revision, filename, do_allocate)
|
||||||
|
struct loaded_l10nfile **l10nfile_list;
|
||||||
|
const char *dirlist;
|
||||||
|
size_t dirlist_len;
|
||||||
|
int mask;
|
||||||
|
const char *language;
|
||||||
|
const char *territory;
|
||||||
|
const char *codeset;
|
||||||
|
const char *normalized_codeset;
|
||||||
|
const char *modifier;
|
||||||
|
const char *special;
|
||||||
|
const char *sponsor;
|
||||||
|
const char *revision;
|
||||||
|
const char *filename;
|
||||||
|
int do_allocate;
|
||||||
|
{
|
||||||
|
char *abs_filename;
|
||||||
|
struct loaded_l10nfile *last = NULL;
|
||||||
|
struct loaded_l10nfile *retval;
|
||||||
|
char *cp;
|
||||||
|
size_t entries;
|
||||||
|
int cnt;
|
||||||
|
|
||||||
|
/* Allocate room for the full file name. */
|
||||||
|
abs_filename = (char *) malloc (dirlist_len
|
||||||
|
+ strlen (language)
|
||||||
|
+ ((mask & TERRITORY) != 0
|
||||||
|
? strlen (territory) + 1 : 0)
|
||||||
|
+ ((mask & XPG_CODESET) != 0
|
||||||
|
? strlen (codeset) + 1 : 0)
|
||||||
|
+ ((mask & XPG_NORM_CODESET) != 0
|
||||||
|
? strlen (normalized_codeset) + 1 : 0)
|
||||||
|
+ (((mask & XPG_MODIFIER) != 0
|
||||||
|
|| (mask & CEN_AUDIENCE) != 0)
|
||||||
|
? strlen (modifier) + 1 : 0)
|
||||||
|
+ ((mask & CEN_SPECIAL) != 0
|
||||||
|
? strlen (special) + 1 : 0)
|
||||||
|
+ (((mask & CEN_SPONSOR) != 0
|
||||||
|
|| (mask & CEN_REVISION) != 0)
|
||||||
|
? (1 + ((mask & CEN_SPONSOR) != 0
|
||||||
|
? strlen (sponsor) + 1 : 0)
|
||||||
|
+ ((mask & CEN_REVISION) != 0
|
||||||
|
? strlen (revision) + 1 : 0)) : 0)
|
||||||
|
+ 1 + strlen (filename) + 1);
|
||||||
|
|
||||||
|
if (abs_filename == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
retval = NULL;
|
||||||
|
last = NULL;
|
||||||
|
|
||||||
|
/* Construct file name. */
|
||||||
|
memcpy (abs_filename, dirlist, dirlist_len);
|
||||||
|
__argz_stringify (abs_filename, dirlist_len, ':');
|
||||||
|
cp = abs_filename + (dirlist_len - 1);
|
||||||
|
*cp++ = '/';
|
||||||
|
cp = stpcpy (cp, language);
|
||||||
|
|
||||||
|
if ((mask & TERRITORY) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = '_';
|
||||||
|
cp = stpcpy (cp, territory);
|
||||||
|
}
|
||||||
|
if ((mask & XPG_CODESET) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = '.';
|
||||||
|
cp = stpcpy (cp, codeset);
|
||||||
|
}
|
||||||
|
if ((mask & XPG_NORM_CODESET) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = '.';
|
||||||
|
cp = stpcpy (cp, normalized_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 | CEN_REVISION)) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = ',';
|
||||||
|
if ((mask & CEN_SPONSOR) != 0)
|
||||||
|
cp = stpcpy (cp, sponsor);
|
||||||
|
if ((mask & CEN_REVISION) != 0)
|
||||||
|
{
|
||||||
|
*cp++ = '_';
|
||||||
|
cp = stpcpy (cp, revision);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*cp++ = '/';
|
||||||
|
stpcpy (cp, filename);
|
||||||
|
|
||||||
|
/* Look in list of already loaded domains whether it is already
|
||||||
|
available. */
|
||||||
|
last = NULL;
|
||||||
|
for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
|
||||||
|
if (retval->filename != NULL)
|
||||||
|
{
|
||||||
|
int compare = strcmp (retval->filename, abs_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 (abs_filename);
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = (struct loaded_l10nfile *)
|
||||||
|
malloc (sizeof (*retval) + (__argz_count (dirlist, dirlist_len)
|
||||||
|
* (1 << pop (mask))
|
||||||
|
* sizeof (struct loaded_l10nfile *)));
|
||||||
|
if (retval == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
retval->filename = abs_filename;
|
||||||
|
retval->decided = (__argz_count (dirlist, dirlist_len) != 1
|
||||||
|
|| ((mask & XPG_CODESET) != 0
|
||||||
|
&& (mask & XPG_NORM_CODESET) != 0));
|
||||||
|
retval->data = NULL;
|
||||||
|
|
||||||
|
if (last == NULL)
|
||||||
|
{
|
||||||
|
retval->next = *l10nfile_list;
|
||||||
|
*l10nfile_list = retval;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
retval->next = last->next;
|
||||||
|
last->next = retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
entries = 0;
|
||||||
|
/* If the DIRLIST is a real list the RETVAL entry corresponds not to
|
||||||
|
a real file. So we have to use the DIRLIST separation mechanism
|
||||||
|
of the inner loop. */
|
||||||
|
cnt = __argz_count (dirlist, dirlist_len) == 1 ? mask - 1 : mask;
|
||||||
|
for (; cnt >= 0; --cnt)
|
||||||
|
if ((cnt & ~mask) == 0
|
||||||
|
&& ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
|
||||||
|
&& ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
|
||||||
|
{
|
||||||
|
/* Iterate over all elements of the DIRLIST. */
|
||||||
|
char *dir = NULL;
|
||||||
|
|
||||||
|
while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
|
||||||
|
!= NULL)
|
||||||
|
retval->successor[entries++]
|
||||||
|
= _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt,
|
||||||
|
language, territory, codeset,
|
||||||
|
normalized_codeset, modifier, special,
|
||||||
|
sponsor, revision, filename, 1);
|
||||||
|
}
|
||||||
|
retval->successor[entries] = NULL;
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Normalize codeset name. There is no standard for the codeset
|
||||||
|
names. Normalization allows the user to use any of the common
|
||||||
|
names. */
|
||||||
|
const char *
|
||||||
|
_nl_normalize_codeset (codeset, name_len)
|
||||||
|
const unsigned char *codeset;
|
||||||
|
size_t name_len;
|
||||||
|
{
|
||||||
|
int len = 0;
|
||||||
|
int only_digit = 1;
|
||||||
|
char *retval;
|
||||||
|
char *wp;
|
||||||
|
size_t cnt;
|
||||||
|
|
||||||
|
for (cnt = 0; cnt < name_len; ++cnt)
|
||||||
|
if (isalnum (codeset[cnt]))
|
||||||
|
{
|
||||||
|
++len;
|
||||||
|
|
||||||
|
if (isalpha (codeset[cnt]))
|
||||||
|
only_digit = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
|
||||||
|
|
||||||
|
if (retval != NULL)
|
||||||
|
{
|
||||||
|
if (only_digit)
|
||||||
|
wp = stpcpy (retval, "iso");
|
||||||
|
else
|
||||||
|
wp = retval;
|
||||||
|
|
||||||
|
for (cnt = 0; cnt < name_len; ++cnt)
|
||||||
|
if (isalpha (codeset[cnt]))
|
||||||
|
*wp++ = tolower (codeset[cnt]);
|
||||||
|
else if (isdigit (codeset[cnt]))
|
||||||
|
*wp++ = codeset[cnt];
|
||||||
|
|
||||||
|
*wp = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
return (const char *) 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
|
||||||
182
intl/libgettext.h
Normal file
182
intl/libgettext.h
Normal file
@@ -0,0 +1,182 @@
|
|||||||
|
/* Message catalogs for internationalization.
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
/* Because on some systems (e.g. Solaris) we sometimes have to include
|
||||||
|
the systems libintl.h as well as this file we have more complex
|
||||||
|
include protection above. But the systems header might perhaps also
|
||||||
|
define _LIBINTL_H and therefore we have to protect the definition here. */
|
||||||
|
|
||||||
|
#if !defined _LIBINTL_H || !defined _LIBGETTEXT_H
|
||||||
|
#ifndef _LIBINTL_H
|
||||||
|
# define _LIBINTL_H 1
|
||||||
|
#endif
|
||||||
|
#define _LIBGETTEXT_H 1
|
||||||
|
|
||||||
|
/* We define an additional symbol to signal that we use the GNU
|
||||||
|
implementation of gettext. */
|
||||||
|
#define __USE_GNU_GETTEXT 1
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if HAVE_LOCALE_H
|
||||||
|
# include <locale.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifndef PARAMS
|
||||||
|
# if __STDC__ || defined __cplusplus
|
||||||
|
# define PARAMS(args) args
|
||||||
|
# else
|
||||||
|
# define PARAMS(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef NULL
|
||||||
|
# if !defined __cplusplus || defined __GNUC__
|
||||||
|
# define NULL ((void *) 0)
|
||||||
|
# else
|
||||||
|
# define NULL (0)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !HAVE_LC_MESSAGES
|
||||||
|
/* This value determines the behaviour of the gettext() and dgettext()
|
||||||
|
function. But some system does not have this defined. Define it
|
||||||
|
to a default value. */
|
||||||
|
# define LC_MESSAGES (-1)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Declarations for gettext-using-catgets interface. Derived from
|
||||||
|
Jim Meyering's libintl.h. */
|
||||||
|
struct _msg_ent
|
||||||
|
{
|
||||||
|
const char *_msg;
|
||||||
|
int _msg_number;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#if HAVE_CATGETS
|
||||||
|
/* These two variables are defined in the automatically by po-to-tbl.sed
|
||||||
|
generated file `cat-id-tbl.c'. */
|
||||||
|
extern const struct _msg_ent _msg_tbl[];
|
||||||
|
extern int _msg_tbl_length;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* For automatical extraction of messages sometimes no real
|
||||||
|
translation is needed. Instead the string itself is the result. */
|
||||||
|
#define gettext_noop(Str) (Str)
|
||||||
|
|
||||||
|
/* Look up MSGID in the current default message catalog for the current
|
||||||
|
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
||||||
|
text). */
|
||||||
|
extern char *gettext PARAMS ((const char *__msgid));
|
||||||
|
extern char *gettext__ PARAMS ((const char *__msgid));
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current
|
||||||
|
LC_MESSAGES locale. */
|
||||||
|
extern char *dgettext PARAMS ((const char *__domainname, const char *__msgid));
|
||||||
|
extern char *dgettext__ PARAMS ((const char *__domainname,
|
||||||
|
const char *__msgid));
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
||||||
|
locale. */
|
||||||
|
extern char *dcgettext PARAMS ((const char *__domainname, const char *__msgid,
|
||||||
|
int __category));
|
||||||
|
extern char *dcgettext__ PARAMS ((const char *__domainname,
|
||||||
|
const char *__msgid, int __category));
|
||||||
|
|
||||||
|
|
||||||
|
/* Set the current default message catalog to DOMAINNAME.
|
||||||
|
If DOMAINNAME is null, return the current default.
|
||||||
|
If DOMAINNAME is "", reset to the default of "messages". */
|
||||||
|
extern char *textdomain PARAMS ((const char *__domainname));
|
||||||
|
extern char *textdomain__ PARAMS ((const char *__domainname));
|
||||||
|
|
||||||
|
/* Specify that the DOMAINNAME message catalog will be found
|
||||||
|
in DIRNAME rather than in the system locale data base. */
|
||||||
|
extern char *bindtextdomain PARAMS ((const char *__domainname,
|
||||||
|
const char *__dirname));
|
||||||
|
extern char *bindtextdomain__ PARAMS ((const char *__domainname,
|
||||||
|
const char *__dirname));
|
||||||
|
|
||||||
|
#if ENABLE_NLS
|
||||||
|
|
||||||
|
/* Solaris 2.3 has the gettext function but dcgettext is missing.
|
||||||
|
So we omit this optimization for Solaris 2.3. BTW, Solaris 2.4
|
||||||
|
has dcgettext. */
|
||||||
|
# if !HAVE_CATGETS && (!HAVE_GETTEXT || HAVE_DCGETTEXT)
|
||||||
|
|
||||||
|
# define gettext(Msgid) \
|
||||||
|
dgettext (NULL, Msgid)
|
||||||
|
|
||||||
|
# define dgettext(Domainname, Msgid) \
|
||||||
|
dcgettext (Domainname, Msgid, LC_MESSAGES)
|
||||||
|
|
||||||
|
# if defined __GNUC__ && __GNUC__ == 2 && __GNUC_MINOR__ >= 7
|
||||||
|
/* This global variable is defined in loadmsgcat.c. We need a sign,
|
||||||
|
whether a new catalog was loaded, which can be associated with all
|
||||||
|
translations. */
|
||||||
|
extern int _nl_msg_cat_cntr;
|
||||||
|
|
||||||
|
# define dcgettext(Domainname, Msgid, Category) \
|
||||||
|
(__extension__ \
|
||||||
|
({ \
|
||||||
|
char *__result; \
|
||||||
|
if (__builtin_constant_p (Msgid)) \
|
||||||
|
{ \
|
||||||
|
static char *__translation__; \
|
||||||
|
static int __catalog_counter__; \
|
||||||
|
if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \
|
||||||
|
{ \
|
||||||
|
__translation__ = \
|
||||||
|
dcgettext__ (Domainname, Msgid, Category); \
|
||||||
|
__catalog_counter__ = _nl_msg_cat_cntr; \
|
||||||
|
} \
|
||||||
|
__result = __translation__; \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
__result = dcgettext__ (Domainname, Msgid, Category); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
# define gettext(Msgid) (Msgid)
|
||||||
|
# define dgettext(Domainname, Msgid) (Msgid)
|
||||||
|
# define dcgettext(Domainname, Msgid, Category) (Msgid)
|
||||||
|
# define textdomain(Domainname) ((char *) Domainname)
|
||||||
|
# define bindtextdomain(Domainname, Dirname) ((char *) Dirname)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ begin of epilog @@ */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
120
intl/libintl.glibc
Normal file
120
intl/libintl.glibc
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/* Message catalogs for internationalization.
|
||||||
|
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
This file is derived from the file libgettext.h in the GNU gettext package.
|
||||||
|
|
||||||
|
This file is part of the GNU C Library. Its master source is NOT part of
|
||||||
|
the C library, however.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
|
||||||
|
Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef _LIBINTL_H
|
||||||
|
#define _LIBINTL_H 1
|
||||||
|
|
||||||
|
#include <features.h>
|
||||||
|
|
||||||
|
/* We define an additional symbol to signal that we use the GNU
|
||||||
|
implementation of gettext. */
|
||||||
|
#define __USE_GNU_GETTEXT 1
|
||||||
|
|
||||||
|
__BEGIN_DECLS
|
||||||
|
|
||||||
|
/* Look up MSGID in the current default message catalog for the current
|
||||||
|
LC_MESSAGES locale. If not found, returns MSGID itself (the default
|
||||||
|
text). */
|
||||||
|
extern char *gettext __P ((__const char *__msgid));
|
||||||
|
extern char *__gettext __P ((__const char *__msgid));
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current
|
||||||
|
LC_MESSAGES locale. */
|
||||||
|
extern char *dgettext __P ((__const char *__domainname,
|
||||||
|
__const char *__msgid));
|
||||||
|
extern char *__dgettext __P ((__const char *__domainname,
|
||||||
|
__const char *__msgid));
|
||||||
|
|
||||||
|
/* Look up MSGID in the DOMAINNAME message catalog for the current CATEGORY
|
||||||
|
locale. */
|
||||||
|
extern char *dcgettext __P ((__const char *__domainname,
|
||||||
|
__const char *__msgid, int __category));
|
||||||
|
extern char *__dcgettext __P ((__const char *__domainname,
|
||||||
|
__const char *__msgid, int __category));
|
||||||
|
|
||||||
|
|
||||||
|
/* Set the current default message catalog to DOMAINNAME.
|
||||||
|
If DOMAINNAME is null, return the current default.
|
||||||
|
If DOMAINNAME is "", reset to the default of "messages". */
|
||||||
|
extern char *textdomain __P ((__const char *__domainname));
|
||||||
|
extern char *__textdomain __P ((__const char *__domainname));
|
||||||
|
|
||||||
|
/* Specify that the DOMAINNAME message catalog will be found
|
||||||
|
in DIRNAME rather than in the system locale data base. */
|
||||||
|
extern char *bindtextdomain __P ((__const char *__domainname,
|
||||||
|
__const char *__dirname));
|
||||||
|
extern char *__bindtextdomain __P ((__const char *__domainname,
|
||||||
|
__const char *__dirname));
|
||||||
|
|
||||||
|
|
||||||
|
/* Optimized version of the function above. */
|
||||||
|
#if defined __OPTIMIZE__
|
||||||
|
|
||||||
|
/* We need NULL for `gettext'. */
|
||||||
|
# define __need_NULL
|
||||||
|
# include <stddef.h>
|
||||||
|
|
||||||
|
/* We need LC_MESSAGES for `dgettext'. */
|
||||||
|
# include <locale.h>
|
||||||
|
|
||||||
|
/* These must be macros. Inlined functions are useless because the
|
||||||
|
`__builtin_constant_p' predicate in dcgettext would always return
|
||||||
|
false. */
|
||||||
|
|
||||||
|
# define gettext(msgid) dgettext (NULL, msgid)
|
||||||
|
|
||||||
|
# define dgettext(domainname, msgid) \
|
||||||
|
dcgettext (domainname, msgid, LC_MESSAGES)
|
||||||
|
|
||||||
|
# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
|
||||||
|
/* Variable defined in loadmsgcat.c which gets incremented every time a
|
||||||
|
new catalog is loaded. */
|
||||||
|
extern int _nl_msg_cat_cntr;
|
||||||
|
|
||||||
|
# define dcgettext(domainname, msgid, category) \
|
||||||
|
(__extension__ \
|
||||||
|
({ \
|
||||||
|
char *__result; \
|
||||||
|
if (__builtin_constant_p (msgid)) \
|
||||||
|
{ \
|
||||||
|
static char *__translation__; \
|
||||||
|
static int __catalog_counter__; \
|
||||||
|
if (! __translation__ || __catalog_counter__ != _nl_msg_cat_cntr) \
|
||||||
|
{ \
|
||||||
|
__translation__ = \
|
||||||
|
__dcgettext ((domainname), (msgid), (category)); \
|
||||||
|
__catalog_counter__ = _nl_msg_cat_cntr; \
|
||||||
|
} \
|
||||||
|
__result = __translation__; \
|
||||||
|
} \
|
||||||
|
else \
|
||||||
|
__result = __dcgettext ((domainname), (msgid), (category)); \
|
||||||
|
__result; \
|
||||||
|
}))
|
||||||
|
# endif
|
||||||
|
#endif /* Optimizing. */
|
||||||
|
|
||||||
|
|
||||||
|
__END_DECLS
|
||||||
|
|
||||||
|
#endif /* libintl.h */
|
||||||
100
intl/linux-msg.sed
Normal file
100
intl/linux-msg.sed
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# po2msg.sed - Convert Uniforum style .po file to Linux style .msg file
|
||||||
|
# Copyright 1995, 2002 Free Software Foundation, Inc.
|
||||||
|
# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# The first directive in the .msg should be the definition of the
|
||||||
|
# message set number. We use always set number 1.
|
||||||
|
#
|
||||||
|
1 {
|
||||||
|
i\
|
||||||
|
$set 1 # Automatically created by po2msg.sed
|
||||||
|
h
|
||||||
|
s/.*/0/
|
||||||
|
x
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# Mitch's old catalog format does not allow comments.
|
||||||
|
#
|
||||||
|
# We copy the original message as a comment into the .msg file.
|
||||||
|
#
|
||||||
|
/^msgid/ {
|
||||||
|
s/msgid[ ]*"//
|
||||||
|
#
|
||||||
|
# This does not work now with the new format.
|
||||||
|
# /"$/! {
|
||||||
|
# s/\\$//
|
||||||
|
# s/$/ ... (more lines following)"/
|
||||||
|
# }
|
||||||
|
x
|
||||||
|
# The following nice solution is by
|
||||||
|
# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
|
||||||
|
td
|
||||||
|
# Increment a decimal number in pattern space.
|
||||||
|
# First hide trailing `9' digits.
|
||||||
|
:d
|
||||||
|
s/9\(_*\)$/_\1/
|
||||||
|
td
|
||||||
|
# Assure at least one digit is available.
|
||||||
|
s/^\(_*\)$/0\1/
|
||||||
|
# Increment the last digit.
|
||||||
|
s/8\(_*\)$/9\1/
|
||||||
|
s/7\(_*\)$/8\1/
|
||||||
|
s/6\(_*\)$/7\1/
|
||||||
|
s/5\(_*\)$/6\1/
|
||||||
|
s/4\(_*\)$/5\1/
|
||||||
|
s/3\(_*\)$/4\1/
|
||||||
|
s/2\(_*\)$/3\1/
|
||||||
|
s/1\(_*\)$/2\1/
|
||||||
|
s/0\(_*\)$/1\1/
|
||||||
|
# Convert the hidden `9' digits to `0's.
|
||||||
|
s/_/0/g
|
||||||
|
x
|
||||||
|
G
|
||||||
|
s/\(.*\)"\n\([0-9]*\)/$ #\2 Original Message:(\1)/p
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# The .msg file contains, other than the .po file, only the translations
|
||||||
|
# but each given a unique ID. Starting from 1 and incrementing by 1 for
|
||||||
|
# each message we assign them to the messages.
|
||||||
|
# It is important that the .po file used to generate the cat-id-tbl.c file
|
||||||
|
# (with po-to-tbl) is the same as the one used here. (At least the order
|
||||||
|
# of declarations must not be changed.)
|
||||||
|
#
|
||||||
|
/^msgstr/ {
|
||||||
|
s/msgstr[ ]*"\(.*\)"/# \1/
|
||||||
|
# Clear substitution flag.
|
||||||
|
tb
|
||||||
|
# Append the next line.
|
||||||
|
:b
|
||||||
|
N
|
||||||
|
# Look whether second part is continuation line.
|
||||||
|
s/\(.*\n\)"\(.*\)"/\1\2/
|
||||||
|
# Yes, then branch.
|
||||||
|
ta
|
||||||
|
P
|
||||||
|
D
|
||||||
|
# Note that D includes a jump to the start!!
|
||||||
|
# We found a continuation line. But before printing insert '\'.
|
||||||
|
:a
|
||||||
|
s/\(.*\)\(\n.*\)/\1\\\2/
|
||||||
|
P
|
||||||
|
# We cannot use D here.
|
||||||
|
s/.*\n\(.*\)/\1/
|
||||||
|
tb
|
||||||
|
}
|
||||||
|
d
|
||||||
76
intl/loadinfo.h
Normal file
76
intl/loadinfo.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef PARAMS
|
||||||
|
# if __STDC__
|
||||||
|
# define PARAMS(args) args
|
||||||
|
# else
|
||||||
|
# define PARAMS(args) ()
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Encoding of locale name parts. */
|
||||||
|
#define CEN_REVISION 1
|
||||||
|
#define CEN_SPONSOR 2
|
||||||
|
#define CEN_SPECIAL 4
|
||||||
|
#define XPG_NORM_CODESET 8
|
||||||
|
#define XPG_CODESET 16
|
||||||
|
#define TERRITORY 32
|
||||||
|
#define CEN_AUDIENCE 64
|
||||||
|
#define XPG_MODIFIER 128
|
||||||
|
|
||||||
|
#define CEN_SPECIFIC (CEN_REVISION|CEN_SPONSOR|CEN_SPECIAL|CEN_AUDIENCE)
|
||||||
|
#define XPG_SPECIFIC (XPG_CODESET|XPG_NORM_CODESET|XPG_MODIFIER)
|
||||||
|
|
||||||
|
|
||||||
|
struct loaded_l10nfile
|
||||||
|
{
|
||||||
|
const char *filename;
|
||||||
|
int decided;
|
||||||
|
|
||||||
|
const void *data;
|
||||||
|
|
||||||
|
struct loaded_l10nfile *next;
|
||||||
|
struct loaded_l10nfile *successor[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
extern const char *_nl_normalize_codeset PARAMS ((const unsigned char *codeset,
|
||||||
|
size_t name_len));
|
||||||
|
|
||||||
|
extern struct loaded_l10nfile *
|
||||||
|
_nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list,
|
||||||
|
const char *dirlist, size_t dirlist_len, int mask,
|
||||||
|
const char *language, const char *territory,
|
||||||
|
const char *codeset,
|
||||||
|
const char *normalized_codeset,
|
||||||
|
const char *modifier, const char *special,
|
||||||
|
const char *sponsor, const char *revision,
|
||||||
|
const char *filename, int do_allocate));
|
||||||
|
|
||||||
|
|
||||||
|
extern const char *_nl_expand_alias PARAMS ((const char *name));
|
||||||
|
|
||||||
|
extern int _nl_explode_name PARAMS ((char *name, const char **language,
|
||||||
|
const char **modifier,
|
||||||
|
const char **territory,
|
||||||
|
const char **codeset,
|
||||||
|
const char **normalized_codeset,
|
||||||
|
const char **special,
|
||||||
|
const char **sponsor,
|
||||||
|
const char **revision));
|
||||||
222
intl/loadmsgcat.c
Normal file
222
intl/loadmsgcat.c
Normal file
@@ -0,0 +1,222 @@
|
|||||||
|
/* 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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_UNISTD_H || defined _LIBC
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined HAVE_MMAP && defined HAVE_MUNMAP) || defined _LIBC
|
||||||
|
# include <sys/mman.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "gettext.h"
|
||||||
|
#include "gettextP.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* 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 open __open
|
||||||
|
# define close __close
|
||||||
|
# define read __read
|
||||||
|
# define mmap __mmap
|
||||||
|
# define munmap __munmap
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* We need a sign, whether a new catalog was loaded, which can be associated
|
||||||
|
with all translations. This is important if the translations are
|
||||||
|
cached by one of GCC's features. */
|
||||||
|
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) \
|
||||||
|
|| defined _LIBC
|
||||||
|
int use_mmap = 0;
|
||||||
|
#endif
|
||||||
|
struct loaded_domain *domain;
|
||||||
|
|
||||||
|
domain_file->decided = 1;
|
||||||
|
domain_file->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_file->filename == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Try to open the addressed file. */
|
||||||
|
fd = open (domain_file->filename, O_RDONLY);
|
||||||
|
if (fd == -1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* We must know about the size of the file. */
|
||||||
|
if (fstat (fd, &st) != 0
|
||||||
|
|| (size = (size_t) st.st_size) != st.st_size
|
||||||
|
|| size < sizeof (struct mo_file_header))
|
||||||
|
{
|
||||||
|
/* Something went wrong. */
|
||||||
|
close (fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
|
||||||
|
|| 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, size, PROT_READ,
|
||||||
|
MAP_PRIVATE, fd, 0);
|
||||||
|
|
||||||
|
if (data != (struct mo_file_header *) -1)
|
||||||
|
{
|
||||||
|
/* mmap() call was successful. */
|
||||||
|
close (fd);
|
||||||
|
use_mmap = 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* If the data is not yet available (i.e. mmap'ed) we try to load
|
||||||
|
it manually. */
|
||||||
|
if (data == (struct mo_file_header *) -1)
|
||||||
|
{
|
||||||
|
size_t to_read;
|
||||||
|
char *read_ptr;
|
||||||
|
|
||||||
|
data = (struct mo_file_header *) malloc (size);
|
||||||
|
if (data == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
to_read = size;
|
||||||
|
read_ptr = (char *) data;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
long int nb = (long int) read (fd, read_ptr, to_read);
|
||||||
|
if (nb == -1)
|
||||||
|
{
|
||||||
|
close (fd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
read_ptr += nb;
|
||||||
|
to_read -= nb;
|
||||||
|
}
|
||||||
|
while (to_read > 0);
|
||||||
|
|
||||||
|
close (fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Using the magic number we can test whether it really is a message
|
||||||
|
catalog file. */
|
||||||
|
if (data->magic != _MAGIC && data->magic != _MAGIC_SWAPPED)
|
||||||
|
{
|
||||||
|
/* The magic number is wrong: not a message catalog file. */
|
||||||
|
#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
|
||||||
|
|| defined _LIBC
|
||||||
|
if (use_mmap)
|
||||||
|
munmap ((caddr_t) data, size);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
free (data);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
domain_file->data
|
||||||
|
= (struct loaded_domain *) malloc (sizeof (struct loaded_domain));
|
||||||
|
if (domain_file->data == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
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. */
|
||||||
|
switch (W (domain->must_swap, data->revision))
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
domain->nstrings = W (domain->must_swap, data->nstrings);
|
||||||
|
domain->orig_tab = (struct string_desc *)
|
||||||
|
((char *) data + W (domain->must_swap, data->orig_tab_offset));
|
||||||
|
domain->trans_tab = (struct string_desc *)
|
||||||
|
((char *) data + W (domain->must_swap, data->trans_tab_offset));
|
||||||
|
domain->hash_size = W (domain->must_swap, data->hash_tab_size);
|
||||||
|
domain->hash_tab = (nls_uint32 *)
|
||||||
|
((char *) data + W (domain->must_swap, data->hash_tab_offset));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* This is an illegal revision. */
|
||||||
|
#if (defined HAVE_MMAP && defined HAVE_MUNMAP && !defined DISALLOW_MMAP) \
|
||||||
|
|| defined _LIBC
|
||||||
|
if (use_mmap)
|
||||||
|
munmap ((caddr_t) data, size);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
free (data);
|
||||||
|
free (domain);
|
||||||
|
domain_file->data = NULL;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show that one domain is changed. This might make some cached
|
||||||
|
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
|
||||||
424
intl/localealias.c
Normal file
424
intl/localealias.c
Normal file
@@ -0,0 +1,424 @@
|
|||||||
|
/* Handle aliases for locale names.
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#ifdef __GNUC__
|
||||||
|
# define alloca __builtin_alloca
|
||||||
|
# define HAVE_ALLOCA 1
|
||||||
|
#else
|
||||||
|
# if defined HAVE_ALLOCA_H || defined _LIBC
|
||||||
|
# include <alloca.h>
|
||||||
|
# else
|
||||||
|
# ifdef _AIX
|
||||||
|
#pragma alloca
|
||||||
|
# else
|
||||||
|
# ifndef alloca
|
||||||
|
char *alloca ();
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#else
|
||||||
|
char *getenv ();
|
||||||
|
# ifdef HAVE_MALLOC_H
|
||||||
|
# include <malloc.h>
|
||||||
|
# else
|
||||||
|
void free ();
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# ifndef _GNU_SOURCE
|
||||||
|
# define _GNU_SOURCE 1
|
||||||
|
# endif
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
# ifndef memcpy
|
||||||
|
# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if !HAVE_STRCHR && !defined _LIBC
|
||||||
|
# ifndef strchr
|
||||||
|
# define strchr index
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "gettext.h"
|
||||||
|
#include "gettextP.h"
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Rename the non ANSI C functions. This is required by the standard
|
||||||
|
because some ANSI C functions will require linking with this object
|
||||||
|
file and the name space must not be polluted. */
|
||||||
|
# define strcasecmp __strcasecmp
|
||||||
|
|
||||||
|
# define mempcpy __mempcpy
|
||||||
|
# define HAVE_MEMPCPY 1
|
||||||
|
|
||||||
|
/* We need locking here since we can be called from different places. */
|
||||||
|
# include <bits/libc-lock.h>
|
||||||
|
|
||||||
|
__libc_lock_define_initialized (static, lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* For those loosing systems which don't have `alloca' we have to add
|
||||||
|
some additional code emulating it. */
|
||||||
|
#ifdef HAVE_ALLOCA
|
||||||
|
/* Nothing has to be done. */
|
||||||
|
# define ADD_BLOCK(list, address) /* nothing */
|
||||||
|
# define FREE_BLOCKS(list) /* nothing */
|
||||||
|
#else
|
||||||
|
struct block_list
|
||||||
|
{
|
||||||
|
void *address;
|
||||||
|
struct block_list *next;
|
||||||
|
};
|
||||||
|
# define ADD_BLOCK(list, addr) \
|
||||||
|
do { \
|
||||||
|
struct block_list *newp = (struct block_list *) malloc (sizeof (*newp)); \
|
||||||
|
/* If we cannot get a free block we cannot add the new element to \
|
||||||
|
the list. */ \
|
||||||
|
if (newp != NULL) { \
|
||||||
|
newp->address = (addr); \
|
||||||
|
newp->next = (list); \
|
||||||
|
(list) = newp; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
# define FREE_BLOCKS(list) \
|
||||||
|
do { \
|
||||||
|
while (list != NULL) { \
|
||||||
|
struct block_list *old = list; \
|
||||||
|
list = list->next; \
|
||||||
|
free (old); \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
# undef alloca
|
||||||
|
# define alloca(size) (malloc (size))
|
||||||
|
#endif /* have alloca */
|
||||||
|
|
||||||
|
|
||||||
|
struct alias_map
|
||||||
|
{
|
||||||
|
const char *alias;
|
||||||
|
const char *value;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static char *string_space = NULL;
|
||||||
|
static size_t string_space_act = 0;
|
||||||
|
static size_t string_space_max = 0;
|
||||||
|
static struct alias_map *map;
|
||||||
|
static size_t nmap = 0;
|
||||||
|
static size_t maxmap = 0;
|
||||||
|
|
||||||
|
|
||||||
|
/* Prototypes for local functions. */
|
||||||
|
static size_t read_alias_file PARAMS ((const char *fname, int fname_len))
|
||||||
|
internal_function;
|
||||||
|
static void extend_alias_table PARAMS ((void));
|
||||||
|
static int alias_compare PARAMS ((const struct alias_map *map1,
|
||||||
|
const struct alias_map *map2));
|
||||||
|
|
||||||
|
|
||||||
|
const char *
|
||||||
|
_nl_expand_alias (name)
|
||||||
|
const char *name;
|
||||||
|
{
|
||||||
|
static const char *locale_alias_path = LOCALE_ALIAS_PATH;
|
||||||
|
struct alias_map *retval;
|
||||||
|
const char *result = NULL;
|
||||||
|
size_t added;
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
__libc_lock_lock (lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
struct alias_map item;
|
||||||
|
|
||||||
|
item.alias = name;
|
||||||
|
|
||||||
|
if (nmap > 0)
|
||||||
|
retval = (struct alias_map *) bsearch (&item, map, nmap,
|
||||||
|
sizeof (struct alias_map),
|
||||||
|
(int (*) PARAMS ((const void *,
|
||||||
|
const void *))
|
||||||
|
) alias_compare);
|
||||||
|
else
|
||||||
|
retval = NULL;
|
||||||
|
|
||||||
|
/* We really found an alias. Return the value. */
|
||||||
|
if (retval != NULL)
|
||||||
|
{
|
||||||
|
result = retval->value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Perhaps we can find another alias file. */
|
||||||
|
added = 0;
|
||||||
|
while (added == 0 && locale_alias_path[0] != '\0')
|
||||||
|
{
|
||||||
|
const char *start;
|
||||||
|
|
||||||
|
while (locale_alias_path[0] == ':')
|
||||||
|
++locale_alias_path;
|
||||||
|
start = locale_alias_path;
|
||||||
|
|
||||||
|
while (locale_alias_path[0] != '\0' && locale_alias_path[0] != ':')
|
||||||
|
++locale_alias_path;
|
||||||
|
|
||||||
|
if (start < locale_alias_path)
|
||||||
|
added = read_alias_file (start, locale_alias_path - start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (added != 0);
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
__libc_lock_unlock (lock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
internal_function
|
||||||
|
read_alias_file (fname, fname_len)
|
||||||
|
const char *fname;
|
||||||
|
int fname_len;
|
||||||
|
{
|
||||||
|
#ifndef HAVE_ALLOCA
|
||||||
|
struct block_list *block_list = NULL;
|
||||||
|
#endif
|
||||||
|
FILE *fp;
|
||||||
|
char *full_fname;
|
||||||
|
size_t added;
|
||||||
|
static const char aliasfile[] = "/locale.alias";
|
||||||
|
|
||||||
|
full_fname = (char *) alloca (fname_len + sizeof aliasfile);
|
||||||
|
ADD_BLOCK (block_list, full_fname);
|
||||||
|
#ifdef HAVE_MEMPCPY
|
||||||
|
mempcpy (mempcpy (full_fname, fname, fname_len),
|
||||||
|
aliasfile, sizeof aliasfile);
|
||||||
|
#else
|
||||||
|
memcpy (full_fname, fname, fname_len);
|
||||||
|
memcpy (&full_fname[fname_len], aliasfile, sizeof aliasfile);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
fp = fopen (full_fname, "r");
|
||||||
|
if (fp == NULL)
|
||||||
|
{
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
added = 0;
|
||||||
|
while (!feof (fp))
|
||||||
|
{
|
||||||
|
/* It is a reasonable approach to use a fix buffer here because
|
||||||
|
a) we are only interested in the first two fields
|
||||||
|
b) these fields must be usable as file names and so must not
|
||||||
|
be that long
|
||||||
|
*/
|
||||||
|
unsigned char buf[BUFSIZ];
|
||||||
|
unsigned char *alias;
|
||||||
|
unsigned char *value;
|
||||||
|
unsigned char *cp;
|
||||||
|
|
||||||
|
if (fgets (buf, sizeof buf, fp) == NULL)
|
||||||
|
/* EOF reached. */
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* Possibly not the whole line fits into the buffer. Ignore
|
||||||
|
the rest of the line. */
|
||||||
|
if (strchr (buf, '\n') == NULL)
|
||||||
|
{
|
||||||
|
char altbuf[BUFSIZ];
|
||||||
|
do
|
||||||
|
if (fgets (altbuf, sizeof altbuf, fp) == NULL)
|
||||||
|
/* Make sure the inner loop will be left. The outer loop
|
||||||
|
will exit at the `feof' test. */
|
||||||
|
break;
|
||||||
|
while (strchr (altbuf, '\n') == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
cp = buf;
|
||||||
|
/* Ignore leading white space. */
|
||||||
|
while (isspace (cp[0]))
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
/* A leading '#' signals a comment line. */
|
||||||
|
if (cp[0] != '\0' && cp[0] != '#')
|
||||||
|
{
|
||||||
|
alias = cp++;
|
||||||
|
while (cp[0] != '\0' && !isspace (cp[0]))
|
||||||
|
++cp;
|
||||||
|
/* Terminate alias name. */
|
||||||
|
if (cp[0] != '\0')
|
||||||
|
*cp++ = '\0';
|
||||||
|
|
||||||
|
/* Now look for the beginning of the value. */
|
||||||
|
while (isspace (cp[0]))
|
||||||
|
++cp;
|
||||||
|
|
||||||
|
if (cp[0] != '\0')
|
||||||
|
{
|
||||||
|
size_t alias_len;
|
||||||
|
size_t value_len;
|
||||||
|
|
||||||
|
value = cp++;
|
||||||
|
while (cp[0] != '\0' && !isspace (cp[0]))
|
||||||
|
++cp;
|
||||||
|
/* Terminate value. */
|
||||||
|
if (cp[0] == '\n')
|
||||||
|
{
|
||||||
|
/* This has to be done to make the following test
|
||||||
|
for the end of line possible. We are looking for
|
||||||
|
the terminating '\n' which do not overwrite here. */
|
||||||
|
*cp++ = '\0';
|
||||||
|
*cp = '\n';
|
||||||
|
}
|
||||||
|
else if (cp[0] != '\0')
|
||||||
|
*cp++ = '\0';
|
||||||
|
|
||||||
|
if (nmap >= maxmap)
|
||||||
|
extend_alias_table ();
|
||||||
|
|
||||||
|
alias_len = strlen (alias) + 1;
|
||||||
|
value_len = strlen (value) + 1;
|
||||||
|
|
||||||
|
if (string_space_act + alias_len + value_len > string_space_max)
|
||||||
|
{
|
||||||
|
/* Increase size of memory pool. */
|
||||||
|
size_t new_size = (string_space_max
|
||||||
|
+ (alias_len + value_len > 1024
|
||||||
|
? alias_len + value_len : 1024));
|
||||||
|
char *new_pool = (char *) realloc (string_space, new_size);
|
||||||
|
if (new_pool == NULL)
|
||||||
|
{
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
return added;
|
||||||
|
}
|
||||||
|
string_space = new_pool;
|
||||||
|
string_space_max = new_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
map[nmap].alias = memcpy (&string_space[string_space_act],
|
||||||
|
alias, alias_len);
|
||||||
|
string_space_act += alias_len;
|
||||||
|
|
||||||
|
map[nmap].value = memcpy (&string_space[string_space_act],
|
||||||
|
value, value_len);
|
||||||
|
string_space_act += value_len;
|
||||||
|
|
||||||
|
++nmap;
|
||||||
|
++added;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Should we test for ferror()? I think we have to silently ignore
|
||||||
|
errors. --drepper */
|
||||||
|
fclose (fp);
|
||||||
|
|
||||||
|
if (added > 0)
|
||||||
|
qsort (map, nmap, sizeof (struct alias_map),
|
||||||
|
(int (*) PARAMS ((const void *, const void *))) alias_compare);
|
||||||
|
|
||||||
|
FREE_BLOCKS (block_list);
|
||||||
|
return added;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
extend_alias_table ()
|
||||||
|
{
|
||||||
|
size_t new_size;
|
||||||
|
struct alias_map *new_map;
|
||||||
|
|
||||||
|
new_size = maxmap == 0 ? 100 : 2 * maxmap;
|
||||||
|
new_map = (struct alias_map *) realloc (map, (new_size
|
||||||
|
* sizeof (struct alias_map)));
|
||||||
|
if (new_map == NULL)
|
||||||
|
/* Simply don't extend: we don't have any more core. */
|
||||||
|
return;
|
||||||
|
|
||||||
|
map = new_map;
|
||||||
|
maxmap = new_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
static void __attribute__ ((unused))
|
||||||
|
free_mem (void)
|
||||||
|
{
|
||||||
|
if (string_space != NULL)
|
||||||
|
free (string_space);
|
||||||
|
if (map != NULL)
|
||||||
|
free (map);
|
||||||
|
}
|
||||||
|
text_set_element (__libc_subfreeres, free_mem);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
alias_compare (map1, map2)
|
||||||
|
const struct alias_map *map1;
|
||||||
|
const struct alias_map *map2;
|
||||||
|
{
|
||||||
|
#if defined _LIBC || defined HAVE_STRCASECMP
|
||||||
|
return strcasecmp (map1->alias, map2->alias);
|
||||||
|
#else
|
||||||
|
const unsigned char *p1 = (const unsigned char *) map1->alias;
|
||||||
|
const unsigned char *p2 = (const unsigned char *) map2->alias;
|
||||||
|
unsigned char c1, c2;
|
||||||
|
|
||||||
|
if (p1 == p2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
/* I know this seems to be odd but the tolower() function in
|
||||||
|
some systems libc cannot handle nonalpha characters. */
|
||||||
|
c1 = isupper (*p1) ? tolower (*p1) : *p1;
|
||||||
|
c2 = isupper (*p2) ? tolower (*p2) : *p2;
|
||||||
|
if (c1 == '\0')
|
||||||
|
break;
|
||||||
|
++p1;
|
||||||
|
++p2;
|
||||||
|
}
|
||||||
|
while (c1 == c2);
|
||||||
|
|
||||||
|
return c1 - c2;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
102
intl/po2tbl.sed.in
Normal file
102
intl/po2tbl.sed.in
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
# po2tbl.sed - Convert Uniforum style .po file to lookup table for catgets
|
||||||
|
# Copyright (C) 1995 Free Software Foundation, Inc.
|
||||||
|
# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
#
|
||||||
|
1 {
|
||||||
|
i\
|
||||||
|
/* Automatically generated by po2tbl.sed from @PACKAGE NAME@.pot. */\
|
||||||
|
\
|
||||||
|
#if HAVE_CONFIG_H\
|
||||||
|
# include <config.h>\
|
||||||
|
#endif\
|
||||||
|
\
|
||||||
|
#include "libgettext.h"\
|
||||||
|
\
|
||||||
|
const struct _msg_ent _msg_tbl[] = {
|
||||||
|
h
|
||||||
|
s/.*/0/
|
||||||
|
x
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# Write msgid entries in C array form.
|
||||||
|
#
|
||||||
|
/^msgid/ {
|
||||||
|
s/msgid[ ]*\(".*"\)/ {\1/
|
||||||
|
tb
|
||||||
|
# Append the next line
|
||||||
|
:b
|
||||||
|
N
|
||||||
|
# Look whether second part is continuation line.
|
||||||
|
s/\(.*\)"\(\n\)"\(.*"\)/\1\2\3/
|
||||||
|
# Yes, then branch.
|
||||||
|
ta
|
||||||
|
# Because we assume that the input file correctly formed the line
|
||||||
|
# just read cannot be again be a msgid line. So it's safe to ignore
|
||||||
|
# it.
|
||||||
|
s/\(.*\)\n.*/\1/
|
||||||
|
bc
|
||||||
|
# We found a continuation line. But before printing insert '\'.
|
||||||
|
:a
|
||||||
|
s/\(.*\)\(\n.*\)/\1\\\2/
|
||||||
|
P
|
||||||
|
# We cannot use D here.
|
||||||
|
s/.*\n\(.*\)/\1/
|
||||||
|
# Some buggy seds do not clear the `successful substitution since last ``t'''
|
||||||
|
# flag on `N', so we do a `t' here to clear it.
|
||||||
|
tb
|
||||||
|
# Not reached
|
||||||
|
:c
|
||||||
|
x
|
||||||
|
# The following nice solution is by
|
||||||
|
# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
|
||||||
|
td
|
||||||
|
# Increment a decimal number in pattern space.
|
||||||
|
# First hide trailing `9' digits.
|
||||||
|
:d
|
||||||
|
s/9\(_*\)$/_\1/
|
||||||
|
td
|
||||||
|
# Assure at least one digit is available.
|
||||||
|
s/^\(_*\)$/0\1/
|
||||||
|
# Increment the last digit.
|
||||||
|
s/8\(_*\)$/9\1/
|
||||||
|
s/7\(_*\)$/8\1/
|
||||||
|
s/6\(_*\)$/7\1/
|
||||||
|
s/5\(_*\)$/6\1/
|
||||||
|
s/4\(_*\)$/5\1/
|
||||||
|
s/3\(_*\)$/4\1/
|
||||||
|
s/2\(_*\)$/3\1/
|
||||||
|
s/1\(_*\)$/2\1/
|
||||||
|
s/0\(_*\)$/1\1/
|
||||||
|
# Convert the hidden `9' digits to `0's.
|
||||||
|
s/_/0/g
|
||||||
|
x
|
||||||
|
G
|
||||||
|
s/\(.*\)\n\([0-9]*\)/\1, \2},/
|
||||||
|
s/\(.*\)"$/\1/
|
||||||
|
p
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# Last line.
|
||||||
|
#
|
||||||
|
$ {
|
||||||
|
i\
|
||||||
|
};\
|
||||||
|
|
||||||
|
g
|
||||||
|
s/0*\(.*\)/int _msg_tbl_length = \1;/p
|
||||||
|
}
|
||||||
|
d
|
||||||
108
intl/textdomain.c
Normal file
108
intl/textdomain.c
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
/* Implementation of the textdomain(3) function.
|
||||||
|
Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
|
Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
|
||||||
|
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
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include <config.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined _LIBC
|
||||||
|
# include <stdlib.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined STDC_HEADERS || defined HAVE_STRING_H || defined _LIBC
|
||||||
|
# include <string.h>
|
||||||
|
#else
|
||||||
|
# include <strings.h>
|
||||||
|
# ifndef memcpy
|
||||||
|
# define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
# include <libintl.h>
|
||||||
|
#else
|
||||||
|
# include "libgettext.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* @@ end of prolog @@ */
|
||||||
|
|
||||||
|
/* Name of the default text domain. */
|
||||||
|
extern const char _nl_default_default_domain[];
|
||||||
|
|
||||||
|
/* Default text domain in which entries for gettext(3) are to be found. */
|
||||||
|
extern const char *_nl_current_default_domain;
|
||||||
|
|
||||||
|
|
||||||
|
/* Names for the libintl functions are a problem. They must not clash
|
||||||
|
with existing names and they should follow ANSI C. But this source
|
||||||
|
code is also used in GNU C Library where the names have a __
|
||||||
|
prefix. So we have to make a difference here. */
|
||||||
|
#ifdef _LIBC
|
||||||
|
# define TEXTDOMAIN __textdomain
|
||||||
|
# ifndef strdup
|
||||||
|
# define strdup(str) __strdup (str)
|
||||||
|
# endif
|
||||||
|
#else
|
||||||
|
# define TEXTDOMAIN textdomain__
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Set the current default message catalog to DOMAINNAME.
|
||||||
|
If DOMAINNAME is null, return the current default.
|
||||||
|
If DOMAINNAME is "", reset to the default of "messages". */
|
||||||
|
char *
|
||||||
|
TEXTDOMAIN (domainname)
|
||||||
|
const char *domainname;
|
||||||
|
{
|
||||||
|
char *old;
|
||||||
|
|
||||||
|
/* A NULL pointer requests the current setting. */
|
||||||
|
if (domainname == NULL)
|
||||||
|
return (char *) _nl_current_default_domain;
|
||||||
|
|
||||||
|
old = (char *) _nl_current_default_domain;
|
||||||
|
|
||||||
|
/* If domain name is the null string set to default domain "messages". */
|
||||||
|
if (domainname[0] == '\0'
|
||||||
|
|| strcmp (domainname, _nl_default_default_domain) == 0)
|
||||||
|
_nl_current_default_domain = _nl_default_default_domain;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* If the following malloc fails `_nl_current_default_domain'
|
||||||
|
will be NULL. This value will be returned and so signals we
|
||||||
|
are out of core. */
|
||||||
|
#if defined _LIBC || defined HAVE_STRDUP
|
||||||
|
_nl_current_default_domain = strdup (domainname);
|
||||||
|
#else
|
||||||
|
size_t len = strlen (domainname) + 1;
|
||||||
|
char *cp = (char *) malloc (len);
|
||||||
|
if (cp != NULL)
|
||||||
|
memcpy (cp, domainname, len);
|
||||||
|
_nl_current_default_domain = cp;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (old != _nl_default_default_domain)
|
||||||
|
free (old);
|
||||||
|
|
||||||
|
return (char *) _nl_current_default_domain;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _LIBC
|
||||||
|
/* Alias for function name in GNU C Library. */
|
||||||
|
weak_alias (__textdomain, textdomain);
|
||||||
|
#endif
|
||||||
104
intl/xopen-msg.sed
Normal file
104
intl/xopen-msg.sed
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
# po2msg.sed - Convert Uniforum style .po file to X/Open style .msg file
|
||||||
|
# Copyright 1995, 2002 Free Software Foundation, Inc.
|
||||||
|
# Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
# the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
# any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# The first directive in the .msg should be the definition of the
|
||||||
|
# message set number. We use always set number 1.
|
||||||
|
#
|
||||||
|
1 {
|
||||||
|
i\
|
||||||
|
$set 1 # Automatically created by po2msg.sed
|
||||||
|
h
|
||||||
|
s/.*/0/
|
||||||
|
x
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# We copy all comments into the .msg file. Perhaps they can help.
|
||||||
|
#
|
||||||
|
/^#/ s/^#[ ]*/$ /p
|
||||||
|
#
|
||||||
|
# We copy the original message as a comment into the .msg file.
|
||||||
|
#
|
||||||
|
/^msgid/ {
|
||||||
|
# Does not work now
|
||||||
|
# /"$/! {
|
||||||
|
# s/\\$//
|
||||||
|
# s/$/ ... (more lines following)"/
|
||||||
|
# }
|
||||||
|
s/^msgid[ ]*"\(.*\)"$/$ Original Message: \1/
|
||||||
|
p
|
||||||
|
}
|
||||||
|
#
|
||||||
|
# The .msg file contains, other than the .po file, only the translations
|
||||||
|
# but each given a unique ID. Starting from 1 and incrementing by 1 for
|
||||||
|
# each message we assign them to the messages.
|
||||||
|
# It is important that the .po file used to generate the cat-id-tbl.c file
|
||||||
|
# (with po-to-tbl) is the same as the one used here. (At least the order
|
||||||
|
# of declarations must not be changed.)
|
||||||
|
#
|
||||||
|
/^msgstr/ {
|
||||||
|
s/msgstr[ ]*"\(.*\)"/\1/
|
||||||
|
x
|
||||||
|
# The following nice solution is by
|
||||||
|
# Bruno <Haible@ma2s2.mathematik.uni-karlsruhe.de>
|
||||||
|
td
|
||||||
|
# Increment a decimal number in pattern space.
|
||||||
|
# First hide trailing `9' digits.
|
||||||
|
:d
|
||||||
|
s/9\(_*\)$/_\1/
|
||||||
|
td
|
||||||
|
# Assure at least one digit is available.
|
||||||
|
s/^\(_*\)$/0\1/
|
||||||
|
# Increment the last digit.
|
||||||
|
s/8\(_*\)$/9\1/
|
||||||
|
s/7\(_*\)$/8\1/
|
||||||
|
s/6\(_*\)$/7\1/
|
||||||
|
s/5\(_*\)$/6\1/
|
||||||
|
s/4\(_*\)$/5\1/
|
||||||
|
s/3\(_*\)$/4\1/
|
||||||
|
s/2\(_*\)$/3\1/
|
||||||
|
s/1\(_*\)$/2\1/
|
||||||
|
s/0\(_*\)$/1\1/
|
||||||
|
# Convert the hidden `9' digits to `0's.
|
||||||
|
s/_/0/g
|
||||||
|
x
|
||||||
|
# Bring the line in the format `<number> <message>'
|
||||||
|
G
|
||||||
|
s/^[^\n]*$/& /
|
||||||
|
s/\(.*\)\n\([0-9]*\)/\2 \1/
|
||||||
|
# Clear flag from last substitution.
|
||||||
|
tb
|
||||||
|
# Append the next line.
|
||||||
|
:b
|
||||||
|
N
|
||||||
|
# Look whether second part is a continuation line.
|
||||||
|
s/\(.*\n\)"\(.*\)"/\1\2/
|
||||||
|
# Yes, then branch.
|
||||||
|
ta
|
||||||
|
P
|
||||||
|
D
|
||||||
|
# Note that `D' includes a jump to the start!!
|
||||||
|
# We found a continuation line. But before printing insert '\'.
|
||||||
|
:a
|
||||||
|
s/\(.*\)\(\n.*\)/\1\\\2/
|
||||||
|
P
|
||||||
|
# We cannot use the sed command `D' here
|
||||||
|
s/.*\n\(.*\)/\1/
|
||||||
|
tb
|
||||||
|
}
|
||||||
|
d
|
||||||
@@ -1,3 +1,26 @@
|
|||||||
|
2005-11-20 Hans-Peter Nilsson <hp@axis.com>
|
||||||
|
|
||||||
|
cris/traps.c (TARGET_O_RDONLY, TARGET_O_WRONLY): Define.
|
||||||
|
(open_map): Use TARGET_O_ACCMODE, TARGET_O_RDONLY and
|
||||||
|
TARGET_O_WRONLY.
|
||||||
|
(cris_break_13_handler) <case TARGET_SYS_fcntl>: Add support for
|
||||||
|
F_GETFL on fd 0, 1 and 2.
|
||||||
|
|
||||||
|
2005-11-17 Hans-Peter Nilsson <hp@axis.com>
|
||||||
|
|
||||||
|
* cris/sim-main.h (struct _sim_cpu): New members last_syscall,
|
||||||
|
last_open_fd, last_open_flags.
|
||||||
|
* cris/traps.c: Don't include targ-vals.h.
|
||||||
|
(TARGET_O_ACCMODE): Define.
|
||||||
|
(cris_break_13_handler): Set new _sim_cpu members.
|
||||||
|
<case TARGET_SYS_fcntl>: Support special case of F_GETFL.
|
||||||
|
Rearrange code as switch. Emit "unimplemented" abort for
|
||||||
|
unimplemented fcntl calls.
|
||||||
|
|
||||||
|
* cris/traps.c (TARGET_SYS_stat): Define.
|
||||||
|
(syscall_stat32_map): Add entry for TARGET_SYS_stat.
|
||||||
|
(cris_break_13_handler) <case TARGET_SYS_stat>: New case.
|
||||||
|
|
||||||
2005-11-16 Hans-Peter Nilsson <hp@axis.com>
|
2005-11-16 Hans-Peter Nilsson <hp@axis.com>
|
||||||
|
|
||||||
* cris/cris-tmpl.c (MY (f_model_insn_before)): Make sure only the
|
* cris/cris-tmpl.c (MY (f_model_insn_before)): Make sure only the
|
||||||
|
|||||||
@@ -1,3 +1,18 @@
|
|||||||
|
2005-11-16 Shaun Jackman <sjackman@gmail.com>
|
||||||
|
|
||||||
|
* sim/arm/armos.c: Include limits.h
|
||||||
|
(unlink): Remove this macro. It is unused in this file and
|
||||||
|
conflicts with sim_callback->unlink.
|
||||||
|
(PATH_MAX): Define as 1024 if not already defined.
|
||||||
|
(ReadFileName): New function.
|
||||||
|
(SWIopen): Fix a potential buffer overflow.
|
||||||
|
(SWIremove): New function.
|
||||||
|
(SWIrename): Ditto.
|
||||||
|
(ARMul_OSHandleSWI): Handle the RDP calls SWI_IsTTY,
|
||||||
|
SWI_Remove, and SWI_Rename, as well as the RDI calls
|
||||||
|
AngelSWI_Reason_IsTTY, AngelSWI_Reason_Remove, and
|
||||||
|
AngelSWI_Reason_Rename.
|
||||||
|
|
||||||
2005-09-19 Paul Brook <paul@codesourcery.com>
|
2005-09-19 Paul Brook <paul@codesourcery.com>
|
||||||
|
|
||||||
* armdefs.h: Define ARMsword and ARMsdword. Use stdint.h when
|
* armdefs.h: Define ARMsword and ARMsdword. Use stdint.h when
|
||||||
|
|||||||
102
sim/arm/armos.c
102
sim/arm/armos.c
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "targ-vals.h"
|
#include "targ-vals.h"
|
||||||
|
|
||||||
@@ -34,10 +35,6 @@
|
|||||||
#define TARGET_O_BINARY 0
|
#define TARGET_O_BINARY 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __STDC__
|
|
||||||
#define unlink(s) remove(s)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_UNISTD_H
|
#ifdef HAVE_UNISTD_H
|
||||||
#include <unistd.h> /* For SEEK_SET etc. */
|
#include <unistd.h> /* For SEEK_SET etc. */
|
||||||
#endif
|
#endif
|
||||||
@@ -89,6 +86,9 @@ extern ARMword ARMul_Debug (ARMul_State *, ARMword, ARMword);
|
|||||||
#define FOPEN_MAX 64
|
#define FOPEN_MAX 64
|
||||||
#endif
|
#endif
|
||||||
#define UNIQUETEMPS 256
|
#define UNIQUETEMPS 256
|
||||||
|
#ifndef PATH_MAX
|
||||||
|
#define PATH_MAX 1024
|
||||||
|
#endif
|
||||||
|
|
||||||
/* OS private Information. */
|
/* OS private Information. */
|
||||||
|
|
||||||
@@ -299,22 +299,35 @@ WriteCommandLineTo (ARMul_State * state, ARMword addr)
|
|||||||
while (temp != 0);
|
while (temp != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
ReadFileName (ARMul_State * state, char *buf, ARMword src, size_t n)
|
||||||
|
{
|
||||||
|
struct OSblock *OSptr = (struct OSblock *) state->OSptr;
|
||||||
|
char *p = buf;
|
||||||
|
|
||||||
|
while (n--)
|
||||||
|
if ((*p++ = ARMul_SafeReadByte (state, src++)) == '\0')
|
||||||
|
return 0;
|
||||||
|
OSptr->ErrorNo = cb_host_to_target_errno (sim_callback, ENAMETOOLONG);
|
||||||
|
state->Reg[0] = -1;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
SWIopen (ARMul_State * state, ARMword name, ARMword SWIflags)
|
SWIopen (ARMul_State * state, ARMword name, ARMword SWIflags)
|
||||||
{
|
{
|
||||||
struct OSblock *OSptr = (struct OSblock *) state->OSptr;
|
struct OSblock *OSptr = (struct OSblock *) state->OSptr;
|
||||||
char dummy[2000];
|
char buf[PATH_MAX];
|
||||||
int flags;
|
int flags;
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; (dummy[i] = ARMul_SafeReadByte (state, name + i)); i++)
|
if (ReadFileName (state, buf, name, sizeof buf) == -1)
|
||||||
;
|
return;
|
||||||
|
|
||||||
/* Now we need to decode the Demon open mode. */
|
/* Now we need to decode the Demon open mode. */
|
||||||
flags = translate_open_mode[SWIflags];
|
flags = translate_open_mode[SWIflags];
|
||||||
|
|
||||||
/* Filename ":tt" is special: it denotes stdin/out. */
|
/* Filename ":tt" is special: it denotes stdin/out. */
|
||||||
if (strcmp (dummy, ":tt") == 0)
|
if (strcmp (buf, ":tt") == 0)
|
||||||
{
|
{
|
||||||
if (flags == TARGET_O_RDONLY) /* opening tty "r" */
|
if (flags == TARGET_O_RDONLY) /* opening tty "r" */
|
||||||
state->Reg[0] = 0; /* stdin */
|
state->Reg[0] = 0; /* stdin */
|
||||||
@@ -323,7 +336,7 @@ SWIopen (ARMul_State * state, ARMword name, ARMword SWIflags)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
state->Reg[0] = sim_callback->open (sim_callback, dummy, flags);
|
state->Reg[0] = sim_callback->open (sim_callback, buf, flags);
|
||||||
OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
|
OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -403,6 +416,33 @@ SWIflen (ARMul_State * state, ARMword fh)
|
|||||||
OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
|
OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SWIremove (ARMul_State * state, ARMword path)
|
||||||
|
{
|
||||||
|
char buf[PATH_MAX];
|
||||||
|
|
||||||
|
if (ReadFileName (state, buf, path, sizeof buf) != -1)
|
||||||
|
{
|
||||||
|
struct OSblock *OSptr = (struct OSblock *) state->OSptr;
|
||||||
|
state->Reg[0] = sim_callback->unlink (sim_callback, buf);
|
||||||
|
OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
SWIrename (ARMul_State * state, ARMword old, ARMword new)
|
||||||
|
{
|
||||||
|
char oldbuf[PATH_MAX], newbuf[PATH_MAX];
|
||||||
|
|
||||||
|
if (ReadFileName (state, oldbuf, old, sizeof oldbuf) != -1
|
||||||
|
&& ReadFileName (state, newbuf, new, sizeof newbuf) != -1)
|
||||||
|
{
|
||||||
|
struct OSblock *OSptr = (struct OSblock *) state->OSptr;
|
||||||
|
state->Reg[0] = sim_callback->rename (sim_callback, oldbuf, newbuf);
|
||||||
|
OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* The emulator calls this routine when a SWI instruction is encuntered.
|
/* The emulator calls this routine when a SWI instruction is encuntered.
|
||||||
The parameter passed is the SWI number (lower 24 bits of the instruction). */
|
The parameter passed is the SWI number (lower 24 bits of the instruction). */
|
||||||
|
|
||||||
@@ -544,6 +584,30 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
|
|||||||
state->Emulate = FALSE;
|
state->Emulate = FALSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SWI_Remove:
|
||||||
|
if (swi_mask & SWI_MASK_DEMON)
|
||||||
|
SWIremove (state, state->Reg[0]);
|
||||||
|
else
|
||||||
|
unhandled = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SWI_Rename:
|
||||||
|
if (swi_mask & SWI_MASK_DEMON)
|
||||||
|
SWIrename (state, state->Reg[0], state->Reg[1]);
|
||||||
|
else
|
||||||
|
unhandled = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SWI_IsTTY:
|
||||||
|
if (swi_mask & SWI_MASK_DEMON)
|
||||||
|
{
|
||||||
|
state->Reg[0] = sim_callback->isatty (sim_callback, state->Reg[0]);
|
||||||
|
OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
unhandled = TRUE;
|
||||||
|
break;
|
||||||
|
|
||||||
/* Handle Angel SWIs as well as Demon ones. */
|
/* Handle Angel SWIs as well as Demon ones. */
|
||||||
case AngelSWI_ARM:
|
case AngelSWI_ARM:
|
||||||
case AngelSWI_Thumb:
|
case AngelSWI_Thumb:
|
||||||
@@ -566,10 +630,7 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
|
|||||||
|
|
||||||
/* Unimplemented reason codes. */
|
/* Unimplemented reason codes. */
|
||||||
case AngelSWI_Reason_ReadC:
|
case AngelSWI_Reason_ReadC:
|
||||||
case AngelSWI_Reason_IsTTY:
|
|
||||||
case AngelSWI_Reason_TmpNam:
|
case AngelSWI_Reason_TmpNam:
|
||||||
case AngelSWI_Reason_Remove:
|
|
||||||
case AngelSWI_Reason_Rename:
|
|
||||||
case AngelSWI_Reason_System:
|
case AngelSWI_Reason_System:
|
||||||
case AngelSWI_Reason_EnterSVC:
|
case AngelSWI_Reason_EnterSVC:
|
||||||
default:
|
default:
|
||||||
@@ -684,6 +745,21 @@ ARMul_OSHandleSWI (ARMul_State * state, ARMword number)
|
|||||||
ARMul_ReadWord (state, addr + 4),
|
ARMul_ReadWord (state, addr + 4),
|
||||||
ARMul_ReadWord (state, addr + 8));
|
ARMul_ReadWord (state, addr + 8));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case AngelSWI_Reason_IsTTY:
|
||||||
|
state->Reg[0] = sim_callback->close (sim_callback,
|
||||||
|
ARMul_ReadWord (state, addr));
|
||||||
|
OSptr->ErrorNo = sim_callback->get_errno (sim_callback);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case AngelSWI_Reason_Remove:
|
||||||
|
SWIremove (state,
|
||||||
|
ARMul_ReadWord (state, addr));
|
||||||
|
|
||||||
|
case AngelSWI_Reason_Rename:
|
||||||
|
SWIrename (state,
|
||||||
|
ARMul_ReadWord (state, addr),
|
||||||
|
ARMul_ReadWord (state, addr + 4));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -166,6 +166,17 @@ struct _sim_cpu {
|
|||||||
for sigmasks and sigpendings. */
|
for sigmasks and sigpendings. */
|
||||||
USI sighandler[64];
|
USI sighandler[64];
|
||||||
|
|
||||||
|
/* This is a hack to implement just the parts of fcntl F_GETFL that
|
||||||
|
are used in open+fdopen calls for the standard scenario: for such
|
||||||
|
a call we check that the last syscall was open, we check that the
|
||||||
|
passed fd is the same returned then, and so we return the same
|
||||||
|
flags passed to open. This way, we avoid complicating the
|
||||||
|
generic sim callback machinery by introducing fcntl
|
||||||
|
mechanisms. */
|
||||||
|
USI last_syscall;
|
||||||
|
USI last_open_fd;
|
||||||
|
USI last_open_flags;
|
||||||
|
|
||||||
/* Function for initializing CPU thread context, which varies in size
|
/* Function for initializing CPU thread context, which varies in size
|
||||||
with each CPU model. They should be in some constant parts or
|
with each CPU model. They should be in some constant parts or
|
||||||
initialized in *_init_cpu, but we can't modify that for now. */
|
initialized in *_init_cpu, but we can't modify that for now. */
|
||||||
|
|||||||
@@ -20,8 +20,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
|
|
||||||
#include "sim-main.h"
|
#include "sim-main.h"
|
||||||
#include "sim-options.h"
|
#include "sim-options.h"
|
||||||
#include "targ-vals.h"
|
|
||||||
#include "bfd.h"
|
#include "bfd.h"
|
||||||
|
/* FIXME: get rid of targ-vals.h usage everywhere else. */
|
||||||
|
|
||||||
#ifdef HAVE_ERRNO_H
|
#ifdef HAVE_ERRNO_H
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -63,6 +64,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#define TARGET_SYS_truncate 92
|
#define TARGET_SYS_truncate 92
|
||||||
#define TARGET_SYS_ftruncate 93
|
#define TARGET_SYS_ftruncate 93
|
||||||
#define TARGET_SYS_socketcall 102
|
#define TARGET_SYS_socketcall 102
|
||||||
|
#define TARGET_SYS_stat 106
|
||||||
#define TARGET_SYS_fstat 108
|
#define TARGET_SYS_fstat 108
|
||||||
#define TARGET_SYS_wait4 114
|
#define TARGET_SYS_wait4 114
|
||||||
#define TARGET_SYS_sigreturn 119
|
#define TARGET_SYS_sigreturn 119
|
||||||
@@ -260,6 +262,7 @@ static const char stat32_map[] =
|
|||||||
static const CB_TARGET_DEFS_MAP syscall_stat32_map[] =
|
static const CB_TARGET_DEFS_MAP syscall_stat32_map[] =
|
||||||
{
|
{
|
||||||
{ CB_SYS_fstat, TARGET_SYS_fstat },
|
{ CB_SYS_fstat, TARGET_SYS_fstat },
|
||||||
|
{ CB_SYS_stat, TARGET_SYS_stat },
|
||||||
{ 0, -1 }
|
{ 0, -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -661,15 +664,22 @@ static const CB_TARGET_DEFS_MAP errno_map[] =
|
|||||||
installation and removing synonyms and unnecessary items. Don't
|
installation and removing synonyms and unnecessary items. Don't
|
||||||
forget the end-marker. */
|
forget the end-marker. */
|
||||||
|
|
||||||
|
/* These we treat specially, as they're used in the fcntl F_GETFL
|
||||||
|
syscall. For consistency, open_map is also manually edited to use
|
||||||
|
these macros. */
|
||||||
|
#define TARGET_O_ACCMODE 0x3
|
||||||
|
#define TARGET_O_RDONLY 0x0
|
||||||
|
#define TARGET_O_WRONLY 0x1
|
||||||
|
|
||||||
static const CB_TARGET_DEFS_MAP open_map[] = {
|
static const CB_TARGET_DEFS_MAP open_map[] = {
|
||||||
#ifdef O_ACCMODE
|
#ifdef O_ACCMODE
|
||||||
{ O_ACCMODE, 0x3 },
|
{ O_ACCMODE, TARGET_O_ACCMODE },
|
||||||
#endif
|
#endif
|
||||||
#ifdef O_RDONLY
|
#ifdef O_RDONLY
|
||||||
{ O_RDONLY, 0x0 },
|
{ O_RDONLY, TARGET_O_RDONLY },
|
||||||
#endif
|
#endif
|
||||||
#ifdef O_WRONLY
|
#ifdef O_WRONLY
|
||||||
{ O_WRONLY, 0x1 },
|
{ O_WRONLY, TARGET_O_WRONLY },
|
||||||
#endif
|
#endif
|
||||||
#ifdef O_RDWR
|
#ifdef O_RDWR
|
||||||
{ O_RDWR, 0x2 },
|
{ O_RDWR, 0x2 },
|
||||||
@@ -1397,8 +1407,9 @@ cris_break_13_handler (SIM_CPU *current_cpu, USI callnum, USI arg1,
|
|||||||
|
|
||||||
case TARGET_SYS_fcntl64:
|
case TARGET_SYS_fcntl64:
|
||||||
case TARGET_SYS_fcntl:
|
case TARGET_SYS_fcntl:
|
||||||
if (arg2 == 1)
|
switch (arg2)
|
||||||
{
|
{
|
||||||
|
case 1:
|
||||||
/* F_GETFD.
|
/* F_GETFD.
|
||||||
Glibc checks stdin, stdout and stderr fd:s for
|
Glibc checks stdin, stdout and stderr fd:s for
|
||||||
close-on-exec security sanity. We just need to provide a
|
close-on-exec security sanity. We just need to provide a
|
||||||
@@ -1406,12 +1417,50 @@ cris_break_13_handler (SIM_CPU *current_cpu, USI callnum, USI arg1,
|
|||||||
close-on-exec flag true, we could just do a real fcntl
|
close-on-exec flag true, we could just do a real fcntl
|
||||||
here. */
|
here. */
|
||||||
retval = 0;
|
retval = 0;
|
||||||
}
|
break;
|
||||||
else if (arg2 == 2)
|
|
||||||
{
|
case 2:
|
||||||
/* F_SETFD. Just ignore attempts to set the close-on-exec
|
/* F_SETFD. Just ignore attempts to set the close-on-exec
|
||||||
flag. */
|
flag. */
|
||||||
retval = 0;
|
retval = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
/* F_GETFL. Check for the special case for open+fdopen. */
|
||||||
|
if (current_cpu->last_syscall == TARGET_SYS_open
|
||||||
|
&& arg1 == current_cpu->last_open_fd)
|
||||||
|
{
|
||||||
|
retval = current_cpu->last_open_flags & TARGET_O_ACCMODE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (arg1 == 0)
|
||||||
|
{
|
||||||
|
/* Because we can't freopen fd:s 0, 1, 2 to mean
|
||||||
|
something else than stdin, stdout and stderr
|
||||||
|
(sim/common/syscall.c:cb_syscall special cases fd
|
||||||
|
0, 1 and 2), we know what flags that we can
|
||||||
|
sanely return for these fd:s. */
|
||||||
|
retval = TARGET_O_RDONLY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (arg1 == 1 || arg1 == 2)
|
||||||
|
{
|
||||||
|
retval = TARGET_O_WRONLY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* FALLTHROUGH */
|
||||||
|
default:
|
||||||
|
/* Abort for all other cases. */
|
||||||
|
sim_io_eprintf (sd, "Unimplemented %s syscall "
|
||||||
|
"(fd: 0x%lx: cmd: 0x%lx arg: 0x%lx)\n",
|
||||||
|
callnum == TARGET_SYS_fcntl
|
||||||
|
? "fcntl" : "fcntl64",
|
||||||
|
(unsigned long) (USI) arg1,
|
||||||
|
(unsigned long) (USI) arg2,
|
||||||
|
(unsigned long) (USI) arg3);
|
||||||
|
sim_engine_halt (sd, current_cpu, NULL, pc, sim_stopped,
|
||||||
|
SIM_SIGILL);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -2324,6 +2373,7 @@ cris_break_13_handler (SIM_CPU *current_cpu, USI callnum, USI arg1,
|
|||||||
/* Add case labels here for other syscalls using the 32-bit
|
/* Add case labels here for other syscalls using the 32-bit
|
||||||
"struct stat", provided they have a corresponding simulator
|
"struct stat", provided they have a corresponding simulator
|
||||||
function of course. */
|
function of course. */
|
||||||
|
case TARGET_SYS_stat:
|
||||||
case TARGET_SYS_fstat:
|
case TARGET_SYS_fstat:
|
||||||
{
|
{
|
||||||
/* As long as the infrastructure doesn't cache anything
|
/* As long as the infrastructure doesn't cache anything
|
||||||
@@ -2816,6 +2866,14 @@ cris_break_13_handler (SIM_CPU *current_cpu, USI callnum, USI arg1,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Minimal support for fcntl F_GETFL as used in open+fdopen. */
|
||||||
|
if (callnum == TARGET_SYS_open)
|
||||||
|
{
|
||||||
|
current_cpu->last_open_fd = retval;
|
||||||
|
current_cpu->last_open_flags = arg2;
|
||||||
|
}
|
||||||
|
current_cpu->last_syscall = callnum;
|
||||||
|
|
||||||
/* A system call is a rescheduling point. For the time being, we don't
|
/* A system call is a rescheduling point. For the time being, we don't
|
||||||
reschedule anywhere else. */
|
reschedule anywhere else. */
|
||||||
if (current_cpu->m1threads != 0
|
if (current_cpu->m1threads != 0
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
2005-11-21 Hans-Peter Nilsson <hp@axis.com>
|
||||||
|
|
||||||
|
* sim/cris: New directory with C and assembly tests for the CRIS
|
||||||
|
simulator.
|
||||||
|
|
||||||
2005-01-11 Andrew Cagney <cagney@localhost.localdomain>
|
2005-01-11 Andrew Cagney <cagney@localhost.localdomain>
|
||||||
|
|
||||||
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
* configure: Regenerated to track ../common/aclocal.m4 changes.
|
||||||
|
|||||||
6931
texinfo/texinfo.tex
6931
texinfo/texinfo.tex
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user