2003-12-31  Ulrich Drepper  <drepper@redhat.com>

	* elf/dl-dst.h (DL_DST_REQUIRED): Avoid the complex operations if
	CNT == 0.
This commit is contained in:
Ulrich Drepper 2003-12-31 11:17:09 +00:00
parent 7c1be3ece5
commit d4b04a331c
2 changed files with 31 additions and 19 deletions

View File

@ -1,3 +1,8 @@
2003-12-31 Ulrich Drepper <drepper@redhat.com>
* elf/dl-dst.h (DL_DST_REQUIRED): Avoid the complex operations if
CNT == 0.
2003-12-30 Jakub Jelinek <jakub@redhat.com>
* posix/regexec.c (get_subexp): Only set bkref_str after the first

View File

@ -1,5 +1,5 @@
/* Handling of dynamic sring tokens.
Copyright (C) 1999, 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 1999, 2001, 2002, 2003 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
@ -37,28 +37,35 @@ extern size_t _dl_dst_count_internal (const char *name, int is_path);
/* Guess from the number of DSTs the length of the result string. */
#define DL_DST_REQUIRED(l, name, len, cnt) \
({ \
size_t origin_len; \
size_t __len = (len); \
size_t __cnt = (cnt); \
\
/* Now we make a guess how many extra characters on top of the length \
of S we need to represent the result. We know that we have CNT \
replacements. Each at most can use \
MAX (strlen (ORIGIN), strlen (_dl_platform)) \
minus 7 (which is the length of "$ORIGIN"). \
\
First get the origin string if it is not available yet. This can \
only happen for the map of the executable. */ \
if ((l)->l_origin == NULL) \
if (__cnt > 0) \
{ \
assert ((l)->l_name[0] == '\0'); \
(l)->l_origin = _dl_get_origin (); \
origin_len = ((l)->l_origin && (l)->l_origin != (char *) -1 \
? strlen ((l)->l_origin) : 0); \
} \
else \
origin_len = (l)->l_origin == (char *) -1 ? 0 : strlen ((l)->l_origin); \
size_t origin_len; \
/* Now we make a guess how many extra characters on top of the \
length of S we need to represent the result. We know that \
we have CNT replacements. Each at most can use \
MAX (strlen (ORIGIN), strlen (_dl_platform)) \
minus 7 (which is the length of "$ORIGIN"). \
\
__len + cnt * (MAX (origin_len, GL(dl_platformlen)) - 7); })
First get the origin string if it is not available yet. \
This can only happen for the map of the executable. */ \
if ((l)->l_origin == NULL) \
{ \
assert ((l)->l_name[0] == '\0'); \
(l)->l_origin = _dl_get_origin (); \
origin_len = ((l)->l_origin && (l)->l_origin != (char *) -1 \
? strlen ((l)->l_origin) : 0); \
} \
else \
origin_len = (l)->l_origin == (char *) -1 \
? 0 : strlen ((l)->l_origin); \
\
__len += __cnt * (MAX (origin_len, GL(dl_platformlen)) - 7); \
} \
\
__len; })
/* Find origin of the executable. */
extern const char *_dl_get_origin (void);