2001-04-05  David S. Miller  <davem@redhat.com>

	Add hp-timing support for sparcv9/sparc64 targets.
	* sysdeps/sparc/sparc32/sparcv9/hp-timing.c: New file
	* sysdeps/sparc/sparc32/sparcv9/hp-timing.h: New file
	* sysdeps/sparc/sparc64/hp-timing.c: New file
	* sysdeps/sparc/sparc64/hp-timing.h: New file
	* sysdeps/sparc/sparc32/sparcv9/Makefile: Build hp-timing.
	* sysdeps/sparc/sparc64/Makefile: Likewise.

2001-04-09  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/generic/fd_to_filename.h: New file.
	* sysdeps/unix/sysv/linux/fd_to_filename.h: New file.
	* libio/freopen.c (freopen): If FILENAME is NULL, try to get
	filename from the open file descriptor.
	* libio/freopen64.c (freopen64): Likewise.

2001-04-09  Bruno Haible  <haible@clisp.cons.org>

	* misc/error.c (error): fflush stdout also if
	error_print_progname != NULL.
	(error_at_line): Likewise.

2001-04-07  Bruno Haible <haible@clisp.cons.org>

	* intl/gettextP.h (struct loaded_domain): Add codeset_cntr field.
	(struct binding): Add codeset_cntr field.
	(_nl_load_domain): Add domainbinding argument.
	(_nl_init_domain_conv, _nl_free_domain_conv): New declarations.
	(_nl_find_msg): New declaration, moved here from loadinfo.h.
	* intl/loadinfo.h (struct loaded_l10nfile): Remove domainbinding field.
	(_nl_make_l10nflist): Remove domainbinding argument.
	(_nl_find_msg): Move declaration to gettextP.h.
	* intl/bindtextdom.c (set_binding_values): Initialize ->codeset_cntr
	to 0.  Increment it when ->codeset is changed.
	* intl/dcigettext.c (DCIGETTEXT): Pass binding to _nl_find_msg.
	(_nl_find_msg): Add domainbinding argument.  Reinitialize the converter
	if domainbinding->codeset_cntr has been incremented.
	* intl/finddomain.c (_nl_find_domain): Don't pass domainbinding to
	_nl_make_l10nflist().  Pass it to _nl_load_domain() instead.
	* intl/l10nflist.c (_nl_make_l10nflist): Remove domainbinding argument.
	* intl/loadmsgcat.c (_nl_init_domain_conv): New function, extracted
	 from _nl_load_domain.  Append //TRANSLIT also when using libiconv.
	(_nl_free_domain_conv): New function, extracted from _nl_unload_domain.
	(_nl_load_domain): Add domainbinding argument.  Call
	_nl_init_domain_conv.
	(_nl_unload_domain): Call _nl_free_domain_conv.
	* intl/Makefile (distribute): Add tst-codeset.sh, tstcodeset.po.
	(test-srcs): Add tst-codeset.
	(tests): Depend on tst-codeset.out.
	(tst-codeset.out): New rule.
	(CFLAGS-tst-codeset.c): New variable.
	* intl/tst-codeset.sh: New file.
	* intl/tstcodeset.po: New file.
	* intl/tst-codeset.c: New file.
	* locale/findlocale.c (_nl_find_locale): Update _nl_make_l10nflist
	calls.
This commit is contained in:
Ulrich Drepper 2001-04-10 00:15:08 +00:00
parent f66d7d4f0d
commit c44a663dca
25 changed files with 703 additions and 133 deletions

View File

@ -1,3 +1,62 @@
2001-04-05 David S. Miller <davem@redhat.com>
Add hp-timing support for sparcv9/sparc64 targets.
* sysdeps/sparc/sparc32/sparcv9/hp-timing.c: New file
* sysdeps/sparc/sparc32/sparcv9/hp-timing.h: New file
* sysdeps/sparc/sparc64/hp-timing.c: New file
* sysdeps/sparc/sparc64/hp-timing.h: New file
* sysdeps/sparc/sparc32/sparcv9/Makefile: Build hp-timing.
* sysdeps/sparc/sparc64/Makefile: Likewise.
2001-04-09 Jakub Jelinek <jakub@redhat.com>
* sysdeps/generic/fd_to_filename.h: New file.
* sysdeps/unix/sysv/linux/fd_to_filename.h: New file.
* libio/freopen.c (freopen): If FILENAME is NULL, try to get
filename from the open file descriptor.
* libio/freopen64.c (freopen64): Likewise.
2001-04-09 Bruno Haible <haible@clisp.cons.org>
* misc/error.c (error): fflush stdout also if
error_print_progname != NULL.
(error_at_line): Likewise.
2001-04-07 Bruno Haible <haible@clisp.cons.org>
* intl/gettextP.h (struct loaded_domain): Add codeset_cntr field.
(struct binding): Add codeset_cntr field.
(_nl_load_domain): Add domainbinding argument.
(_nl_init_domain_conv, _nl_free_domain_conv): New declarations.
(_nl_find_msg): New declaration, moved here from loadinfo.h.
* intl/loadinfo.h (struct loaded_l10nfile): Remove domainbinding field.
(_nl_make_l10nflist): Remove domainbinding argument.
(_nl_find_msg): Move declaration to gettextP.h.
* intl/bindtextdom.c (set_binding_values): Initialize ->codeset_cntr
to 0. Increment it when ->codeset is changed.
* intl/dcigettext.c (DCIGETTEXT): Pass binding to _nl_find_msg.
(_nl_find_msg): Add domainbinding argument. Reinitialize the converter
if domainbinding->codeset_cntr has been incremented.
* intl/finddomain.c (_nl_find_domain): Don't pass domainbinding to
_nl_make_l10nflist(). Pass it to _nl_load_domain() instead.
* intl/l10nflist.c (_nl_make_l10nflist): Remove domainbinding argument.
* intl/loadmsgcat.c (_nl_init_domain_conv): New function, extracted
from _nl_load_domain. Append //TRANSLIT also when using libiconv.
(_nl_free_domain_conv): New function, extracted from _nl_unload_domain.
(_nl_load_domain): Add domainbinding argument. Call
_nl_init_domain_conv.
(_nl_unload_domain): Call _nl_free_domain_conv.
* intl/Makefile (distribute): Add tst-codeset.sh, tstcodeset.po.
(test-srcs): Add tst-codeset.
(tests): Depend on tst-codeset.out.
(tst-codeset.out): New rule.
(CFLAGS-tst-codeset.c): New variable.
* intl/tst-codeset.sh: New file.
* intl/tstcodeset.po: New file.
* intl/tst-codeset.c: New file.
* locale/findlocale.c (_nl_find_locale): Update _nl_make_l10nflist
calls.
2001-04-07 Roland McGrath <roland@frob.com> 2001-04-07 Roland McGrath <roland@frob.com>
* mach/msgserver.c (__mach_msg_server_timeout): Add an assert. * mach/msgserver.c (__mach_msg_server_timeout): Add an assert.

