norm , acl and thats it (color done)

This commit is contained in:
Jack Halford 2016-11-25 18:34:58 +01:00
parent d7c7816207
commit d931c172d1
15 changed files with 217 additions and 143 deletions

View file

@ -15,6 +15,7 @@ ft_error_access src/lib_error.c /^void ft_error_access(char *s)$/
ft_error_dir src/lib_error.c /^void ft_error_dir(char *s)$/ ft_error_dir src/lib_error.c /^void ft_error_dir(char *s)$/
ft_error_option src/lib_error.c /^void ft_error_option(char c)$/ ft_error_option src/lib_error.c /^void ft_error_option(char c)$/
ft_getopts src/lib_parse.c /^static int ft_getopts(char *str)$/ ft_getopts src/lib_parse.c /^static int ft_getopts(char *str)$/
ft_ls_color src/ft_ls_color.c /^void ft_ls_color(mode_t m)$/
ft_ls_dirs src/ft_ls.c /^void ft_ls_dirs(t_list *dir, int opts)$/ ft_ls_dirs src/ft_ls.c /^void ft_ls_dirs(t_list *dir, int opts)$/
ft_ls_files src/ft_ls.c /^void ft_ls_files(t_list **ent, t_list **dir, t_lsd/ ft_ls_files src/ft_ls.c /^void ft_ls_files(t_list **ent, t_list **dir, t_lsd/
ft_ls_long src/ft_ls_long.c /^int ft_ls_long(t_list *ent, t_lsdata *topdir, int/ ft_ls_long src/ft_ls_long.c /^int ft_ls_long(t_list *ent, t_lsdata *topdir, int/
@ -30,6 +31,7 @@ ft_ls_long_xattr src/lib_ls_long2.c /^int ft_ls_long_xattr(mode_t m, char *path
ft_ls_parse src/lib_parse.c /^int ft_ls_parse(int ac, char **av, t_list **dir,/ ft_ls_parse src/lib_parse.c /^int ft_ls_parse(int ac, char **av, t_list **dir,/
ft_ls_parse_files src/lib_parse.c /^static void ft_ls_parse_files(int ac, char **av, i/ ft_ls_parse_files src/lib_parse.c /^static void ft_ls_parse_files(int ac, char **av, i/
ft_ls_parse_options src/lib_parse.c /^static int ft_ls_parse_options(int ac, char **av, / ft_ls_parse_options src/lib_parse.c /^static int ft_ls_parse_options(int ac, char **av, /
ft_ls_postname src/ft_ls_postname.c /^void ft_ls_postname(mode_t m, int opts)$/
ft_ls_short src/ft_ls_short.c /^void ft_ls_short(t_list *ent, t_lsdata *topdir, in/ ft_ls_short src/ft_ls_short.c /^void ft_ls_short(t_list *ent, t_lsdata *topdir, in/
ft_lsdata_cmp0 src/lib_lsdata.c /^int ft_lsdata_cmp0(t_lsdata *data, char *dataref)/ ft_lsdata_cmp0 src/lib_lsdata.c /^int ft_lsdata_cmp0(t_lsdata *data, char *dataref)/
ft_lsdata_cmpA src/lib_lsdata.c /^int ft_lsdata_cmpA(t_lsdata *data, char *dataref)/ ft_lsdata_cmpA src/lib_lsdata.c /^int ft_lsdata_cmpA(t_lsdata *data, char *dataref)/

View file

@ -8,7 +8,7 @@ if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == ''
let s:wipebuf = bufnr('%') let s:wipebuf = bufnr('%')
endif endif
set shortmess=aoO set shortmess=aoO
badd +98 src/lib_ls_long2.c badd +1 src/lib_ls_long2.c
badd +27 src/ft_ls_long.c badd +27 src/ft_ls_long.c
badd +25 includes/ft_ls.h badd +25 includes/ft_ls.h
badd +60 ~/.tmux.conf badd +60 ~/.tmux.conf
@ -48,9 +48,7 @@ badd +19 src/lib_ent.c
badd +11 .Makefile.swp badd +11 .Makefile.swp
badd +18 ~/dotfiles/vim.symlink/plugins.vim badd +18 ~/dotfiles/vim.symlink/plugins.vim
badd +22 libft/src/str/ft_strsub.c badd +22 libft/src/str/ft_strsub.c
argglobal args src/lib_ls_long2.c
silent! argdel *
argadd src/lib_ls_long2.c
edit src/main.c edit src/main.c
set splitbelow splitright set splitbelow splitright
set nosplitbelow set nosplitbelow
@ -67,7 +65,7 @@ setlocal fml=1
setlocal fdn=20 setlocal fdn=20
setlocal fen setlocal fen
silent! normal! zE silent! normal! zE
let s:l = 1 - ((0 * winheight(0) + 20) / 41) let s:l = 1 - ((0 * winheight(0) + 40) / 81)
if s:l < 1 | let s:l = 1 | endif if s:l < 1 | let s:l = 1 | endif
exe s:l exe s:l
normal! zt normal! zt

View file

@ -6,48 +6,57 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 15:10:03 by jhalford #+# #+# */ /* Created: 2016/11/07 15:10:03 by jhalford #+# #+# */
/* Updated: 2016/11/23 18:40:59 by jhalford ### ########.fr */ /* Updated: 2016/11/25 18:26:44 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#ifndef FT_LS_H #ifndef FT_LS_H
# define FT_LS_H # define FT_LS_H
# define LS_LEGAL_OPTS "larRt" # define LS_LEGAL_OPTS "AFGRUSTacdfgloprtu1"
# define LS_MSG_ILLEGAL_OPT "ft_ls: illegal option -- %c\n" # define LS_MSG_ILLEGAL_OPT "ft_ls: illegal option -- %c\n"
# define LS_MSG_USAGE "usage: ls [-%s] [file ...]\n" # define LS_MSG_USAGE "usage: ls [-%s] [file ...]\n"
# define LS_MSG_FILE_ERR "ls: %s: No such file or directory\n" # define LS_MSG_FILE_ERR "ls: %s: No such file or directory\n"
# define LS_MSG_ACC_ERR "ls: %s: Permission denied\n" # define LS_MSG_ACC_ERR "ls: %s: Permission denied\n"
# define OPTS_LA 0x0000001 # ifndef S_IXUGO
# define OPTS_LC 0x0000002 # define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH)
# define OPTS_LD 0x0000004 # endif
# define OPTS_LF 0x0000008
# define OPTS_LL 0x0000010
# define OPTS_LP 0x0000020
# define OPTS_LR 0x0000040
# define OPTS_LT 0x0000080
# define OPTS_LU 0x0000100
# define OPTS_UA 0x0000200
# define OPTS_UR 0x0000400
# define OPTS_UU 0x0000800
# define OPTS_US 0x0001000
# define OPTS_ONE 0x0002000
# define OPTS_ERR_A 0x0010000
# define OPTS_HEAD 0x0100000
# define TIME_MASK OPTS_LC | OPTS_LU | OPTS_UU # define OPTS_LA 0x00000001
# define OPTS_LC 0x00000002
# define OPTS_LD 0x00000004
# define OPTS_LF 0x00000008
# define OPTS_LG 0x00000010
# define OPTS_LL 0x00000020
# define OPTS_LO 0x00000040
# define OPTS_LP 0x00000080
# define OPTS_LR 0x00000100
# define OPTS_LT 0x00000200
# define OPTS_LU 0x00000400
# define OPTS_UA 0x00000800
# define OPTS_UF 0x00001000
# define OPTS_UG 0x00002000
# define OPTS_UR 0x00004000
# define OPTS_UU 0x00008000
# define OPTS_US 0x00010000
# define OPTS_UT 0x00020000
# define OPTS_ONE 0x00040000
# define OPTS_ERR_A 0x00100000
# define OPTS_HEAD 0x01000000
# define TIME_MASK (OPTS_LC | OPTS_LU | OPTS_UU)
# include "libft.h" # include "libft.h"
# include <errno.h> # include <errno.h>
# include <stdio.h> # include <stdio.h>
# include <dirent.h> # include <dirent.h>
# include <unistd.h>
# include <sys/stat.h> # include <sys/stat.h>
# include <sys/types.h> # include <sys/types.h>
# include <time.h>
# include <pwd.h> # include <pwd.h>
# include <grp.h> # include <grp.h>
# include <sys/xattr.h> # include <sys/acl.h>
struct s_lsdata struct s_lsdata
{ {
@ -66,8 +75,18 @@ struct s_pads
int minor; int minor;
}; };
struct s_opts
{
char id;
int on;
int off;
};
typedef struct s_lsdata t_lsdata; typedef struct s_lsdata t_lsdata;
typedef struct s_pads t_pads; typedef struct s_pads t_pads;
typedef struct s_opts t_opts;
extern t_opts g_opts[];
int ft_ls_parse(int ac, char **av, t_list **dir, t_list **ent); int ft_ls_parse(int ac, char **av, t_list **dir, t_list **ent);
@ -79,11 +98,12 @@ int ft_cmp_atime(t_lsdata *dat1, t_lsdata *dat2);
int ft_cmp_ctime(t_lsdata *dat1, t_lsdata *dat2); int ft_cmp_ctime(t_lsdata *dat1, t_lsdata *dat2);
int ft_cmp_btime(t_lsdata *dat1, t_lsdata *dat2); int ft_cmp_btime(t_lsdata *dat1, t_lsdata *dat2);
void ft_ls_postname(mode_t m, int opts);
void ft_lsdata_filename(t_lsdata *data, t_lsdata *topdir, int opts); void ft_lsdata_filename(t_lsdata *data, t_lsdata *topdir, int opts);
int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata *dat2); int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata *dat2);
int ft_lsdata_cmp_size(t_lsdata *dat1, t_lsdata *dat2); int ft_lsdata_cmp_size(t_lsdata *dat1, t_lsdata *dat2);
int ft_lsdata_cmp0(t_lsdata *dat1, char *dataref); int ft_lsdata_cmp0(t_lsdata *dat1, char *dataref);
int ft_lsdata_cmpA(t_lsdata *data, char *dataref); int ft_lsdata_cmpa(t_lsdata *data, char *dataref);
void ft_ent_filter(t_list **ent, int opts); void ft_ent_filter(t_list **ent, int opts);
void ft_ent_sort(t_list **ent, int opts); void ft_ent_sort(t_list **ent, int opts);
@ -91,8 +111,8 @@ void ft_ent_print(
t_list *ent, int *opts, t_lsdata *topdir, t_list *nextdir); t_list *ent, int *opts, t_lsdata *topdir, t_list *nextdir);
int ft_ent_has_dir(t_list *ent); int ft_ent_has_dir(t_list *ent);
t_list *ft_ent_get_dirs(t_list **ent); t_list *ft_ent_get_dirs(t_list **ent);
void ft_ent_free(void *ptr, size_t size);
t_list *ft_ent_get_dirs(t_list **ent);
t_list *ft_dir_get_ents(t_lsdata *topdir, int *opts); t_list *ft_dir_get_ents(t_lsdata *topdir, int *opts);
void ft_ls_short(t_list *ent, t_lsdata *topdir, int opts); void ft_ls_short(t_list *ent, t_lsdata *topdir, int opts);
@ -105,7 +125,7 @@ int ft_ls_long_pads(t_list *ent, t_pads *pads);
void ft_ls_long_type(mode_t m); void ft_ls_long_type(mode_t m);
void ft_ls_long_rights(mode_t m); void ft_ls_long_rights(mode_t m);
int ft_ls_long_xattr(mode_t m, char *path); int ft_ls_long_xattr(mode_t m, char *path);
int ft_ls_long_middle(struct stat *stat, t_pads *pads); int ft_ls_long_middle(struct stat *stat, t_pads *pads, int opts);
void ft_ls_long_date(struct stat *stat, int opts); void ft_ls_long_date(struct stat *stat, int opts);
int ft_ls_long_lnk(t_lsdata *data); int ft_ls_long_lnk(t_lsdata *data);
@ -113,5 +133,5 @@ void ft_error_option(char c);
void ft_error_dir(char *s); void ft_error_dir(char *s);
void ft_error_access(char *s); void ft_error_access(char *s);
void ft_ent_free(void *ptr, size_t size); void ft_ls_color(mode_t m);
#endif #endif

@ -1 +1 @@
Subproject commit f7ed005fb174d79af6508d2bdd6eed7dbe99e483 Subproject commit 1f3da9014798ae1a2bc72a90c17bb9a03e327206

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 14:57:21 by jhalford #+# #+# */ /* Created: 2016/11/07 14:57:21 by jhalford #+# #+# */
/* Updated: 2016/11/23 18:53:01 by jhalford ### ########.fr */ /* Updated: 2016/11/25 12:15:59 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -30,7 +30,7 @@ void ft_ls_dirs(t_list *dir, int opts)
ent = ft_dir_get_ents(dirdata, &opts); ent = ft_dir_get_ents(dirdata, &opts);
ft_ls_files(&ent, &dir, dirdata, &opts); ft_ls_files(&ent, &dir, dirdata, &opts);
ft_lstdelone(&tmp, &ft_ent_free); ft_lstdelone(&tmp, &ft_ent_free);
if (opts & OPTS_UR) if (opts & OPTS_UR && !(opts & OPTS_LD))
{ {
dir_r = ft_ent_get_dirs(&ent); dir_r = ft_ent_get_dirs(&ent);
ft_lst_merge(&dir_r, dir); ft_lst_merge(&dir_r, dir);

44
ls/src/ft_ls_color.c Normal file
View file

@ -0,0 +1,44 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_ls_color.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/25 13:39:11 by jhalford #+# #+# */
/* Updated: 2016/11/25 16:00:01 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_ls.h"
void ft_ls_color(mode_t m)
{
char fg[20];
char bg[20];
ft_strcpy(fg, FG_DEFAULT);
ft_strcpy(bg, BG_DEFAULT);
ft_strcpy(fg, S_ISDIR(m) ? FG_BLUE : fg);
ft_strcpy(fg, S_ISLNK(m) ? FG_MAGENTA : fg);
ft_strcpy(fg, S_ISSOCK(m) ? FG_GREEN : fg);
ft_strcpy(fg, S_ISFIFO(m) ? FG_YELLOW : fg);
ft_strcpy(fg, S_ISREG(m) && (S_IXUGO & m) ? FG_RED : fg);
ft_strcpy(fg, S_ISBLK(m) ? FG_BLUE : fg);
ft_strcpy(bg, S_ISBLK(m) ? BG_CYAN : bg);
ft_strcpy(fg, S_ISCHR(m) ? FG_BLUE : fg);
ft_strcpy(bg, S_ISCHR(m) ? BG_YELLOW : bg);
ft_strcpy(fg, S_ISREG(m) && (S_IXUGO & m) &&
(S_ISGID & m) ? FG_BLACK : fg);
ft_strcpy(bg, S_ISREG(m) && (S_IXUGO & m) &&
(S_ISGID & m) ? BG_CYAN : bg);
ft_strcpy(fg, S_ISREG(m) && (S_IXUGO & m) &&
(S_ISUID & m) ? FG_BLACK : fg);
ft_strcpy(bg, S_ISREG(m) && (S_IXUGO & m) &&
(S_ISUID & m) ? BG_RED : bg);
ft_strcpy(fg, S_ISDIR(m) && (S_IWOTH & m) && (S_ISVTX & m) ? FG_BLACK : fg);
ft_strcpy(bg, S_ISDIR(m) && (S_IWOTH & m) && (S_ISVTX & m) ? BG_GREEN : bg);
ft_strcpy(fg, S_ISDIR(m) && (S_IWOTH & m) && !(S_ISVTX & m) ? FG_BLACK : fg);
ft_strcpy(bg, S_ISDIR(m) && (S_IWOTH & m) && !(S_ISVTX & m) ? BG_YELLOW : bg);
ft_color_set(fg, bg);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 14:58:05 by jhalford #+# #+# */ /* Created: 2016/11/07 14:58:05 by jhalford #+# #+# */
/* Updated: 2016/11/23 17:39:50 by jhalford ### ########.fr */ /* Updated: 2016/11/25 14:18:29 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -43,7 +43,7 @@ int ft_ls_long_print(t_list *ent, t_lsdata *topdir, t_pads pads, int opts)
ft_ls_long_rights(stat.st_mode); ft_ls_long_rights(stat.st_mode);
if (ft_ls_long_xattr(stat.st_mode, data->path)) if (ft_ls_long_xattr(stat.st_mode, data->path))
return (1); return (1);
if (ft_ls_long_middle(&stat, &pads)) if (ft_ls_long_middle(&stat, &pads, opts))
return (1); return (1);
ft_ls_long_date(&stat, opts); ft_ls_long_date(&stat, opts);
ft_printf(" "); ft_printf(" ");

33
ls/src/ft_ls_postname.c Normal file
View file

@ -0,0 +1,33 @@
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_ls_postname.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: jhalford <jack@crans.org> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/25 14:19:17 by jhalford #+# #+# */
/* Updated: 2016/11/25 15:59:56 by jhalford ### ########.fr */
/* */
/* ************************************************************************** */
#include "ft_ls.h"
void ft_ls_postname(mode_t m, int opts)
{
char c;
c = 0;
if (opts & OPTS_UF)
{
c = S_ISDIR(m) ? '/' : c;
c = S_ISREG(m) && (S_IXUGO & m) ? '*' : c;
c = S_ISLNK(m) ? '@' : c;
c = S_ISSOCK(m) ? '=' : c;
c = S_ISWHT(m) ? '%' : c;
c = S_ISFIFO(m) ? '|' : c;
}
else if (opts & OPTS_LP && S_ISDIR(m))
c = '/';
if (c)
ft_putchar(c);
}

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 15:00:05 by jhalford #+# #+# */ /* Created: 2016/11/07 15:00:05 by jhalford #+# #+# */
/* Updated: 2016/11/23 18:54:38 by jhalford ### ########.fr */ /* Updated: 2016/11/25 18:27:02 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -14,12 +14,12 @@
void ft_ent_filter(t_list **ent, int opts) void ft_ent_filter(t_list **ent, int opts)
{ {
if (!(opts & OPTS_LA)) if (!(opts & (OPTS_LA | OPTS_LF)))
{ {
if (!(opts & OPTS_UA)) if (!(opts & OPTS_UA))
ft_lst_delif(ent, ".", &ft_lsdata_cmp0, &ft_ent_free); ft_lst_delif(ent, ".", &ft_lsdata_cmp0, &ft_ent_free);
else else
ft_lst_delif(ent, ".", &ft_lsdata_cmpA, &ft_ent_free); ft_lst_delif(ent, ".", &ft_lsdata_cmpa, &ft_ent_free);
} }
} }
@ -60,7 +60,7 @@ void ft_ent_print(t_list *ent, int *opts, t_lsdata *topdir, t_list *nextdir)
} }
if (ent) if (ent)
{ {
if (*opts & OPTS_LL) if (*opts & (OPTS_LL | OPTS_LG | OPTS_LO))
ft_ls_long(ent, topdir, *opts); ft_ls_long(ent, topdir, *opts);
else else
ft_ls_short(ent, topdir, *opts); ft_ls_short(ent, topdir, *opts);
@ -72,7 +72,7 @@ void ft_ent_print(t_list *ent, int *opts, t_lsdata *topdir, t_list *nextdir)
} }
if ((!topdir && nextdir && ent) if ((!topdir && nextdir && ent)
|| (topdir && nextdir) || (topdir && nextdir)
|| (((*opts & OPTS_UR) || (((*opts & OPTS_UR) && !(*opts & OPTS_LD)
&& ent && ft_ent_has_dir(ent)))) && ent && ft_ent_has_dir(ent))))
ft_putchar('\n'); ft_putchar('\n');
} }

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 14:57:43 by jhalford #+# #+# */ /* Created: 2016/11/07 14:57:43 by jhalford #+# #+# */
/* Updated: 2016/11/23 14:04:08 by jhalford ### ########.fr */ /* Updated: 2016/11/25 13:08:52 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -20,21 +20,20 @@ void ft_error_option(char c)
void ft_error_access(char *s) void ft_error_access(char *s)
{ {
/* ft_dprintf(2, LS_MSG_ACC_ERR, s); */
/* ft_printf("strerror:%s\n", strerror(errno)); */
ft_dprintf(2, "ls: "); ft_dprintf(2, "ls: ");
perror(s); perror(ft_path_notdir(s));
/* ft_dprintf(2, LS_MSG_ACC_ERR, ft_path_notdir(s)); */
} }
void ft_error_dir(char *s) void ft_error_dir(char *s)
{ {
/* ft_dprintf(2, LS_MSG_FILE_ERR, s); */
/* ft_printf("strerror:%s\n", strerror(errno)); */
ft_dprintf(2, "ls: "); ft_dprintf(2, "ls: ");
if (*s) if (*s)
/* ft_dprintf(2, LS_MSG_FILE_ERR, s); */
perror(s); perror(s);
else else
{ {
/* ft_dprintf(2, LS_MSG_FILE_ERR, "fts_open"); */
perror("fts_open"); perror("fts_open");
exit(1); exit(1);
} }

View file

@ -6,13 +6,13 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 14:59:51 by jhalford #+# #+# */ /* Created: 2016/11/07 14:59:51 by jhalford #+# #+# */
/* Updated: 2016/11/23 18:50:52 by jhalford ### ########.fr */ /* Updated: 2016/11/25 18:31:12 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "ft_ls.h" #include "ft_ls.h"
int ft_ls_long_middle(struct stat *stat, t_pads *pads) int ft_ls_long_middle(struct stat *stat, t_pads *pads, int opts)
{ {
struct passwd *pwd; struct passwd *pwd;
struct group *grp; struct group *grp;
@ -22,7 +22,11 @@ int ft_ls_long_middle(struct stat *stat, t_pads *pads)
if ((grp = getgrgid(stat->st_gid)) == NULL) if ((grp = getgrgid(stat->st_gid)) == NULL)
return (1); return (1);
ft_printf(" %*hu ", pads->nlink, stat->st_nlink); ft_printf(" %*hu ", pads->nlink, stat->st_nlink);
if (!(opts & OPTS_LG))
ft_printf("%-*s", pads->name, pwd->pw_name); ft_printf("%-*s", pads->name, pwd->pw_name);
if (!(opts & (OPTS_LO | OPTS_LG)))
ft_putstr(" ");
if (!(opts & OPTS_LO))
ft_printf("%-*s", pads->gr_name, grp->gr_name); ft_printf("%-*s", pads->gr_name, grp->gr_name);
if (S_ISBLK(stat->st_mode) || S_ISCHR(stat->st_mode)) if (S_ISBLK(stat->st_mode) || S_ISCHR(stat->st_mode))
ft_printf(" % *i,% *i", ft_printf(" % *i,% *i",
@ -35,11 +39,8 @@ int ft_ls_long_middle(struct stat *stat, t_pads *pads)
void ft_ls_long_date(struct stat *stat, int opts) void ft_ls_long_date(struct stat *stat, int opts)
{ {
char *date;
char *day;
char *month;
char *time;
time_t st_time; time_t st_time;
t_mytime *time;
if (opts & OPTS_LC) if (opts & OPTS_LC)
st_time = stat->st_ctime; st_time = stat->st_ctime;
@ -49,20 +50,15 @@ void ft_ls_long_date(struct stat *stat, int opts)
st_time = stat->st_birthtime; st_time = stat->st_birthtime;
else else
st_time = stat->st_mtime; st_time = stat->st_mtime;
date = ctime(&st_time); time = ft_mytime_get(st_time);
/* ft_printf("\nctime is:%s\n", date); */ if (opts & OPTS_UT)
month = ft_strsub(date, 4, 3); ft_printf(" %s %s %s:%s:%s %s", time->month, time->day, time->hour,
day = ft_strsub(date, 8, 2); time->min, time->sec, time->year);
if (ft_time_isrecent(st_time)) else if (ft_time_isrecent(st_time))
time = ft_strsub(date, 11, 5); ft_printf(" %s %s %s:%s", time->month, time->day, time->hour, time->min);
else if (ft_isdigit(date[20]))
time = ft_strsub(date, 20, 4);
else else
time = ft_strsub(date, 23, 6); ft_printf(" %s %s %s", time->month, time->day, time->year);
ft_printf(" %s %s %5s", month, day, time); ft_mytime_free(&time);
free(month);
free(day);
free(time);
} }
void ft_ls_long_type(mode_t m) void ft_ls_long_type(mode_t m)

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 15:01:01 by jhalford #+# #+# */ /* Created: 2016/11/07 15:01:01 by jhalford #+# #+# */
/* Updated: 2016/11/23 16:19:43 by jhalford ### ########.fr */ /* Updated: 2016/11/25 17:22:53 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -53,16 +53,17 @@ int ft_ls_long_lnk(t_lsdata *data)
int ft_ls_long_xattr(mode_t m, char *path) int ft_ls_long_xattr(mode_t m, char *path)
{ {
int n;
char x; char x;
acl_t acl;
acl_entry_t acl_entry;
acl = acl_get_file(path, ACL_TYPE_DEFAULT | ACL_TYPE_ACCESS);
if ((acl_get_entry(acl, ACL_FIRST_ENTRY, &acl_entry)) == 0)
x = '+';
else if (!S_ISBLK(m) && !S_ISCHR(m))
x = ft_xattr_count(path) > 0 ? '@' : ' ';
else
x = ' '; x = ' ';
n = 0;
if (!S_ISBLK(m) && !S_ISCHR(m))
if ((n = ft_xattr_count(path)) == -1)
;
if (n > 0)
x = '@';
ft_putchar(x); ft_putchar(x);
return (0); return (0);
} }

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 14:59:09 by jhalford #+# #+# */ /* Created: 2016/11/07 14:59:09 by jhalford #+# #+# */
/* Updated: 2016/11/23 18:49:44 by jhalford ### ########.fr */ /* Updated: 2016/11/25 18:26:53 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -17,14 +17,15 @@ void ft_lsdata_filename(t_lsdata *data, t_lsdata *topdir, int opts)
struct dirent *dirent; struct dirent *dirent;
dirent = data->dirent; dirent = data->dirent;
if (opts & OPTS_UG)
ft_ls_color(data->stat.st_mode);
if (data->path) if (data->path)
ft_printf("%s", topdir ? ft_path_notdir(data->path) : data->path); ft_printf("%s", topdir ? ft_path_notdir(data->path) : data->path);
else if (dirent && *dirent->d_name) else if (dirent && *dirent->d_name)
ft_printf("%s", dirent->d_name); ft_printf("%s", dirent->d_name);
else if (opts & OPTS_UG)
ft_printf("noname!"); ft_color_reset();
if (opts & OPTS_LP && S_ISDIR(data->stat.st_mode)) ft_ls_postname(data->stat.st_mode, opts);
ft_putchar('/');
} }
int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata *dat2) int ft_lsdata_cmp_name(t_lsdata *dat1, t_lsdata *dat2)
@ -43,7 +44,7 @@ int ft_lsdata_cmp0(t_lsdata *data, char *dataref)
return (*filename != *dataref); return (*filename != *dataref);
} }
int ft_lsdata_cmpA(t_lsdata *data, char *dataref) int ft_lsdata_cmpa(t_lsdata *data, char *dataref)
{ {
char *filename; char *filename;

View file

@ -6,12 +6,37 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 15:02:46 by jhalford #+# #+# */ /* Created: 2016/11/07 15:02:46 by jhalford #+# #+# */
/* Updated: 2016/11/23 18:46:50 by jhalford ### ########.fr */ /* Updated: 2016/11/25 18:31:15 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
#include "ft_ls.h" #include "ft_ls.h"
t_opts g_opts[] =
{
{'A', OPTS_UA, 0},
{'F', OPTS_UF, OPTS_LP},
{'G', OPTS_UG, 0},
{'R', OPTS_UR, 0},
{'S', OPTS_US, 0},
{'T', OPTS_UT, 0},
{'U', OPTS_UU, TIME_MASK},
{'a', OPTS_LA, 0},
{'c', OPTS_LC, 0},
{'d', OPTS_LD, 0},
{'f', OPTS_LF, 0},
{'g', OPTS_LG, 0},
{'l', OPTS_LL, 0},
{'o', OPTS_LO, 0},
{'p', OPTS_LP, OPTS_UF},
{'r', OPTS_LR, 0},
{'t', OPTS_LT, 0},
{'u', OPTS_LU, TIME_MASK},
{'1', OPTS_ONE, (OPTS_LL | OPTS_LG | OPTS_LO)},
{0, 0, 0},
};
static void ft_ls_parse_files(int ac, char **av, int opts, t_list **dir, t_list **ent) static void ft_ls_parse_files(int ac, char **av, int opts, t_list **dir, t_list **ent)
{ {
t_lsdata data; t_lsdata data;
@ -22,13 +47,11 @@ static void ft_ls_parse_files(int ac, char **av, int opts, t_list **dir, t_list
while (++i < ac) while (++i < ac)
{ {
if (stat(av[i], &data.stat) < 0) if (stat(av[i], &data.stat) < 0)
{
if (lstat(av[i], &data.stat) < 0) if (lstat(av[i], &data.stat) < 0)
{ {
ft_error_dir(av[i]); ft_error_dir(av[i]);
continue ; continue ;
} }
}
if (opts & OPTS_LL || !S_ISDIR(data.stat.st_mode)) if (opts & OPTS_LL || !S_ISDIR(data.stat.st_mode))
if (lstat(av[i], &data.stat) < 0) if (lstat(av[i], &data.stat) < 0)
{ {
@ -46,65 +69,22 @@ static void ft_ls_parse_files(int ac, char **av, int opts, t_list **dir, t_list
static int ft_getopts(char *str) static int ft_getopts(char *str)
{ {
int i; int i;
int j;
int opts; int opts;
i = 0; i = 0;
opts = 0; opts = 0;
while (str[i]) while (str[i])
{ {
if (str[i] == 'l') j = -1;
while (g_opts[++j].id)
if (g_opts[j].id == str[i])
{ {
opts |= OPTS_LL; opts &= ~g_opts[j].off;
opts &= ~OPTS_ONE; opts |= g_opts[j].on;
break ;
} }
else if (str[i] == '1') if (!ft_strchr(LS_LEGAL_OPTS, str[i]))
{
opts |= OPTS_ONE;
opts &= ~OPTS_LL;
}
else if (str[i] == 'a')
opts |= OPTS_LA;
else if (str[i] == 'c')
{
opts &= ~TIME_MASK;
opts |= OPTS_LC;
}
else if (str[i] == 'f')
{
opts |= OPTS_LF;
opts |= OPTS_LA;
}
else if (str[i] == 't')
opts |= OPTS_LT;
else if (str[i] == 'r')
opts |= OPTS_LR;
else if (str[i] == 'd')
{
opts &= ~OPTS_UR;
opts |= OPTS_LD;
}
else if (str[i] == 'p')
opts |= OPTS_LP;
else if (str[i] == 'u')
{
opts &= ~TIME_MASK;
opts |= OPTS_LU;
}
else if (str[i] == 'A')
opts |= OPTS_UA;
else if (str[i] == 'R')
{
if (!(opts & OPTS_LD))
opts |= OPTS_UR;
}
else if (str[i] == 'U')
{
opts &= ~TIME_MASK;
opts |= OPTS_UU;
}
else if (str[i] == 'S')
opts |= OPTS_US;
else
{ {
ft_error_option(str[i]); ft_error_option(str[i]);
exit(1); exit(1);

View file

@ -6,7 +6,7 @@
/* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */ /* By: jhalford <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2016/11/07 15:00:15 by jhalford #+# #+# */ /* Created: 2016/11/07 15:00:15 by jhalford #+# #+# */
/* Updated: 2016/11/23 18:20:34 by jhalford ### ########.fr */ /* Updated: 2016/11/25 10:49:54 by jhalford ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */