diff --git a/winsup/mingw/ChangeLog b/winsup/mingw/ChangeLog index 7ffc87636..19507ad8c 100644 --- a/winsup/mingw/ChangeLog +++ b/winsup/mingw/ChangeLog @@ -22,6 +22,8 @@ (_lock_file, _unlock_file): Declare. * include/limits.h (PATH_MAX): Guard with #ifndef __STRICT_ANSI__. * include/sys/param.h (MAXPATHLEN): Make sure PATH_MAX is defined. + * include/_mingw.h (threadlocalinfostruct, threadmbinfostruct, + *pthreadlocinfo, *pthreadmbcinfo, _locale_tstruct, *_locale_t): Declare. 2012-08-01 Earnie Boyd diff --git a/winsup/mingw/include/_mingw.h b/winsup/mingw/include/_mingw.h index a59b2e1df..cbfd54ced 100644 --- a/winsup/mingw/include/_mingw.h +++ b/winsup/mingw/include/_mingw.h @@ -290,4 +290,14 @@ allow GCC to optimize away some EH unwind code, at least in DW2 case. */ # endif #endif +struct threadlocalinfostruct; +struct threadmbinfostruct; +typedef struct threadlocalinfostruct *pthreadlocinfo; +typedef struct threadmbcinfostruct *pthreadmbcinfo; + +typedef struct localeinfo_struct { + pthreadlocinfo locinfo; + pthreadmbcinfo mbcinfo; +} _locale_tstruct, *_locale_t; + #endif /* __MINGW_H */ diff --git a/winsup/mingw/mingwex/tsearch.c b/winsup/mingw/mingwex/tsearch.c index a0aa0eb36..55f192214 100755 --- a/winsup/mingw/mingwex/tsearch.c +++ b/winsup/mingw/mingwex/tsearch.c @@ -23,29 +23,33 @@ tsearch(const void * __restrict__ vkey, /* key to be located */ void ** __restrict__ vrootp, /* address of tree root */ int (*compar) (const void *, const void *)) { - node_t *q; + node_t *q, **n; node_t **rootp = (node_t **)vrootp; if (rootp == NULL) return NULL; - while (*rootp != NULL) { /* Knuth's T1: */ + n = rootp; + while (*n != NULL) { /* Knuth's T1: */ int r; - if ((r = (*compar)(vkey, (*rootp)->key)) == 0) /* T2: */ - return *rootp; /* we found it! */ + if ((r = (*compar)(vkey, ((*n)->key))) == 0) /* T2: */ + return *n; /* we found it! */ - rootp = (r < 0) ? + n = (r < 0) ? &(*rootp)->llink : /* T3: follow left branch */ &(*rootp)->rlink; /* T4: follow right branch */ + if (*n == NULL) + break; + rootp = n; } q = malloc(sizeof(node_t)); /* T5: key not found */ - if (q != 0) { /* make new node */ - *rootp = q; /* link new node to old */ - /* LINTED const castaway ok */ - q->key = (void *)vkey; /* initialize new node */ - q->llink = q->rlink = NULL; - } + if (!q) + return q; + *n = q; /* make new node */ + /* LINTED const castaway ok */ + q->key = (void *)vkey; /* initialize new node */ + q->llink = q->rlink = NULL; return q; }