am 1b7a7e81: adb: Use bionic\'s strtok_r() for Windows

* commit '1b7a7e81195ff06a7482f81cb92b094bb3481cb1':
  adb: Use bionic's strtok_r() for Windows
This commit is contained in:
Scott Anderson 2012-06-05 18:17:37 -07:00 committed by Android Git Automerger
commit 845f106a93
3 changed files with 89 additions and 2 deletions

View File

@ -374,7 +374,7 @@ void parse_banner(char *banner, atransport *t)
if (cp) {
char *save;
char *key;
key = strtok_r(cp + 1, prop_seps, &save);
key = adb_strtok_r(cp + 1, prop_seps, &save);
while (key) {
cp = strchr(key, key_val_sep);
if (cp) {
@ -386,7 +386,7 @@ void parse_banner(char *banner, atransport *t)
else if (!strcmp(key, "ro.product.device"))
qual_overwrite(&t->device, cp);
}
key = strtok_r(NULL, prop_seps, &save);
key = adb_strtok_r(NULL, prop_seps, &save);
}
}
}

View File

@ -254,6 +254,8 @@ static __inline__ int adb_is_absolute_host_path( const char* path )
return isalpha(path[0]) && path[1] == ':' && path[2] == '\\';
}
extern char* adb_strtok_r(char *str, const char *delim, char **saveptr);
#else /* !_WIN32 a.k.a. Unix */
#include "fdevent.h"
@ -490,6 +492,13 @@ static __inline__ int adb_is_absolute_host_path( const char* path )
return path[0] == '/';
}
static __inline__ char* adb_strtok_r(char *str, const char *delim, char **saveptr)
{
return strtok_r(str, delim, saveptr);
}
#undef strtok_r
#define strtok_r ___xxx_strtok_r
#endif /* !_WIN32 */
#endif /* _ADB_SYSDEPS_H */

View File

@ -2140,3 +2140,81 @@ adb_sysdeps_init( void )
InitializeCriticalSection( &_win32_lock );
}
/* Windows doesn't have strtok_r. Use the one from bionic. */
/*
* Copyright (c) 1988 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
char *
adb_strtok_r(char *s, const char *delim, char **last)
{
char *spanp;
int c, sc;
char *tok;
if (s == NULL && (s = *last) == NULL)
return (NULL);
/*
* Skip (span) leading delimiters (s += strspn(s, delim), sort of).
*/
cont:
c = *s++;
for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
if (c == sc)
goto cont;
}
if (c == 0) { /* no non-delimiter characters */
*last = NULL;
return (NULL);
}
tok = s - 1;
/*
* Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
* Note that delim must have one NUL; we stop if we see that, too.
*/
for (;;) {
c = *s++;
spanp = (char *)delim;
do {
if ((sc = *spanp++) == c) {
if (c == 0)
s = NULL;
else
s[-1] = 0;
*last = s;
return (tok);
}
} while (sc != 0);
}
/* NOTREACHED */
}