Untitled

 avatar
unknown
plain_text
13 days ago
2.7 kB
4
Indexable
void expandWildCards(char * prefix, char * arg) {

	char* temp = arg;
	char* save = (char*) malloc(strlen(arg) + 10);
	char* dir = save;

	if (temp[0] == '/') *(save++) = *(temp++);

	while (*temp != '/' && *temp) *(save++) = *(temp++);
	*save = '\0';

	if (strchr(dir, '*') || strchr(dir, '?')) {
		if (!prefix && arg[0] == '/') {
			prefix = strdup("/");
			dir++;
		}  

		char * reg = (char *) malloc(2*strlen(arg) + 10);
		char * a = dir;
		char * r = reg;

		*(r++) = '^';
		while(*a){
			if(*a == '*'){
				*(r++) = '.';
				*(r++) = '*';
			}
			else if(*a == '?'){
				*(r++) = '.';
			}
			else if(*a == '.'){
				*(r++) = '\\';
				*(r++) = '.';
			}
			else{
				*(r++) = *a;
			}
			a++;
		}
		*(r++) = '$'; 
		*r = '\0';

		regex_t re;

		int expbuf = regcomp(&re, reg, REG_EXTENDED|REG_NOSUB);
		struct dirent * ent;
		regmatch_t match;

		char * toOpen = strdup((prefix) ? prefix : ".");
		DIR * dir = opendir(toOpen);
		if (dir == NULL) {
			perror("opendir");
			return;
		}

		while ((ent = readdir(dir)) != NULL) {
			if (!regexec(&re, ent->d_name, 1, &match, 0)) {
				if (*temp) {
					if (ent->d_type == DT_DIR) {
						char * nPrefix = (char *) malloc (150);
						if (!strcmp(toOpen, ".")) nPrefix = strdup(ent->d_name);
						else if (!strcmp(toOpen, "/")) sprintf(nPrefix, "%s%s", toOpen, ent->d_name);
						else sprintf(nPrefix, "%s/%s", toOpen, ent->d_name);
						expandWildCards(nPrefix, (*temp == '/')?++temp:temp);
					}
				} else {
					char * argument = (char *)malloc(1000);
					argument[0] = '\0';
					if (prefix) sprintf(argument, "%s/%s", prefix, ent->d_name);

					if (ent->d_name[0] == '.') {
						if (arg[0] == '.') {
							entries.push_back((argument[0] != '\0') ? (new std::string(strdup(argument))) : (new std::string(strdup(ent->d_name))));
						}
					} else {
						entries.push_back((argument[0] != '\0') ? (new std::string(strdup(argument))) : (new std::string(strdup(ent->d_name))));
					}
				}
			}
			// printf("Printing Entries %d!!\n", entries.size());
			// for (int i = 0; i < entries.size(); i++) {
			// 	printf("%s\n", entries[i]->c_str());
			// }
			// printf("Printing Done %d!!\n", entries.size());
		}
		closedir(dir);
	} else {
		char * preToSend = (char *) malloc (100);
		if (prefix) sprintf(preToSend, "%s/%s", prefix, dir);
		else preToSend = strdup(dir);

		if (*temp) expandWildCards(preToSend, ++temp);
	}

	// printf("Printing Entries!!\n");
	// for (int i = 0; i < entries.size(); i++) {
	// 	printf("%s\n", entries[i]->c_str());
	// }
	// printf("Printing Done!!\n");
}
Editor is loading...
Leave a Comment