Untitled
unknown
plain_text
6 months ago
2.7 kB
5
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