View File

@ -25,10 +25,10 @@ routines = bindtextdom dcgettext dgettext gettext \
finddomain loadmsgcat localealias textdomain \ finddomain loadmsgcat localealias textdomain \
l10nflist explodename plural l10nflist explodename plural
distribute = gettext.h gettextP.h hash-string.h loadinfo.h locale.alias \ distribute = gettext.h gettextP.h hash-string.h loadinfo.h locale.alias \
plural.y po2test.sed tst-gettext.sh tst-translit.sh \ plural.y po2test.sed tst-gettext.sh tst-translit.sh tst-codeset.sh \
translit.po tst-gettext2.sh tstlang1.po tstlang2.po translit.po tst-gettext2.sh tstlang1.po tstlang2.po tstcodeset.po
test-srcs := tst-gettext tst-translit tst-gettext2 test-srcs := tst-gettext tst-translit tst-gettext2 tst-codeset
tests = tst-ngettext tests = tst-ngettext
before-compile = $(objpfx)msgs.h before-compile = $(objpfx)msgs.h
@ -54,7 +54,8 @@ include ../Rules
ifeq (no,$(cross-compiling)) ifeq (no,$(cross-compiling))
ifeq (yes,$(build-shared)) ifeq (yes,$(build-shared))
ifneq ($(strip $(MSGFMT)),:) ifneq ($(strip $(MSGFMT)),:)
tests: $(objpfx)tst-translit.out $(objpfx)tst-gettext2.out tests: $(objpfx)tst-translit.out $(objpfx)tst-gettext2.out \
$(objpfx)tst-codeset.out
endif endif
ifneq (no,$(PERL)) ifneq (no,$(PERL))
tests: $(objpfx)mtrace-tst-gettext tests: $(objpfx)mtrace-tst-gettext
@ -68,6 +69,8 @@ $(objpfx)tst-translit.out: tst-translit.sh $(objpfx)tst-translit
$(SHELL) -e $< $(common-objpfx) $(common-objpfx)intl/ $(SHELL) -e $< $(common-objpfx) $(common-objpfx)intl/
$(objpfx)tst-gettext2.out: tst-gettext2.sh $(objpfx)tst-gettext2 $(objpfx)tst-gettext2.out: tst-gettext2.sh $(objpfx)tst-gettext2
$(SHELL) -e $< $(common-objpfx) $(common-objpfx)intl/ $(SHELL) -e $< $(common-objpfx) $(common-objpfx)intl/
$(objpfx)tst-codeset.out: tst-codeset.sh $(objpfx)tst-codeset
$(SHELL) -e $< $(common-objpfx) $(common-objpfx)intl/
endif endif
endif endif
@ -78,6 +81,7 @@ $(objpfx)msgs.h: po2test.sed ../po/de.po
CFLAGS-tst-gettext.c = -DTESTSTRS_H=\"$(objpfx)msgs.h\" CFLAGS-tst-gettext.c = -DTESTSTRS_H=\"$(objpfx)msgs.h\"
CFLAGS-tst-gettext2.c = -DOBJPFX=\"$(objpfx)\" CFLAGS-tst-gettext2.c = -DOBJPFX=\"$(objpfx)\"
CFLAGS-tst-translit.c = -DOBJPFX=\"$(objpfx)\" CFLAGS-tst-translit.c = -DOBJPFX=\"$(objpfx)\"
CFLAGS-tst-codeset.c = -DOBJPFX=\"$(objpfx)\"
$(objpfx)tst-translit.out: $(objpfx)tst-gettext.out $(objpfx)tst-translit.out: $(objpfx)tst-gettext.out

View File

@ -218,6 +218,7 @@ set_binding_values (domainname, dirnamep, codesetp)
free (binding->codeset); free (binding->codeset);
binding->codeset = result; binding->codeset = result;
++binding->codeset_cntr;
modified = 1; modified = 1;
} }
} }
@ -281,6 +282,8 @@ set_binding_values (domainname, dirnamep, codesetp)
/* The default value. */ /* The default value. */
new_binding->dirname = (char *) _nl_default_dirname; new_binding->dirname = (char *) _nl_default_dirname;
new_binding->codeset_cntr = 0;
if (codesetp) if (codesetp)
{ {
const char *codeset = *codesetp; const char *codeset = *codesetp;
@ -301,6 +304,7 @@ set_binding_values (domainname, dirnamep, codesetp)
memcpy (result, codeset, len); memcpy (result, codeset, len);
#endif #endif
codeset = result; codeset = result;
++new_binding->codeset_cntr;
} }
*codesetp = codeset; *codesetp = codeset;
new_binding->codeset = (char *) codeset; new_binding->codeset = (char *) codeset;

