src/share/bin/wildcard.c::JLI_WildcardExpandClasspath
const char *
JLI_WildcardExpandClasspath ( const char * classpath)
{
char * expanded;
FileList fl;
if ( JLI_StrChr ( classpath, '*' ) == NULL )
return classpath;
fl = FileList_split ( classpath, PATH_SEPARATOR) ;
FileList_expandWildcards ( fl) ;
expanded = FileList_join ( fl, PATH_SEPARATOR) ;
FileList_free ( fl) ;
if ( getenv ( JLDEBUG_ENV_ENTRY) != 0 )
printf ( "Expanded wildcards:\n"
" before: \"%s\"\n"
" after : \"%s\"\n" ,
classpath, expanded) ;
return expanded;
}
src/share/bin/wildcard.c::FileList_
struct FileList_
{
char * * files;
int size;
int capacity;
} ;
typedef struct FileList_ * FileList;
src/share/bin/wildcard.c::FileList_split
static FileList
FileList_split ( const char * path, char sep)
{
const char * p, * q;
int len = ( int ) JLI_StrLen ( path) ;
int count;
FileList fl;
for ( count = 1 , p = path; p < path + len; p++ )
count + = ( * p == sep) ;
fl = FileList_new ( count) ;
for ( p = path; ; ) {
for ( q = p; q <= path + len; q++ ) {
if ( * q == sep || * q == '\0' ) {
FileList_addSubstring ( fl, p, q - p) ;
if ( * q == '\0' )
return fl;
p = q + 1 ;
}
}
}
}
src/share/bin/wildcard.c::FileList_new
static FileList
FileList_new ( int capacity)
{
FileList fl = NEW_ ( FileList) ;
fl-> capacity = capacity;
fl-> files = ( char * * ) JLI_MemAlloc ( capacity * sizeof ( fl-> files[ 0 ] ) ) ;
fl-> size = 0 ;
return fl;
}
src/share/bin/wildcard.c::FileList_addSubstring
static void
FileList_addSubstring ( FileList fl, const char * beg, int len)
{
char * filename = ( char * ) JLI_MemAlloc ( len+ 1 ) ;
memcpy ( filename, beg, len) ;
filename[ len] = '\0' ;
FileList_ensureCapacity ( fl, fl-> size+ 1 ) ;
fl-> files[ fl-> size++ ] = filename;
}
src/share/bin/wildcard.c::FileList_ensureCapacity
static void
FileList_ensureCapacity ( FileList fl, int capacity)
{
if ( fl-> capacity < capacity) {
while ( fl-> capacity < capacity)
fl-> capacity * = 2 ;
fl-> files = JLI_MemRealloc ( fl-> files,
fl-> capacity * sizeof ( fl-> files[ 0 ] ) ) ;
}
}
src/share/bin/wildcard.c::FileList_expandWildcards
static void
FileList_expandWildcards ( FileList fl)
{
int i, j;
for ( i = 0 ; i < fl-> size; i++ ) {
if ( isWildcard ( fl-> files[ i] ) ) {
FileList expanded = wildcardFileList ( fl-> files[ i] ) ;
if ( expanded != NULL && expanded-> size > 0 ) {
JLI_MemFree ( fl-> files[ i] ) ;
FileList_ensureCapacity ( fl, fl-> size + expanded-> size) ;
for ( j = fl-> size - 1 ; j >= i+ 1 ; j-- )
fl-> files[ j+ expanded-> size- 1 ] = fl-> files[ j] ;
for ( j = 0 ; j < expanded-> size; j++ )
fl-> files[ i+ j] = expanded-> files[ j] ;
i + = expanded-> size - 1 ;
fl-> size + = expanded-> size - 1 ;
expanded-> size = 0 ;
}
FileList_free ( expanded) ;
}
}
}
src/share/bin/wildcard.c::isWildcard
static int
isWildcard ( const char * filename)
{
int len = ( int ) JLI_StrLen ( filename) ;
return ( len > 0 ) &&
( filename[ len - 1 ] == '*' ) &&
( len == 1 || IS_FILE_SEPARATOR ( filename[ len - 2 ] ) ) &&
( ! exists ( filename) ) ;
}
src/windows/bin/java_md.h
#define IS_FILE_SEPARATOR(c) ((c) == '\\' || (c) == '/')
src/solaris/bin/java_md.h
#define IS_FILE_SEPARATOR(c) ((c) == '/')
src/share/bin/wildcard.c::exists
static int
exists ( const char * filename)
{
#ifdef _WIN32
return _access ( filename, 0 ) == 0 ;
#else
return access ( filename, F_OK) == 0 ;
#endif
}
src/share/bin/wildcard.c::wildcardFileList
static FileList
wildcardFileList ( const char * wildcard)
{
const char * basename;
FileList fl = FileList_new ( 16 ) ;
WildcardIterator it = WildcardIterator_for ( wildcard) ;
if ( it == NULL )
{
FileList_free ( fl) ;
return NULL ;
}
while ( ( basename = WildcardIterator_next ( it) ) != NULL )
if ( isJarFileName ( basename) )
FileList_add ( fl, wildcardConcat ( wildcard, basename) ) ;
WildcardIterator_close ( it) ;
return fl;
}
src/share/bin/wildcard.c::FileList_free
static void
FileList_free ( FileList fl)
{
if ( fl) {
if ( fl-> files) {
int i;
for ( i = 0 ; i < fl-> size; i++ )
JLI_MemFree ( fl-> files[ i] ) ;
JLI_MemFree ( fl-> files) ;
}
JLI_MemFree ( fl) ;
}
}
src/share/bin/wildcard.c::WildcardIterator
#ifdef _WIN32
struct WildcardIterator_
{
HANDLE handle;
char * firstFile;
} ;
static WIN32_FIND_DATA find_data;
static WildcardIterator
WildcardIterator_for ( const char * wildcard)
{
WildcardIterator it = NEW_ ( WildcardIterator) ;
HANDLE handle = FindFirstFile ( wildcard, & find_data) ;
if ( handle == INVALID_HANDLE_VALUE) {
JLI_MemFree ( it) ;
return NULL ;
}
it-> handle = handle;
it-> firstFile = find_data. cFileName;
return it;
}
static char *
WildcardIterator_next ( WildcardIterator it)
{
if ( it-> firstFile != NULL ) {
char * firstFile = it-> firstFile;
it-> firstFile = NULL ;
return firstFile;
}
return FindNextFile ( it-> handle, & find_data)
? find_data. cFileName : NULL ;
}
static void
WildcardIterator_close ( WildcardIterator it)
{
if ( it) {
FindClose ( it-> handle) ;
JLI_MemFree ( it-> firstFile) ;
JLI_MemFree ( it) ;
}
}
#else
struct WildcardIterator_
{
DIR * dir;
} ;
static WildcardIterator
WildcardIterator_for ( const char * wildcard)
{
DIR * dir;
int wildlen = JLI_StrLen ( wildcard) ;
if ( wildlen < 2 ) {
dir = opendir ( "." ) ;
} else {
char * dirname = JLI_StringDup ( wildcard) ;
dirname[ wildlen - 1 ] = '\0' ;
dir = opendir ( dirname) ;
JLI_MemFree ( dirname) ;
}
if ( dir == NULL )
return NULL ;
else {
WildcardIterator it = NEW_ ( WildcardIterator) ;
it-> dir = dir;
return it;
}
}
static char *
WildcardIterator_next ( WildcardIterator it)
{
struct dirent* dirp = readdir ( it-> dir) ;
return dirp ? dirp-> d_name : NULL ;
}
static void
WildcardIterator_close ( WildcardIterator it)
{
if ( it) {
closedir ( it-> dir) ;
JLI_MemFree ( it) ;
}
}
#endif
src/share/bin/wildcard.c::FileList_add
static void
FileList_add ( FileList fl, char * file)
{
FileList_ensureCapacity ( fl, fl-> size+ 1 ) ;
fl-> files[ fl-> size++ ] = file;
}
src/share/bin/wildcard.c::isJarFileName
static int
isJarFileName ( const char * filename)
{
int len = ( int ) JLI_StrLen ( filename) ;
return ( len >= 4 ) &&
( filename[ len - 4 ] == '.' ) &&
( equal ( filename + len - 3 , "jar" ) ||
equal ( filename + len - 3 , "JAR" ) ) &&
( JLI_StrChr ( filename, PATH_SEPARATOR) == NULL ) ;
}
src/share/bin/wildcard.c::wildcardConcat
static char *
wildcardConcat ( const char * wildcard, const char * basename)
{
int wildlen = ( int ) JLI_StrLen ( wildcard) ;
int baselen = ( int ) JLI_StrLen ( basename) ;
char * filename = ( char * ) JLI_MemAlloc ( wildlen + baselen) ;
memcpy ( filename, wildcard, wildlen- 1 ) ;
memcpy ( filename+ wildlen- 1 , basename, baselen+ 1 ) ;
return filename;
}
src/share/bin/wildcard.c::FileList_join
static char *
FileList_join ( FileList fl, char sep)
{
int i;
int size;
char * path;
char * p;
for ( i = 0 , size = 1 ; i < fl-> size; i++ )
size + = ( int ) JLI_StrLen ( fl-> files[ i] ) + 1 ;
path = JLI_MemAlloc ( size) ;
for ( i = 0 , p = path; i < fl-> size; i++ ) {
int len = ( int ) JLI_StrLen ( fl-> files[ i] ) ;
if ( i > 0 ) * p++ = sep;
memcpy ( p, fl-> files[ i] , len) ;
p + = len;
}
* p = '\0' ;
return path;
}