Untitled
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