static int _ls(int argc, char * argv[], Prefs * prefs) { SList * files; SList * dirs; compare_func cmp = _ls_compare(prefs); int ret = 0; int i; int isdir; char * str; if(argc == 0 && !(*prefs & LS_PREFS_d)) return _ls_directory_do(prefs, "."); if(_ls_args(&files, &dirs) != 0) return 2; if(argc == 0) ret |= slist_insert_sorted(files, strdup("."), cmp); for(i = 0; i < argc; i++) { if((isdir = _is_directory(prefs, argv[i])) == 2) ret |= 1; else if((str = strdup(argv[i])) == NULL) ret |= _ls_error("malloc", 1); else if(*prefs & LS_PREFS_d) ret |= slist_insert_sorted(files, str, cmp); else ret |= slist_insert_sorted(isdir ? dirs : files, str, cmp); } ret |= _ls_do(prefs, argc, NULL, files, dirs); return ret == 0 ? 0 : 1; }
static int _ls_directory_do(Prefs * prefs, char const * directory) { SList * files; SList * dirs; compare_func cmp = _ls_compare(prefs); DIR * dir; struct dirent * de; char * file = NULL; char * p; int pos = 1; size_t len; if((dir = opendir(directory)) == NULL) return _ls_error(directory, 1); _ls_args(&files, &dirs); for(; (de = readdir(dir)) != NULL; pos++) { if(*(de->d_name) == '.' && !(*prefs & LS_PREFS_a)) continue; slist_insert_sorted(files, strdup(de->d_name), cmp); if(pos <= 2) continue; len = strlen(directory) + 1 + strlen(de->d_name) + 1; if((p = realloc(file, len)) == NULL) { _ls_error("malloc", 0); continue; } file = p; snprintf(file, len, "%s/%s", directory, de->d_name); if((*prefs & LS_PREFS_R) && _is_directory(prefs, file) == 1) slist_insert_sorted(dirs, strdup(file), cmp); } free(file); if(closedir(dir) != 0) _ls_error(directory, 0); _ls_do(prefs, 2, directory, files, dirs); return 0; }
char * _get_real_name(gpointer alias) { return _is_directory(alias) ? g_strconcat(ALIASES_get_alias(alias)->str, "/", NULL) : g_strdup(ALIASES_get_alias(alias)->str); }