fish/fish_shell/fish_globbing.c

96 lines
1.8 KiB
C
Raw Normal View History

// Created by Arthur Amalvy
2017-05-15 12:32:41 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
2017-05-16 05:32:19 +00:00
#include <string.h>
2017-05-15 12:32:41 +00:00
#include "fish_core.h"
#include "fish_globbing.h"
2017-05-16 05:32:19 +00:00
WordList * fishExpand(WordList *wordList) {
2017-05-15 12:32:41 +00:00
2017-05-28 15:25:04 +00:00
if(wordList->size > 1){
2017-05-15 12:32:41 +00:00
2017-05-27 15:36:55 +00:00
int i;
WordList* newWordList = createWordList();// creating the list to return
2017-05-15 12:32:41 +00:00
2017-05-27 15:36:55 +00:00
if(newWordList == NULL){//crash when the allocation is unsuccessful
2017-05-16 05:32:19 +00:00
crash();
2017-05-27 15:36:55 +00:00
}
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
addEndWordList(newWordList, wordList->first->word);//copy the command into the returning word list
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
WordListElement* tempElement = wordList->first->next; //temporary nav element
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
for(i=1; i<wordList->size; i++){
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
//TODO : optimize the stringContains() function to test for a list of characters
//test if we have to expand a string or not, for optimization purposes
if(stringContains(tempElement->word, '*') || stringContains(tempElement->word, '?')){
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
concatWordList(newWordList, expandWord(tempElement->word));
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
}
//If we dont have to expand, add the current word unchanged to the new list
else{
addEndWordList(newWordList, tempElement->word);
}
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
tempElement = tempElement->next;
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
}
freeWordList(wordList);
2017-05-16 05:32:19 +00:00
return newWordList;
2017-05-27 15:36:55 +00:00
2017-05-16 05:32:19 +00:00
}
2017-05-28 15:25:04 +00:00
else return wordList;
2017-05-15 12:32:41 +00:00
2017-05-27 15:36:55 +00:00
}
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
WordList* expandWord(char* word){
2017-05-16 05:32:19 +00:00
2017-05-28 15:25:04 +00:00
printf("\n%s\n", word);
WordList* testList = getFiles((char*) "../");
printWordList(testList);
return testList;
2017-05-16 05:32:19 +00:00
2017-05-27 15:36:55 +00:00
}
2017-05-16 05:32:19 +00:00
2017-05-15 12:32:41 +00:00
WordList* getFiles(char* path){
2017-05-15 12:32:41 +00:00
DIR* directory;
dirent* dir;
2017-05-16 05:32:19 +00:00
WordList* files = createWordList();
2017-05-15 12:32:41 +00:00
if((directory = opendir(path)) != NULL){
while((dir = readdir(directory)) != NULL){
2017-05-28 15:25:04 +00:00
if(strcmp(dir->d_name, ".") && strcmp(dir->d_name, "..")){//sorry strcmp but I dont like you :(
2017-05-15 12:32:41 +00:00
printf("%s\n", dir->d_name);//test
addEndWordList(files, dir->d_name);
2017-05-15 17:10:46 +00:00
2017-05-16 05:32:19 +00:00
}
2017-05-15 12:32:41 +00:00
}
2017-05-28 15:25:04 +00:00
closedir(directory); //YY U LEAK MEMORY ? NOT ON MY WATCH
2017-05-15 12:32:41 +00:00
}
return files;
}