std::vector<config *> find_scripts(const config &cfg, std::string extension) { std::vector<config *> python_scripts; const config::child_list& dirs = cfg.get_children("dir"); config::child_list::const_iterator i; for(i = dirs.begin(); i != dirs.end(); ++i) { const config::child_list& files = (**i).get_children("file"); config::child_list::const_iterator j; for(j = files.begin(); j != files.end(); ++j) { //std::string filename = (**j)["name"].str(); std::string filename = (**j)["name"]; if (filename.length() > extension.length()) { if (filename.substr(filename.length() - extension.length()) == extension) { python_scripts.push_back(*j); } } } // Recursively look for files in sub directories. std::vector<config *> childs = find_scripts(**i, extension); python_scripts.insert(python_scripts.end(), childs.begin(), childs.end()); } return python_scripts; }
/* * When success, will copy the full path of the selected script * into the buffer pointed by script_name, and return 0. * Return -1 on failure. */ static int list_scripts(char *script_name) { char *buf, *names[SCRIPT_MAX_NO], *paths[SCRIPT_MAX_NO]; int i, num, choice, ret = -1; /* Preset the script name to SCRIPT_NAMELEN */ buf = malloc(SCRIPT_MAX_NO * (SCRIPT_NAMELEN + SCRIPT_FULLPATH_LEN)); if (!buf) return ret; for (i = 0; i < SCRIPT_MAX_NO; i++) { names[i] = buf + i * (SCRIPT_NAMELEN + SCRIPT_FULLPATH_LEN); paths[i] = names[i] + SCRIPT_NAMELEN; } num = find_scripts(names, paths); if (num > 0) { choice = ui__popup_menu(num, names); if (choice < num && choice >= 0) { strcpy(script_name, paths[choice]); ret = 0; } } free(buf); return ret; }
static void tccgui_init() { script_key_mq = (struct msg_queue *) msg_queue_create("script_key", 10); find_scripts(); run_startup_script(); menu_add("Scripts", tccgui_menu, MIN(script_cnt, COUNT(tccgui_menu))); }