View File

@ -574,7 +574,7 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
if (domain != NULL) if (domain != NULL)
{ {
retval = _nl_find_msg (domain, msgid1, &retlen); retval = _nl_find_msg (domain, binding, msgid1, &retlen);
if (retval == NULL) if (retval == NULL)
{ {
@ -582,8 +582,8 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
for (cnt = 0; domain->successor[cnt] != NULL; ++cnt) for (cnt = 0; domain->successor[cnt] != NULL; ++cnt)
{ {
retval = _nl_find_msg (domain->successor[cnt], msgid1, retval = _nl_find_msg (domain->successor[cnt], binding,
&retlen); msgid1, &retlen);
if (retval != NULL) if (retval != NULL)
{ {
@ -652,8 +652,9 @@ DCIGETTEXT (domainname, msgid1, msgid2, plural, n, category)
char * char *
internal_function internal_function
_nl_find_msg (domain_file, msgid, lengthp) _nl_find_msg (domain_file, domainbinding, msgid, lengthp)
struct loaded_l10nfile *domain_file; struct loaded_l10nfile *domain_file;
struct binding *domainbinding;
const char *msgid; const char *msgid;
size_t *lengthp; size_t *lengthp;
{ {
@ -663,7 +664,7 @@ _nl_find_msg (domain_file, msgid, lengthp)
size_t resultlen; size_t resultlen;
if (domain_file->decided == 0) if (domain_file->decided == 0)
_nl_load_domain (domain_file); _nl_load_domain (domain_file, domainbinding);
if (domain_file->data == NULL) if (domain_file->data == NULL)
return NULL; return NULL;
@ -742,6 +743,16 @@ _nl_find_msg (domain_file, msgid, lengthp)
resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1; resultlen = W (domain->must_swap, domain->trans_tab[act].length) + 1;
#if defined _LIBC || HAVE_ICONV #if defined _LIBC || HAVE_ICONV
if (domain->codeset_cntr
!= (domainbinding != NULL ? domainbinding->codeset_cntr : 0))
{
/* The domain's codeset has changed through bind_textdomain_codeset()
since the message catalog was initialized or last accessed. We
have to reinitialize the converter. */
_nl_free_domain_conv (domain);
_nl_init_domain_conv (domain_file, domain, domainbinding);
}
if ( if (
# ifdef _LIBC # ifdef _LIBC
domain->conv != (__gconv_t) -1 domain->conv != (__gconv_t) -1

View File

@ -107,15 +107,14 @@ _nl_find_domain (dirname, locale, domainname, domainbinding)
be one data set in the list of loaded domains. */ be one data set in the list of loaded domains. */
retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
strlen (dirname) + 1, 0, locale, NULL, NULL, strlen (dirname) + 1, 0, locale, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, domainname, NULL, NULL, NULL, NULL, NULL, domainname, 0);
domainbinding, 0);
if (retval != NULL) if (retval != NULL)
{ {
/* We know something about this locale. */ /* We know something about this locale. */
int cnt; int cnt;
if (retval->decided == 0) if (retval->decided == 0)
_nl_load_domain (retval); _nl_load_domain (retval, domainbinding);
if (retval->data != NULL) if (retval->data != NULL)
return retval; return retval;
@ -123,7 +122,7 @@ _nl_find_domain (dirname, locale, domainname, domainbinding)
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
{ {
if (retval->successor[cnt]->decided == 0) if (retval->successor[cnt]->decided == 0)
_nl_load_domain (retval->successor[cnt]); _nl_load_domain (retval->successor[cnt], domainbinding);
if (retval->successor[cnt]->data != NULL) if (retval->successor[cnt]->data != NULL)
break; break;
@ -164,21 +163,20 @@ _nl_find_domain (dirname, locale, domainname, domainbinding)
retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname, retval = _nl_make_l10nflist (&_nl_loaded_domains, dirname,
strlen (dirname) + 1, mask, language, territory, strlen (dirname) + 1, mask, language, territory,
codeset, normalized_codeset, modifier, special, codeset, normalized_codeset, modifier, special,
sponsor, revision, domainname, domainbinding, sponsor, revision, domainname, 1);
1);
if (retval == NULL) if (retval == NULL)
/* This means we are out of core. */ /* This means we are out of core. */
return NULL; return NULL;
if (retval->decided == 0) if (retval->decided == 0)
_nl_load_domain (retval); _nl_load_domain (retval, domainbinding);
if (retval->data == NULL) if (retval->data == NULL)
{ {
int cnt; int cnt;
for (cnt = 0; retval->successor[cnt] != NULL; ++cnt) for (cnt = 0; retval->successor[cnt] != NULL; ++cnt)
{ {
if (retval->successor[cnt]->decided == 0) if (retval->successor[cnt]->decided == 0)
_nl_load_domain (retval->successor[cnt]); _nl_load_domain (retval->successor[cnt], domainbinding);
if (retval->successor[cnt]->data != NULL) if (retval->successor[cnt]->data != NULL)
break; break;
} }

View File

@ -131,6 +131,7 @@ struct loaded_domain
struct string_desc *trans_tab; struct string_desc *trans_tab;
nls_uint32 hash_size; nls_uint32 hash_size;
nls_uint32 *hash_tab; nls_uint32 *hash_tab;
int codeset_cntr;
#ifdef _LIBC #ifdef _LIBC
__gconv_t conv; __gconv_t conv;
#else #else
@ -158,6 +159,7 @@ struct binding
{ {
struct binding *next; struct binding *next;
char *dirname; char *dirname;
int codeset_cntr; /* Incremented each time codeset changes. */
char *codeset; char *codeset;
char domainname[ZERO]; char domainname[ZERO];
}; };
@ -172,10 +174,22 @@ struct loaded_l10nfile *_nl_find_domain PARAMS ((const char *__dirname,
const char *__domainname, const char *__domainname,
struct binding *__domainbinding)) struct binding *__domainbinding))
internal_function; internal_function;
void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain)) void _nl_load_domain PARAMS ((struct loaded_l10nfile *__domain,
struct binding *__domainbinding))
internal_function; internal_function;
void _nl_unload_domain PARAMS ((struct loaded_domain *__domain)) void _nl_unload_domain PARAMS ((struct loaded_domain *__domain))
internal_function; internal_function;
const char *_nl_init_domain_conv PARAMS ((struct loaded_l10nfile *__domain_file,
struct loaded_domain *__domain,
struct binding *__domainbinding))
internal_function;
void _nl_free_domain_conv PARAMS ((struct loaded_domain *__domain))
internal_function;
char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file,
struct binding *domainbinding,
const char *msgid, size_t *lengthp))
internal_function;
#ifdef _LIBC #ifdef _LIBC
extern char *__gettext PARAMS ((const char *__msgid)); extern char *__gettext PARAMS ((const char *__msgid));

View File

@ -175,7 +175,7 @@ pop (x)
struct loaded_l10nfile * struct loaded_l10nfile *
_nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language, _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
territory, codeset, normalized_codeset, modifier, special, territory, codeset, normalized_codeset, modifier, special,
sponsor, revision, filename, domainbinding, do_allocate) sponsor, revision, filename, do_allocate)
struct loaded_l10nfile **l10nfile_list; struct loaded_l10nfile **l10nfile_list;
const char *dirlist; const char *dirlist;
size_t dirlist_len; size_t dirlist_len;
@ -189,7 +189,6 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
const char *sponsor; const char *sponsor;
const char *revision; const char *revision;
const char *filename; const char *filename;
struct binding *domainbinding;
int do_allocate; int do_allocate;
{ {
char *abs_filename; char *abs_filename;
@ -310,7 +309,6 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
return NULL; return NULL;
retval->filename = abs_filename; retval->filename = abs_filename;
retval->domainbinding = domainbinding;
retval->decided = (__argz_count (dirlist, dirlist_len) != 1 retval->decided = (__argz_count (dirlist, dirlist_len) != 1
|| ((mask & XPG_CODESET) != 0 || ((mask & XPG_CODESET) != 0
&& (mask & XPG_NORM_CODESET) != 0)); && (mask & XPG_NORM_CODESET) != 0));
@ -346,8 +344,7 @@ _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
= _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt, = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1, cnt,
language, territory, codeset, language, territory, codeset,
normalized_codeset, modifier, special, normalized_codeset, modifier, special,
sponsor, revision, filename, domainbinding, sponsor, revision, filename, 1);
1);
} }
retval->successor[entries] = NULL; retval->successor[entries] = NULL;

View File

@ -55,7 +55,6 @@
struct loaded_l10nfile struct loaded_l10nfile
{ {
const char *filename; const char *filename;
struct binding *domainbinding;
int decided; int decided;
const void *data; const void *data;
@ -80,8 +79,7 @@ _nl_make_l10nflist PARAMS ((struct loaded_l10nfile **l10nfile_list,
const char *normalized_codeset, const char *normalized_codeset,
const char *modifier, const char *special, const char *modifier, const char *special,
const char *sponsor, const char *revision, const char *sponsor, const char *revision,
const char *filename, const char *filename, int do_allocate));
struct binding *domainbinding, int do_allocate));
extern const char *_nl_expand_alias PARAMS ((const char *name)); extern const char *_nl_expand_alias PARAMS ((const char *name));
@ -99,9 +97,4 @@ extern int _nl_explode_name PARAMS ((char *name, const char **language,
extern char *_nl_find_language PARAMS ((const char *name)); extern char *_nl_find_language PARAMS ((const char *name));
extern char *_nl_find_msg PARAMS ((struct loaded_l10nfile *domain_file,
const char *msgid, size_t *lengthp))
internal_function;
#endif /* loadinfo.h */ #endif /* loadinfo.h */

View File

@ -190,12 +190,146 @@ init_germanic_plural ()
#endif #endif
/* Initialize the codeset dependent parts of an opened message catalog.
Return the header entry. */
const char *
internal_function
_nl_init_domain_conv (domain_file, domain, domainbinding)
struct loaded_l10nfile *domain_file;
struct loaded_domain *domain;
struct binding *domainbinding;
{
/* Find out about the character set the file is encoded with.
This can be found (in textual form) in the entry "". If this
entry does not exist or if this does not contain the `charset='
information, we will assume the charset matches the one the
current locale and we don't have to perform any conversion. */
char *nullentry;
size_t nullentrylen;
/* Preinitialize fields, to avoid recursion during _nl_find_msg. */
domain->codeset_cntr =
(domainbinding != NULL ? domainbinding->codeset_cntr : 0);
#ifdef _LIBC
domain->conv = (__gconv_t) -1;
#else
# if HAVE_ICONV
domain->conv = (iconv_t) -1;
# endif
#endif
domain->conv_tab = NULL;
/* Get the header entry. */
nullentry = _nl_find_msg (domain_file, domainbinding, "", &nullentrylen);
if (nullentry != NULL)
{
#if defined _LIBC || HAVE_ICONV
const char *charsetstr;
charsetstr = strstr (nullentry, "charset=");
if (charsetstr != NULL)
{
size_t len;
char *charset;
const char *outcharset;
charsetstr += strlen ("charset=");
len = strcspn (charsetstr, " \t\n");
charset = (char *) alloca (len + 1);
# if defined _LIBC || HAVE_MEMPCPY
*((char *) mempcpy (charset, charsetstr, len)) = '\0';
# else
memcpy (charset, charsetstr, len);
charset[len] = '\0';
# endif
/* The output charset should normally be determined by the
locale. But sometimes the locale is not used or not correctly
set up, so we provide a possibility for the user to override
this. Moreover, the value specified through
bind_textdomain_codeset overrides both. */
if (domainbinding != NULL && domainbinding->codeset != NULL)
outcharset = domainbinding->codeset;
else
{
outcharset = getenv ("OUTPUT_CHARSET");
if (outcharset == NULL || outcharset[0] == '\0')
{
# ifdef _LIBC
outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string;
# else
# if HAVE_ICONV
extern const char *locale_charset (void);
outcharset = locale_charset ();
# endif
# endif
}
}
# ifdef _LIBC
/* We always want to use transliteration. */
outcharset = norm_add_slashes (outcharset, "TRANSLIT");
charset = norm_add_slashes (charset, NULL);
if (__gconv_open (outcharset, charset, &domain->conv,
GCONV_AVOID_NOCONV)
!= __GCONV_OK)
domain->conv = (__gconv_t) -1;
# else
# if HAVE_ICONV
/* When using GNU libiconv, we want to use transliteration. */
# if _LIBICONV_VERSION
len = strlen (outcharset);
{
char *tmp = (char *) alloca (len + 10 + 1);
memcpy (tmp, outcharset, len);
memcpy (tmp + len, "//TRANSLIT", 10 + 1);
outcharset = tmp;
}
# endif
domain->conv = iconv_open (outcharset, charset);
# if _LIBICONV_VERSION
freea (outcharset);
# endif
# endif
# endif
freea (charset);
}
#endif /* _LIBC || HAVE_ICONV */
}
return nullentry;
}
/* Frees the codeset dependent parts of an opened message catalog. */
void
internal_function
_nl_free_domain_conv (domain)
struct loaded_domain *domain;
{
if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1)
free (domain->conv_tab);
#ifdef _LIBC
if (domain->conv != (__gconv_t) -1)
__gconv_close (domain->conv);
#else
# if HAVE_ICONV
if (domain->conv != (iconv_t) -1)
iconv_close (domain->conv);
# endif
#endif
}
/* Load the message catalogs specified by FILENAME. If it is no valid /* Load the message catalogs specified by FILENAME. If it is no valid
message catalog do nothing. */ message catalog do nothing. */
void void
internal_function internal_function
_nl_load_domain (domain_file) _nl_load_domain (domain_file, domainbinding)
struct loaded_l10nfile *domain_file; struct loaded_l10nfile *domain_file;
struct binding *domainbinding;
{ {
int fd; int fd;
size_t size; size_t size;
@ -207,12 +341,15 @@ _nl_load_domain (domain_file)
struct mo_file_header *data = (struct mo_file_header *) -1; struct mo_file_header *data = (struct mo_file_header *) -1;
int use_mmap = 0; int use_mmap = 0;
struct loaded_domain *domain; struct loaded_domain *domain;
char *nullentry; const char *nullentry;
size_t nullentrylen;
domain_file->decided = 1; domain_file->decided = 1;
domain_file->data = NULL; domain_file->data = NULL;
/* Note that it would be useless to store domainbinding in domain_file
because domainbinding might be == NULL now but != NULL later (after
a call to bind_textdomain_codeset). */
/* If the record does not represent a valid locale the FILENAME /* If the record does not represent a valid locale the FILENAME
might be NULL. This can happen when according to the given might be NULL. This can happen when according to the given
specification the locale file name is different for XPG and CEN specification the locale file name is different for XPG and CEN
@ -338,85 +475,10 @@ _nl_load_domain (domain_file)
return; return;
} }
/* Now find out about the character set the file is encoded with. /* Now initialize the character set converter from the character set
This can be found (in textual form) in the entry "". If this the file is encoded with (found in the header entry) to the domain's
entry does not exist or if this does not contain the `charset=' specified character set or the locale's character set. */
information, we will assume the charset matches the one the nullentry = _nl_init_domain_conv (domain_file, domain, domainbinding);
current locale and we don't have to perform any conversion. */
#ifdef _LIBC
domain->conv = (__gconv_t) -1;
#else
# if HAVE_ICONV
domain->conv = (iconv_t) -1;
# endif
#endif
domain->conv_tab = NULL;
nullentry = _nl_find_msg (domain_file, "", &nullentrylen);
if (nullentry != NULL)
{
#if defined _LIBC || HAVE_ICONV
const char *charsetstr;
charsetstr = strstr (nullentry, "charset=");
if (charsetstr != NULL)
{
size_t len;
char *charset;
const char *outcharset;
charsetstr += strlen ("charset=");
len = strcspn (charsetstr, " \t\n");
charset = (char *) alloca (len + 1);
# if defined _LIBC || HAVE_MEMPCPY
*((char *) mempcpy (charset, charsetstr, len)) = '\0';
# else
memcpy (charset, charsetstr, len);
charset[len] = '\0';
# endif
/* The output charset should normally be determined by the
locale. But sometimes the locale is not used or not correctly
set up, so we provide a possibility for the user to override
this. Moreover, the value specified through
bind_textdomain_codeset overrides both. */
if (domain_file->domainbinding != NULL
&& domain_file->domainbinding->codeset != NULL)
outcharset = domain_file->domainbinding->codeset;
else
{
outcharset = getenv ("OUTPUT_CHARSET");
if (outcharset == NULL || outcharset[0] == '\0')
{
# ifdef _LIBC
outcharset = (*_nl_current[LC_CTYPE])->values[_NL_ITEM_INDEX (CODESET)].string;
# else
# if HAVE_ICONV
extern const char *locale_charset (void);
outcharset = locale_charset ();
# endif
# endif
}
}
# ifdef _LIBC
/* We always want to use transliteration. */
outcharset = norm_add_slashes (outcharset, "TRANSLIT");
charset = norm_add_slashes (charset, NULL);
if (__gconv_open (outcharset, charset, &domain->conv,
GCONV_AVOID_NOCONV)
!= __GCONV_OK)
domain->conv = (__gconv_t) -1;
# else
# if HAVE_ICONV
domain->conv = iconv_open (outcharset, charset);
# endif
# endif
freea (charset);
}
#endif /* _LIBC || HAVE_ICONV */
}
/* Also look for a plural specification. */ /* Also look for a plural specification. */
if (nullentry != NULL) if (nullentry != NULL)
@ -481,11 +543,7 @@ _nl_unload_domain (domain)
if (domain->plural != &germanic_plural) if (domain->plural != &germanic_plural)
__gettext_free_exp (domain->plural); __gettext_free_exp (domain->plural);
if (domain->conv_tab != NULL && domain->conv_tab != (char **) -1) _nl_free_domain_conv (domain);
free (domain->conv_tab);
if (domain->conv != (__gconv_t) -1)
__gconv_close (domain->conv);
# ifdef _POSIX_MAPPED_FILES # ifdef _POSIX_MAPPED_FILES
if (domain->use_mmap) if (domain->use_mmap)

56
intl/tst-codeset.c Normal file
View File

@ -0,0 +1,56 @@
/* Test of bind_textdomain_codeset.
Copyright (C) 2001 Free Software Foundation, Inc.
Contributed by Bruno Haible <haible@clisp.cons.org>, 2001.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int
main (void)
{
char *s;
int result = 0;
unsetenv ("LANGUAGE");
unsetenv ("OUTPUT_CHARSET");
setlocale (LC_ALL, "de_DE.ISO-8859-1");
textdomain ("codeset");
bindtextdomain ("codeset", OBJPFX "domaindir");
/* Here we expect output in ISO-8859-1. */
s = gettext ("cheese");
if (strcmp (s, "K\344se"))
{
printf ("call 1 returned: %s\n", s);
result = 1;
}
bind_textdomain_codeset ("codeset", "UTF-8");
/* Here we expect output in UTF-8. */
s = gettext ("cheese");
if (strcmp (s, "K\303\244se"))
{
printf ("call 2 returned: %s\n", s);
result = 1;
}
return result;
}

42
intl/tst-codeset.sh Normal file
View File

@ -0,0 +1,42 @@
#! /bin/sh
# Test of bind_textdomain_codeset.
# Copyright (C) 2001 Free Software Foundation, Inc.
# This file is part of the GNU C Library.
#
# 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.,
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
common_objpfx=$1
objpfx=$2
GCONV_PATH=${common_objpfx}iconvdata
export GCONV_PATH
LOCPATH=${common_objpfx}localedata
export LOCPATH
LC_ALL=C
export LC_ALL
# Generate the test data.
test -d ${objpfx}domaindir || mkdir ${objpfx}domaindir
# Create the domain directories.
test -d ${objpfx}domaindir/de_DE || mkdir ${objpfx}domaindir/de_DE
test -d ${objpfx}domaindir/de_DE/LC_MESSAGES || mkdir ${objpfx}domaindir/de_DE/LC_MESSAGES
# Populate them.
msgfmt -o ${objpfx}domaindir/de_DE/LC_MESSAGES/codeset.mo tstcodeset.po
${common_objpfx}elf/ld.so --library-path $common_objpfx \
${objpfx}tst-codeset > ${objpfx}tst-codeset.out
exit $?

8
intl/tstcodeset.po Normal file
View File

@ -0,0 +1,8 @@
msgid ""
msgstr ""
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8-bit\n"
msgid "cheese"
msgstr "Käse"

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993,95,96,97,98,2000 Free Software Foundation, Inc. /* Copyright (C) 1993,95,96,97,98,2000,2001 Free Software Foundation, Inc.
This file is part of the GNU IO Library. This file is part of the GNU IO Library.
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
@ -27,6 +27,7 @@
#include "stdio.h" #include "stdio.h"
#include <shlib-compat.h> #include <shlib-compat.h>
#include <fd_to_filename.h>
FILE* FILE*
freopen (filename, mode, fp) freopen (filename, mode, fp)
@ -35,11 +36,18 @@ freopen (filename, mode, fp)
FILE* fp; FILE* fp;
{ {
FILE *result; FILE *result;
int fd = -1;
CHECK_FILE (fp, NULL); CHECK_FILE (fp, NULL);
if (!(fp->_flags & _IO_IS_FILEBUF)) if (!(fp->_flags & _IO_IS_FILEBUF))
return NULL; return NULL;
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp); _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
_IO_flockfile (fp); _IO_flockfile (fp);
if (filename == NULL && _IO_fileno (fp) >= 0)
{
fd = dup (_IO_fileno (fp));
if (fd != -1)
filename = fd_to_filename (fd);
}
#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1) #if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_1)
if (&_IO_stdin_used == NULL) if (&_IO_stdin_used == NULL)
/* If the shared C library is used by the application binary which /* If the shared C library is used by the application binary which
@ -54,6 +62,12 @@ freopen (filename, mode, fp)
if (result != NULL) if (result != NULL)
/* unbound stream orientation */ /* unbound stream orientation */
result->_mode = 0; result->_mode = 0;
if (fd != -1)
{
close (fd);
if (filename != NULL)
free ((char *) filename);
}
_IO_funlockfile (fp); _IO_funlockfile (fp);
_IO_cleanup_region_end (0); _IO_cleanup_region_end (0);
return result; return result;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1993,1995,1996,1997,1998,2000 Free Software Foundation, Inc. /* Copyright (C) 1993,1995,1996,1997,1998,2000,2001 Free Software Foundation, Inc.
This file is part of the GNU IO Library. This file is part of the GNU IO Library.
This library is free software; you can redistribute it and/or This library is free software; you can redistribute it and/or
@ -26,6 +26,8 @@
#include "libioP.h" #include "libioP.h"
#include "stdio.h" #include "stdio.h"
#include <fd_to_filename.h>
FILE * FILE *
freopen64 (filename, mode, fp) freopen64 (filename, mode, fp)
const char* filename; const char* filename;
@ -34,15 +36,28 @@ freopen64 (filename, mode, fp)
{ {
#ifdef _G_OPEN64 #ifdef _G_OPEN64
FILE *result; FILE *result;
int fd = -1;
CHECK_FILE (fp, NULL); CHECK_FILE (fp, NULL);
if (!(fp->_flags & _IO_IS_FILEBUF)) if (!(fp->_flags & _IO_IS_FILEBUF))
return NULL; return NULL;
_IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp); _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
_IO_flockfile (fp); _IO_flockfile (fp);
if (filename == NULL && _IO_fileno (fp) >= 0)
{
fd = dup (_IO_fileno (fp));
if (fd != -1)
filename = fd_to_filename (fd);
}
result = _IO_freopen64 (filename, mode, fp); result = _IO_freopen64 (filename, mode, fp);
if (result != NULL) if (result != NULL)
/* unbound stream orientation */ /* unbound stream orientation */
result->_mode = 0; result->_mode = 0;
if (fd != -1)
{
close (fd);
if (filename != NULL)
free ((char *) filename);
}
_IO_funlockfile (fp); _IO_funlockfile (fp);
_IO_cleanup_region_end (0); _IO_cleanup_region_end (0);
return result; return result;

View File

@ -123,7 +123,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
language, territory, codeset, language, territory, codeset,
normalized_codeset, modifier, special, normalized_codeset, modifier, special,
sponsor, revision, sponsor, revision,
_nl_category_names[category], NULL, 0); _nl_category_names[category], 0);
if (locale_file == NULL) if (locale_file == NULL)
{ {
@ -134,7 +134,7 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
language, territory, codeset, language, territory, codeset,
normalized_codeset, modifier, special, normalized_codeset, modifier, special,
sponsor, revision, sponsor, revision,
_nl_category_names[category], NULL, 1); _nl_category_names[category], 1);
if (locale_file == NULL) if (locale_file == NULL)
/* This means we are out of core. */ /* This means we are out of core. */
return NULL; return NULL;

View File

@ -873,7 +873,7 @@ The @code{putchar} function is equivalent to @code{putc} with
@comment wchar.h @comment wchar.h
@comment ISO @comment ISO
@deftypefun wint_t putchar (wchar_t @var{wc}) @deftypefun wint_t putwchar (wchar_t @var{wc})
The @code{putwchar} function is equivalent to @code{putwc} with The @code{putwchar} function is equivalent to @code{putwc} with
@code{stdout} as the value of the @var{stream} argument. @code{stdout} as the value of the @var{stream} argument.
@end deftypefun @end deftypefun

View File

@ -1,5 +1,5 @@
/* Error handler for noninteractive utilities /* Error handler for noninteractive utilities
Copyright (C) 1990-1998, 2000 Free Software Foundation, Inc. Copyright (C) 1990-1998, 2000, 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library. Its master source is NOT part of This file is part of the GNU C Library. Its master source is NOT part of
the C library, however. The master source lives in /gd/gnu/lib. the C library, however. The master source lives in /gd/gnu/lib.
@ -139,13 +139,11 @@ error (status, errnum, message, va_alist)
va_list args; va_list args;
#endif #endif
fflush (stdout);
if (error_print_progname) if (error_print_progname)
(*error_print_progname) (); (*error_print_progname) ();
else else
{
fflush (stdout);
fprintf (stderr, "%s: ", program_name); fprintf (stderr, "%s: ", program_name);
}
#ifdef VA_START #ifdef VA_START
VA_START (args, message); VA_START (args, message);
@ -211,13 +209,11 @@ error_at_line (status, errnum, file_name, line_number, message, va_alist)
old_line_number = line_number; old_line_number = line_number;
} }
fflush (stdout);
if (error_print_progname) if (error_print_progname)
(*error_print_progname) (); (*error_print_progname) ();
else else
{
fflush (stdout);
fprintf (stderr, "%s:", program_name); fprintf (stderr, "%s:", program_name);
}
if (file_name != NULL) if (file_name != NULL)
fprintf (stderr, "%s:%d: ", file_name, line_number); fprintf (stderr, "%s:%d: ", file_name, line_number);

View File

@ -0,0 +1,26 @@
/* Query filename corresponding to an open FD. Generic version.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* In general there is no generic way to query filename for an open
file descriptor. */
static inline const char *
fd_to_filename (int fd)
{
return NULL;
}

View File

@ -1,5 +1,9 @@
sysdep-CFLAGS += -mcpu=v8 -mtune=ultrasparc -Wa,-Av9a sysdep-CFLAGS += -mcpu=v8 -mtune=ultrasparc -Wa,-Av9a
ifeq ($(subdir),csu)
sysdep_routines += hp-timing
endif
ifeq ($(subst gnulib,string,$(subdir)),string) ifeq ($(subst gnulib,string,$(subdir)),string)
ASFLAGS-.o += -Wa,-Av9a ASFLAGS-.o += -Wa,-Av9a
ASFLAGS-.os += -Wa,-Av9a ASFLAGS-.os += -Wa,-Av9a

View File

@ -0,0 +1,24 @@
/* Support for high precision, low overhead timing functions. sparcv9 version.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@redhat.com>, 2001.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <hp-timing.h>
/* We have to define the variable for the overhead. */
hp_timing_t __libc_hp_timing_overhead;

View File

@ -0,0 +1,89 @@
/* High precision, low overhead timing functions. sparcv9 version.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@redhat.com>, 2001.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _HP_TIMING_H
#define _HP_TIMING_H 1
#include <string.h>
#include <sys/param.h>
#include <stdio-common/_itoa.h>
#define HP_TIMING_AVAIL (1)
#define HP_TIMING_INLINE (1)
typedef unsigned long long int hp_timing_t;
extern hp_timing_t __libc_hp_timing_overhead;
#define HP_TIMING_ZERO(Var) (Var) = (0)
#define HP_TIMING_NOW(Var) \
__asm__ __volatile__ ("rd %%tick, %L0\n\t" \
"srlx %L0, 32, %H0" \
: "=r" (Var))
#define HP_TIMING_DIFF_INIT() \
do { \
int __cnt = 5; \
__libc_hp_timing_overhead = ~0ull; \
do \
{ \
hp_timing_t __t1, __t2; \
HP_TIMING_NOW (__t1); \
HP_TIMING_NOW (__t2); \
if (__t2 - __t1 < __libc_hp_timing_overhead) \
__libc_hp_timing_overhead = __t2 - __t1; \
} \
while (--__cnt > 0); \
} while (0)
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
#define HP_TIMING_ACCUM(Sum, Diff) \
do { \
hp_timing_t __diff = (Diff) - __libc_hp_timing_overhead; \
__asm__ __volatile__("srl %L0, 0, %%g1\n\t" \
"sllx %H0, 32, %%g7\n\t" \
"or %%g1, %%g7, %%g1\n\t" \
"1: ldx [%1], %%g5\n\t" \
"add %%g5, %%g1, %%g7\n\t" \
"casx [%1], %%g5, %%g7\n\t" \
"cmp %%g5, %%g7\n\t" \
"bne,pn %%xcc, 1b\n\t" \
" nop" \
: /* no outputs */ \
: "r" (__diff), "r" (&(Sum)) \
: "memory", "g1", "g5", "g7"); \
} while(0)
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
#define HP_TIMING_PRINT(Buf, Len, Val) \
do { \
char __buf[20]; \
char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \
int __len = (Len); \
char *__dest = (Buf); \
while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
*__dest++ = *__cp++; \
memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \
} while (0)
#endif /* hp-timing.h */

View File

@ -1,2 +1,6 @@
# The Sparc `long double' is a distinct type we support. # The Sparc `long double' is a distinct type we support.
long-double-fcts = yes long-double-fcts = yes
ifeq ($(subdir),csu)
sysdep_routines += hp-timing
endif

View File

@ -0,0 +1,24 @@
/* Support for high precision, low overhead timing functions. sparc64 version.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@redhat.com>, 2001.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <hp-timing.h>
/* We have to define the variable for the overhead. */
hp_timing_t __libc_hp_timing_overhead;

View File

@ -0,0 +1,84 @@
/* High precision, low overhead timing functions. sparc64 version.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by David S. Miller <davem@redhat.com>, 2001.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _HP_TIMING_H
#define _HP_TIMING_H 1
#include <string.h>
#include <sys/param.h>
#include <stdio-common/_itoa.h>
#define HP_TIMING_AVAIL (1)
#define HP_TIMING_INLINE (1)
typedef unsigned long int hp_timing_t;
extern hp_timing_t __libc_hp_timing_overhead;
#define HP_TIMING_ZERO(Var) (Var) = (0)
#define HP_TIMING_NOW(Var) __asm__ __volatile__ ("rd %%tick, %0" : "=r" (Var))
#define HP_TIMING_DIFF_INIT() \
do { \
int __cnt = 5; \
__libc_hp_timing_overhead = ~0ull; \
do \
{ \
hp_timing_t __t1, __t2; \
HP_TIMING_NOW (__t1); \
HP_TIMING_NOW (__t2); \
if (__t2 - __t1 < __libc_hp_timing_overhead) \
__libc_hp_timing_overhead = __t2 - __t1; \
} \
while (--__cnt > 0); \
} while (0)
#define HP_TIMING_DIFF(Diff, Start, End) (Diff) = ((End) - (Start))
#define HP_TIMING_ACCUM(Sum, Diff) \
do { \
hp_timing_t __diff = (Diff) - __libc_hp_timing_overhead; \
hp_timing_t tmp1, tmp2; \
__asm__ __volatile__("1: ldx [%3], %0\n\t" \
"add %0, %2, %1\n\t" \
"casx [%3], %0, %1\n\t" \
"cmp %0, %1\n\t" \
"bne,pn %%xcc, 1b\n\t" \
" nop" \
: "=&r" (tmp1), "=&r" (tmp2) \
: "r" (__diff), "r" (&(Sum)) \
: "memory", "g1", "g5", "g7"); \
} while(0)
#define HP_TIMING_ACCUM_NT(Sum, Diff) (Sum) += (Diff)
#define HP_TIMING_PRINT(Buf, Len, Val) \
do { \
char __buf[20]; \
char *__cp = _itoa (Val, __buf + sizeof (__buf), 10, 0); \
int __len = (Len); \
char *__dest = (Buf); \
while (__len-- > 0 && __cp < __buf + sizeof (__buf)) \
*__dest++ = *__cp++; \
memcpy (__dest, " clock cycles", MIN (__len, sizeof (" clock cycles"))); \
} while (0)
#endif /* hp-timing.h */

View File

@ -0,0 +1,46 @@
/* Query filename corresponding to an open FD. Linux version.
Copyright (C) 2001 Free Software Foundation, Inc.
This file is part of the GNU C Library.
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., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <stdio-common/_itoa.h>
static inline const char *
fd_to_filename (int fd)
{
char *ret = malloc (30);
if (ret != NULL)
{
struct stat64 st;
*_fitoa_word (fd, __stpcpy (ret, "/proc/self/fd/"), 10, 0) = '\0';
/* We must make sure the file exists. */
if (__lxstat64 (_STAT_VER, ret, &st) < 0)
{
/* /proc is not mounted or something else happened. Don't
return the file name. */
free (ret);
ret = NULL;
}
}
return ret;
}