PROXY  WHOIS  RQUOTE  TEXTS  SOFT  FOREX  BBOARD
 Music  Philosophy  Code  Literature  Russian

= ROOT|Technical|Code_Examples|Java|launcher|wildcard.c =

page 4 of 5




static FileList
FileList_split(const char *path, char sep)
{
    const char *p, *q;
    int len = 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;
	    }
	}
    }
}

static int
isJarFileName(const char *filename)
{
    int len = strlen(filename);
    return (len >= 4) &&
	(filename[len - 4] == '.') &&
	(equal(filename + len - 3, "jar") ||
	 equal(filename + len - 3, "JAR")) &&
	/* Paranoia: Maybe filename is "DIR:foo.jar" */
	(strchr(filename, PATH_SEPARATOR) == NULL);
}

static char *
wildcardConcat(const char *wildcard, const char *basename)
{
    int wildlen = strlen(wildcard);
    int baselen = strlen(basename);
    char *filename = (char *) JLI_MemAlloc(wildlen + baselen);
    /* Replace the trailing '*' with basename */
    memcpy(filename, wildcard, wildlen-1);
    memcpy(filename+wildlen-1, basename, baselen+1);
    return filename;
}

static FileList
wildcardFileList(const char *wildcard)
{
    const char *basename;
    FileList fl = FileList_new(16);
    WildcardIterator it = WildcardIterator_for(wildcard);
    if (it == NULL)
	return NULL;
    while ((basename = WildcardIterator_next(it)) != NULL)
	if (isJarFileName(basename))
	    FileList_add(fl, wildcardConcat(wildcard, basename));
    WildcardIterator_close(it);
    return fl;
}

static int
isWildcard(const char *filename)
{
    int len = strlen(filename);
    return (len > 0) &&
	(filename[len - 1] == '*') &&
	(len == 1 || IS_FILE_SEPARATOR(filename[len - 2])) &&
	(! exists(filename));
}

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;
		/* fl expropriates expanded's elements. */
		expanded->size = 0;
	    }
	    FileList_free(expanded);
	}
    }
}

const char *
JLI_WildcardExpandClasspath(const char *classpath)
{
    char *expanded;
=4=

1|2|3| < PREV = PAGE 4 = NEXT > |5

UP TO ROOT | UP TO DIR | TO FIRST PAGE

Google
 


E-mail Facebook Google Digg del.icio.us BlinkList Fark Furl Ma.gnolia Netscape NewsVine Reddit Slashdot Spurl StumbleUpon Technorati YahooMyWeb LiveJournal Blogmarks TwitThis Live News2.ru BobrDobr.ru Memori.ru MoeMesto.ru

0.021138 wallclock secs ( 0.01 usr + 0.01 sys = 0.02 CPU)