GList* sub_config_pattern_get_filelist(FcitxSubConfigPattern* pattern) { size_t size, i; GList* result = NULL; char** xdgpath = FcitxXDGGetPath(&size, "XDG_CONFIG_HOME", ".config" , PACKAGE , DATADIR, PACKAGE); for (i = 0; i < size; i ++) { char* dirpath = realpath(xdgpath[i], NULL); if (!dirpath) continue; GList* list = get_files_by_pattern(dirpath, pattern, 0), *l; for (l = g_list_first(list); l != NULL; l = l->next) { if (strncmp(dirpath, (gchar*) l->data, strlen(dirpath)) == 0) { gchar* filename = (gchar*) l->data; gchar* name = filename + strlen(dirpath); while (name[0] == '/') name ++; result = g_list_append(result, g_strdup(name)); } } g_list_foreach(list, sub_file_list_free, NULL); g_list_free(list); free(dirpath); } FcitxXDGFreePath(xdgpath); return result; }
FCITX_EXPORT_API FILE *FcitxXDGGetFileUserWithPrefix(const char* prefix, const char *fileName, const char *mode, char **retFile) { size_t len; char *prefixpath; asprintf(&prefixpath, "%s/%s", PACKAGE, prefix); char ** path = FcitxXDGGetPath(&len, "XDG_CONFIG_HOME", ".config", prefixpath , NULL, NULL); free(prefixpath); FILE* fp = FcitxXDGGetFile(fileName, path, mode, len, retFile); FcitxXDGFreePath(path); return fp; }
FCITX_EXPORT_API FILE *FcitxXDGGetLibFile(const char *filename, const char *mode, char **retFile) { size_t len; char ** path; char* libdir = fcitx_utils_get_fcitx_path("libdir"); path = FcitxXDGGetPath(&len, "XDG_CONFIG_HOME", ".config", PACKAGE "/lib" , libdir, PACKAGE); free(libdir); FILE* fp = FcitxXDGGetFile(filename, path, mode, len, retFile); FcitxXDGFreePath(path); return fp; }
FCITX_EXPORT_API FILE *FcitxXDGGetFileWithPrefix(const char* prefix, const char *fileName, const char *mode, char **retFile) { size_t len; char *prefixpath; asprintf(&prefixpath, "%s/%s", PACKAGE, prefix); char* datadir = fcitx_utils_get_fcitx_path("datadir"); char ** path = FcitxXDGGetPath(&len, "XDG_CONFIG_HOME", ".config", prefixpath , datadir, prefixpath); free(datadir); free(prefixpath); FILE* fp = FcitxXDGGetFile(fileName, path, mode, len, retFile); FcitxXDGFreePath(path); return fp; }
FCITX_EXPORT_API FcitxStringHashSet* FcitxXDGGetFiles( char* path, char* prefix, char* suffix ) { char **xdgPath; size_t len; char *pathBuf; size_t i = 0; DIR *dir; struct dirent *drt; struct stat fileStat; FcitxStringHashSet* sset = NULL; char *prefixpath; asprintf(&prefixpath, "%s/%s", PACKAGE, path); char* datadir = fcitx_utils_get_fcitx_path("datadir"); xdgPath = FcitxXDGGetPath(&len, "XDG_CONFIG_HOME", ".config" , prefixpath , datadir , prefixpath); free(datadir); free(prefixpath); for (i = 0; i < len; i++) { asprintf(&pathBuf, "%s", xdgPath[i]); dir = opendir(pathBuf); free(pathBuf); if (dir == NULL) continue; size_t suffixlen = 0; size_t prefixlen = 0; if (suffix) suffixlen = strlen(suffix); if (prefix) prefixlen = strlen(prefix); /* collect all *.conf files */ while ((drt = readdir(dir)) != NULL) { size_t nameLen = strlen(drt->d_name); if (nameLen <= suffixlen + prefixlen) continue; if (suffix && strcmp(drt->d_name + nameLen - suffixlen, suffix) != 0) continue; if (prefix && strncmp(drt->d_name, prefix, prefixlen) != 0) continue; asprintf(&pathBuf, "%s/%s", xdgPath[i], drt->d_name); int statresult = stat(pathBuf, &fileStat); free(pathBuf); if (statresult == -1) continue; if (fileStat.st_mode & S_IFREG) { FcitxStringHashSet *string; HASH_FIND_STR(sset, drt->d_name, string); if (!string) { char *bStr = strdup(drt->d_name); string = malloc(sizeof(FcitxStringHashSet)); memset(string, 0, sizeof(FcitxStringHashSet)); string->name = bStr; HASH_ADD_KEYPTR(hh, sset, string->name, strlen(string->name), string); } } } closedir(dir); } FcitxXDGFreePath(xdgPath); return sset; }