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

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

page 2 of 5



 * of an entry in the wildcard's directory.  The basename's memory
 * belongs to the iterator.  The caller is responsible for prepending
 * the directory name and file separator, if necessary.
 * When done with the iterator, call the close method to clean up.
 */
typedef struct WildcardIterator_* WildcardIterator;

#ifdef _WIN32
struct WildcardIterator_
{
    HANDLE handle;
    char *firstFile; /* Stupid FindFirstFile...FindNextFile */
};

static WildcardIterator
WildcardIterator_for(const char *wildcard)
{
    WIN32_FIND_DATA find_data;
    WildcardIterator it = NEW_(WildcardIterator);
    HANDLE handle = FindFirstFile(wildcard, &find_data);
    if (handle == INVALID_HANDLE_VALUE)
	return NULL;
    it->handle = handle;
    it->firstFile = find_data.cFileName;
    return it;
}

static char *
WildcardIterator_next(WildcardIterator it)
{
    WIN32_FIND_DATA find_data;
    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 /* Unix */
struct WildcardIterator_
{
    DIR *dir;
};

static WildcardIterator
WildcardIterator_for(const char *wildcard)
{
    DIR *dir;
    int wildlen = 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 /* Unix */

static int
equal(const char *s1, const char *s2)
{
    return strcmp(s1, s2) == 0;
}
=2=

1| < PREV = PAGE 2 = NEXT > |3|4|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.0111158 wallclock secs ( 0.01 usr + 0.00 sys = 0.01 CPU)