⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 halcmd_completion.c

📁 CNC 的开放码,EMC2 V2.2.8版
💻 C
📖 第 1 页 / 共 2 页
字号:
            return strdup("all");    }    while(next) {        hal_comp_t *comp = SHMPTR(next);        next = comp->next_ptr;        if(comp->type) continue;	if(strncmp(text, comp->name, len) == 0)            return strdup(comp->name);    }    rl_attempted_completion_over = 1;    return NULL;}static char *comp_generator(const char *text, int state) {    static int len;    static int next;    if(!state) {        next = hal_data->comp_list_ptr;        len = strlen(text);        if(strncmp(text, "all", len) == 0)            return strdup("all");    }    while(next) {        hal_comp_t *comp = SHMPTR(next);        next = comp->next_ptr;	if ( strncmp(text, comp->name, len) == 0 )            return strdup(comp->name);    }    rl_attempted_completion_over = 1;    return NULL;}static char *rtcomp_generator(const char *text, int state) {    static int len;    static int next;    if(!state) {        next = hal_data->comp_list_ptr;        len = strlen(text);        if(strncmp(text, "all", len) == 0)            return strdup("all");    }    while(next) {        hal_comp_t *comp = SHMPTR(next);        next = comp->next_ptr;        if(!comp->type) continue;	if ( strncmp(text, comp->name, len) == 0 )            return strdup(comp->name);    }    rl_attempted_completion_over = 1;    return NULL;}static char *pin_generator(const char *text, int state) {    static int len;    static int next;    if(!state) {        next = hal_data->pin_list_ptr;        len = strlen(text);    }    while(next) {        hal_pin_t *pin = SHMPTR(next);        next = pin->next_ptr;        if ( !writer_match( pin->dir, match_writers ) ) continue;        if ( !direction_match( pin->dir, match_direction ) ) continue;        if ( match_type != -1 && match_type != pin->type ) continue; 	if ( strncmp(text, pin->name, len) == 0 )            return strdup(pin->name);    }    rl_attempted_completion_over = 1;    return NULL;}#include <dirent.h>static int startswith(const char *string, const char *stem) {    return strncmp(string, stem, strlen(stem)) == 0;}char *loadusr_table[] = {"-W", "-Wn", "-w", "-iw", NULL};static char *loadusr_generator(const char *text, int state) {    static int len;    static DIR *d;    struct dirent *ent;    static int doing_table;    if(!state) {	if(argno == 1) doing_table = 1;        string_table = loadusr_table;        len = strlen(text);        d = opendir(EMC2_BIN_DIR);    }    if(doing_table) {    	char *result = table_generator(text, state);        if(result) return result;        doing_table = 0;    }    while(d && (ent = readdir(d))) {        char *result;        if(!startswith(ent->d_name, "hal")) continue;        if(startswith(ent->d_name, "halcmd")) continue;        if(strncmp(text, ent->d_name, len) != 0) continue;        result = strdup(ent->d_name);        return result;    }    closedir(d);    return NULL;}static char *loadrt_generator(const char *text, int state) {    static int len;    static DIR *d;    struct dirent *ent;    if(!state) {        len = strlen(text);        d = opendir(EMC2_RTLIB_DIR);    }    while(d && (ent = readdir(d))) {        char *result;        if(!strstr(ent->d_name, MODULE_EXT)) continue;        if(startswith(ent->d_name, "rtapi.")) continue;        if(strncmp(text, ent->d_name, len) != 0) continue;        result = strdup(ent->d_name);        result[strlen(result) - strlen(MODULE_EXT)] = 0;        return result;    }    closedir(d);    return NULL;}static inline int isskip(int ch) {    return isspace(ch) || ch == '=' || ch == '<' || ch == '>';}char *nextword(char *s) {    s = strchr(s, ' ');    if(!s) return NULL;    return s+1;}char **completer(const char *text, int start, int end) {    int i;    char **result = NULL;    if(start == 0)        return completion_matches_table(text, command_table);    for(i=0, argno=0; i<start; i++) {        if(isskip(rl_line_buffer[i])) {            argno++;            while(i<start && isskip(rl_line_buffer[i])) i++;        }    }    match_type = -1;    match_writers = -1;    match_direction = -1;    rtapi_mutex_get(&(hal_data->mutex));    if(startswith(rl_line_buffer, "delsig ") && argno == 1) {        result = rl_completion_matches(text, signal_generator);    } else if(startswith(rl_line_buffer, "linkps ") && argno == 1) {        result = rl_completion_matches(text, pin_generator);    } else if(startswith(rl_line_buffer, "linkps ") && argno == 2) {        check_match_type_pin(rl_line_buffer + 7);        result = rl_completion_matches(text, signal_generator);    } else if(startswith(rl_line_buffer, "net ") && argno == 1) {        result = rl_completion_matches(text, signal_generator);    } else if(startswith(rl_line_buffer, "net ") && argno == 2) {        check_match_type_signal(nextword(rl_line_buffer));        result = rl_completion_matches(text, pin_generator);    } else if(startswith(rl_line_buffer, "net ") && argno > 2) {        check_match_type_signal(nextword(rl_line_buffer));        if(match_type == -1) {            check_match_type_pin(nextword(nextword(rl_line_buffer)));            if(match_direction == HAL_IN) match_direction = -1;        }        result = rl_completion_matches(text, pin_generator);    } else if(startswith(rl_line_buffer, "linksp ") && argno == 1) {        result = rl_completion_matches(text, signal_generator);    } else if(startswith(rl_line_buffer, "linksp ") && argno == 2) {        check_match_type_signal(rl_line_buffer + 7);        result = rl_completion_matches(text, pin_generator);    } else if(startswith(rl_line_buffer, "linkpp ") && argno == 1) {        result = rl_completion_matches(text, pin_generator);    } else if(startswith(rl_line_buffer, "linkpp ") && argno == 2) {        check_match_type_pin(rl_line_buffer + 7);        result = rl_completion_matches(text, pin_generator);    } else if(startswith(rl_line_buffer, "unlinkp ") && argno == 1) {        result = rl_completion_matches(text, pin_generator);    } else if(startswith(rl_line_buffer, "setp ") && argno == 1) {        result = rl_completion_matches(text, setp_generator);    } else if(startswith(rl_line_buffer, "sets ") && argno == 1) {        result = rl_completion_matches(text, signal_generator);    } else if(startswith(rl_line_buffer, "ptype ") && argno == 1) {        result = rl_completion_matches(text, getp_generator);    } else if(startswith(rl_line_buffer, "getp ") && argno == 1) {        result = rl_completion_matches(text, getp_generator);    } else if(startswith(rl_line_buffer, "stype ") && argno == 1) {        result = rl_completion_matches(text, signal_generator);    } else if(startswith(rl_line_buffer, "gets ") && argno == 1) {        result = rl_completion_matches(text, signal_generator);    } else if(startswith(rl_line_buffer, "show ") && argno == 1) {        result = completion_matches_table(text, show_table);    } else if(startswith(rl_line_buffer, "list pin") && argno == 2) {        result = rl_completion_matches(text, pin_generator);    } else if(startswith(rl_line_buffer, "list sig") && argno == 2) {        result = rl_completion_matches(text, signal_generator);    } else if(startswith(rl_line_buffer, "list param") && argno == 2) {        result = rl_completion_matches(text, parameter_generator);    } else if(startswith(rl_line_buffer, "list funct") && argno == 2) {        result = rl_completion_matches(text, funct_generator);    } else if(startswith(rl_line_buffer, "list thread") && argno == 2) {        result = rl_completion_matches(text, thread_generator);    } else if(startswith(rl_line_buffer, "show pin") && argno == 2) {        result = rl_completion_matches(text, pin_generator);    } else if(startswith(rl_line_buffer, "show sig") && argno == 2) {        result = rl_completion_matches(text, signal_generator);    } else if(startswith(rl_line_buffer, "show param") && argno == 2) {        result = rl_completion_matches(text, parameter_generator);    } else if(startswith(rl_line_buffer, "show funct") && argno == 2) {        result = rl_completion_matches(text, funct_generator);    } else if(startswith(rl_line_buffer, "show thread") && argno == 2) {        result = rl_completion_matches(text, thread_generator);    } else if(startswith(rl_line_buffer, "save ") && argno == 1) {        result = completion_matches_table(text, save_table);    } else if(startswith(rl_line_buffer, "list ") && argno == 1) {        result = completion_matches_table(text, list_table);    } else if(startswith(rl_line_buffer, "status ") && argno == 1) {        result = completion_matches_table(text, status_table);    } else if(startswith(rl_line_buffer, "newsig ") && argno == 2) {        result = completion_matches_table(text, pintype_table);    } else if(startswith(rl_line_buffer, "lock ") && argno == 1) {        result = completion_matches_table(text, lock_table);    } else if(startswith(rl_line_buffer, "unlock ") && argno == 1) {        result = completion_matches_table(text, unlock_table);    } else if(startswith(rl_line_buffer, "addf ") && argno == 1) {        result = rl_completion_matches(text, funct_generator);    } else if(startswith(rl_line_buffer, "addf ") && argno == 2) {        result = rl_completion_matches(text, thread_generator);    } else if(startswith(rl_line_buffer, "delf ") && argno == 1) {        result = rl_completion_matches(text, funct_generator);    } else if(startswith(rl_line_buffer, "delf ") && argno == 2) {        result = rl_completion_matches(text, thread_generator);    } else if(startswith(rl_line_buffer, "help ") && argno == 1) {        result = completion_matches_table(text, command_table);    } else if(startswith(rl_line_buffer, "unloadusr ") && argno == 1) {        result = rl_completion_matches(text, usrcomp_generator);    } else if(startswith(rl_line_buffer, "waitusr ") && argno == 1) {        result = rl_completion_matches(text, usrcomp_generator);    } else if(startswith(rl_line_buffer, "unloadrt ") && argno == 1) {        result = rl_completion_matches(text, rtcomp_generator);    } else if(startswith(rl_line_buffer, "unload ") && argno == 1) {        result = rl_completion_matches(text, comp_generator);    } else if(startswith(rl_line_buffer, "source ") && argno == 1) {        rtapi_mutex_give(&(hal_data->mutex));        // leaves rl_attempted_completion_over = 0 to complete from filesystem        return 0;    } else if(startswith(rl_line_buffer, "loadusr ") && argno < 3) {        rtapi_mutex_give(&(hal_data->mutex));        // leaves rl_attempted_completion_over = 0 to complete from filesystem        return rl_completion_matches(text, loadusr_generator);    } else if(startswith(rl_line_buffer, "loadrt ") && argno == 1) {        result = rl_completion_matches(text, loadrt_generator);    }    rtapi_mutex_give(&(hal_data->mutex));    rl_attempted_completion_over = 1;    return result;}void halcmd_init_readline() {    rl_readline_name = "halcmd";    rl_attempted_completion_function = completer;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -