Readline完成问题

时间:2011-08-31 04:35:38

标签: c readline

我正在努力让命令完成工作,但它似乎无法正常工作.. 请看看我的代码并告诉我如何解决它..

提前致谢...

char store_commands() {
        char *newEnv;
        DIR * dir;
        char *new ;          
        struct dirent * entry;
        char *env = getenv("PATH");

        do { 
                newEnv = strsep(&env, ":");

                if(newEnv != NULL) 
                        if(strlen(newEnv) > 0) {

                                dir = opendir(newEnv);
                                if( dir == NULL ) break;
                                if(flag == 1) {
                                        flag = 0;
                                        while((entry = readdir(dir)) != NULL) {
                                                new = malloc(strlen(entry->d_name) + 1) ;  
                                                new = strcpy(new, entry->d_name);

                                                commands[++count] = new;  // add possible commands into an array
                                                printf("---%i %s\n", count ,commands[count]);
                                        }
                                }
                                closedir(dir); // close directory
                        }
        } while(newEnv);

        return **commands;
}




static char** my_completion( const char * text , int start,  int end){
        char **matches;
        store_commands();

        matches = (char **)NULL;

        if (start == 0)
                matches = rl_completion_matches ((char*)text, &my_generator);


        return matches;

}

char * dupstr (char* s) {
        char *r;

        r = (char*) malloc ((strlen (s) + 1));
        strcpy (r, s);
        return (r);
}


char* my_generator(const char* text, int state) {
        int index, len;
        char *comm;
        if (!state) {
                index = 0;
                len = (int)strlen (text);
        }



        while ( (comm = commands[index])) {
                index++;

                if (strncmp (comm, text, len) == 0)
                        return (dupstr(comm));
        }


        return NULL;
}







int main (int argc,  char * argv[]) {

        char  *command;
        using_history();
        rl_readline_name = basename(argv[0]);
        rl_attempted_completion_function = my_completion;





        while ( (command = readline(" $ "))!= NULL ) {  // scan stdin  

                rl_bind_key('\t',rl_complete);

                if(strlen(command) > 0) 
                        add_history(command);


        }


        return 0;
}


Some test cases
l (tab)
Display all 1281 possibilities? (y or n) // all possibilities come up when I put one letter *** all possibilities wrong actually what I meant was all commands including the ones dont start with l

ls (tab)
ls        lsbom     lsdistcc  lsm       lso       lsvfs  // seems alright here

however if I press enter 

comm[0]: 'ls' and comm[1]: '(null)'  // execution of the command fails!!!  WHY????
Execution of the command is failed
: No such file or directory

如果我使用像这样的静态数组char *test[7] = {"ls","cat","lso", "mk", "mkd", "mkdir",""};一切似乎都很好,包括执行命令..

1 个答案:

答案 0 :(得分:0)

命令[]和计数的定义/声明在哪里?

另外:你的风格不连贯,程序几乎无法读取。 为什么要将malloc()的返回值转移到一个地方而不是另一个地方?

If(x == 0){}和if(!x){}是等价的。做出选择并坚持下去。

丑陋的做... {...} while(...); loop可以替换为for(...; ...; ...){}循环,为您节省两个级别的缩进。