aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn L McGrath <bug1@ihug.co.nz>2004-01-18 05:15:16 +0000
committerGlenn L McGrath <bug1@ihug.co.nz>2004-01-18 05:15:16 +0000
commit792cae5f2a234c00c8c79783e2474135e0a78554 (patch)
treec6f1f2ed40d8864250736125b397333d6f342929
parent58a2e0e2625d1fa21fe378f6ad3cad576af9e4d5 (diff)
downloadbusybox-w32-792cae5f2a234c00c8c79783e2474135e0a78554.tar.gz
busybox-w32-792cae5f2a234c00c8c79783e2474135e0a78554.tar.bz2
busybox-w32-792cae5f2a234c00c8c79783e2474135e0a78554.zip
Use bb_getopt_ulflags, save 200-300 bytes
-rw-r--r--coreutils/ls.c220
1 files changed, 131 insertions, 89 deletions
diff --git a/coreutils/ls.c b/coreutils/ls.c
index 2929b9622..18cffb13e 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -808,93 +808,134 @@ static int list_single(struct dnode *dn)
808 808
809/*----------------------------------------------------------------------*/ 809/*----------------------------------------------------------------------*/
810 810
811static const char ls_opts[] = "1AaCdgilnsx" 811/* "[-]Cadil1", POSIX mandated options, busybox always supports */
812#ifdef CONFIG_FEATURE_LS_FILETYPES 812/* "[-]gnsx", POSIX non-mandated options, busybox always supports */
813 "Fp" 813/* "[-]Ak" GNU options, busybox always supports */
814#endif 814/* "[-]FLRctur", POSIX mandated options, busybox optionally supports */
815#ifdef CONFIG_FEATURE_LS_RECURSIVE 815/* "[-]p", POSIX non-mandated options, busybox optionally supports */
816 "R" 816/* "[-]SXvThw", GNU options, busybox optionally supports */
817/* "[-]K", SELinux mandated options, busybox optionally supports */
818/* "[-]e", I think we made this one up */
819
820#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
821# define LS_STR_TIMESTAMPS "cetu"
822#else
823# define LS_STR_TIMESTAMPS ""
817#endif 824#endif
825
818#ifdef CONFIG_FEATURE_LS_SORTFILES 826#ifdef CONFIG_FEATURE_LS_SORTFILES
819 "rSvX" 827# define LS_STR_SORTFILES "SXrv"
828#else
829# define LS_STR_SORTFILES ""
820#endif 830#endif
821#ifdef CONFIG_FEATURE_LS_TIMESTAMPS 831
822 "ecut" 832#ifdef CONFIG_FEATURE_LS_FILETYPES
833# define LS_STR_FILETYPES "Fp"
834#else
835# define LS_STR_FILETYPES ""
823#endif 836#endif
837
824#ifdef CONFIG_FEATURE_LS_FOLLOWLINKS 838#ifdef CONFIG_FEATURE_LS_FOLLOWLINKS
825 "L" 839# define LS_STR_FOLLOW_LINKS "L"
840#else
841# define LS_STR_FOLLOW_LINKS ""
842#endif
843
844#ifdef CONFIG_FEATURE_LS_RECURSIVE
845# define LS_STR_RECURSIVE "R"
846#else
847# define LS_STR_RECURSIVE ""
826#endif 848#endif
849
827#ifdef CONFIG_FEATURE_HUMAN_READABLE 850#ifdef CONFIG_FEATURE_HUMAN_READABLE
828 "h" 851# define LS_STR_HUMAN_READABLE "h"
852#else
853# define LS_STR_HUMAN_READABLE ""
829#endif 854#endif
830 "k" 855
831#ifdef CONFIG_SELINUX 856#ifdef CONFIG_SELINUX
832 "K" 857# define LS_STR_SELINUX "K"
858#else
859# define LS_STR_SELINUX ""
833#endif 860#endif
861
834#ifdef CONFIG_FEATURE_AUTOWIDTH 862#ifdef CONFIG_FEATURE_AUTOWIDTH
835 "T:w:" 863# define LS_STR_AUTOWIDTH "T:w:"
864#else
865# define LS_STR_AUTOWIDTH ""
836#endif 866#endif
837 ;
838 867
839#define LIST_MASK_TRIGGER LIST_SHORT 868static const char ls_options[]="Cadil1gnsxAk" \
840#define STYLE_MASK_TRIGGER STYLE_MASK 869 LS_STR_TIMESTAMPS \
841#define SORT_MASK_TRIGGER SORT_MASK 870 LS_STR_SORTFILES \
842#define DISP_MASK_TRIGGER DISP_ROWS 871 LS_STR_FILETYPES \
843#define TIME_MASK_TRIGGER TIME_MASK 872 LS_STR_FOLLOW_LINKS \
873 LS_STR_RECURSIVE \
874 LS_STR_HUMAN_READABLE \
875 LS_STR_SELINUX \
876 LS_STR_AUTOWIDTH;
877
878#define LIST_MASK_TRIGGER LIST_SHORT
879#define STYLE_MASK_TRIGGER STYLE_MASK
880#define SORT_MASK_TRIGGER SORT_MASK
881#define DISP_MASK_TRIGGER DISP_ROWS
882#define TIME_MASK_TRIGGER TIME_MASK
844 883
845static const unsigned opt_flags[] = { 884static const unsigned opt_flags[] = {
846 LIST_SHORT | STYLE_SINGLE, /* 1 */
847 DISP_HIDDEN, /* A */
848 DISP_HIDDEN | DISP_DOT, /* a */
849 LIST_SHORT | STYLE_COLUMNS, /* C */ 885 LIST_SHORT | STYLE_COLUMNS, /* C */
850 DISP_NOLIST, /* d */ 886 DISP_HIDDEN | DISP_DOT, /* a */
851 0, /* g - ingored */ 887 DISP_NOLIST, /* d */
852 LIST_INO, /* i */ 888 LIST_INO, /* i */
853 LIST_LONG | STYLE_LONG, /* l - remember LS_DISP_HR in mask! */ 889 LIST_LONG | STYLE_LONG, /* l - remember LS_DISP_HR in mask! */
854 LIST_ID_NUMERIC, /* n */ 890 LIST_SHORT | STYLE_SINGLE, /* 1 */
855 LIST_BLOCKS, /* s */ 891 0, /* g - ingored */
856 DISP_ROWS, /* x */ 892 LIST_ID_NUMERIC, /* n */
857#ifdef CONFIG_FEATURE_LS_FILETYPES 893 LIST_BLOCKS, /* s */
858 LIST_FILETYPE | LIST_EXEC, /* F */ 894 DISP_ROWS, /* x */
859 LIST_FILETYPE, /* p */ 895 DISP_HIDDEN, /* A */
860#endif 896#ifdef CONFIG_SELINUX
861#ifdef CONFIG_FEATURE_LS_RECURSIVE 897 LIST_CONTEXT, /* k */
862 DISP_RECURSIVE, /* R */ 898#else
863#endif 899 0, /* k - ingored */
864#ifdef CONFIG_FEATURE_LS_SORTFILES
865 SORT_ORDER_REVERSE, /* r */
866 SORT_SIZE, /* S */
867 SORT_VERSION, /* v */
868 SORT_EXT, /* v */
869#endif 900#endif
870#ifdef CONFIG_FEATURE_LS_TIMESTAMPS 901#ifdef CONFIG_FEATURE_LS_TIMESTAMPS
871 LIST_FULLTIME, /* e */ 902# ifdef CONFIG_FEATURE_LS_SORTFILES
872#ifdef CONFIG_FEATURE_LS_SORTFILES
873 TIME_CHANGE | SORT_CTIME, /* c */ 903 TIME_CHANGE | SORT_CTIME, /* c */
874#else 904# else
875 TIME_CHANGE, /* c */ 905 TIME_CHANGE, /* c */
876#endif 906# endif
877#ifdef CONFIG_FEATURE_LS_SORTFILES 907 LIST_FULLTIME, /* e */
908# ifdef CONFIG_FEATURE_LS_SORTFILES
909 SORT_MTIME, /* t */
910# else
911 0, /* t - ignored -- is this correct? */
912# endif
913# ifdef CONFIG_FEATURE_LS_SORTFILES
878 TIME_ACCESS | SORT_ATIME, /* u */ 914 TIME_ACCESS | SORT_ATIME, /* u */
879#else 915# else
880 TIME_ACCESS, /* u */ 916 TIME_ACCESS, /* u */
917# endif
881#endif 918#endif
882#ifdef CONFIG_FEATURE_LS_SORTFILES 919#ifdef CONFIG_FEATURE_LS_SORTFILES
883 SORT_MTIME, /* t */ 920 SORT_ORDER_REVERSE, /* r */
884#else 921 SORT_SIZE, /* S */
885 0, /* t - ignored -- is this correct? */ 922 SORT_VERSION, /* v */
923 SORT_EXT, /* v */
886#endif 924#endif
925#ifdef CONFIG_FEATURE_LS_FILETYPES
926 LIST_FILETYPE | LIST_EXEC, /* F */
927 LIST_FILETYPE, /* p */
887#endif 928#endif
888#ifdef CONFIG_FEATURE_LS_FOLLOWLINKS 929#ifdef CONFIG_FEATURE_LS_FOLLOWLINKS
889 FOLLOW_LINKS, /* L */ 930 FOLLOW_LINKS, /* L */
931#endif
932#ifdef CONFIG_FEATURE_LS_RECURSIVE
933 DISP_RECURSIVE, /* R */
890#endif 934#endif
891#ifdef CONFIG_FEATURE_HUMAN_READABLE 935#ifdef CONFIG_FEATURE_HUMAN_READABLE
892LS_DISP_HR, /* h */ 936 LS_DISP_HR, /* h */
893#endif 937#endif
894#ifndef CONFIG_SELINUX 938#ifdef CONFIG_SELINUX
895 0, /* k - ingored */
896#else
897 LIST_CONTEXT, /* k */
898 LIST_MODEBITS|LIST_NLINKS|LIST_CONTEXT|LIST_SIZE|LIST_DATE_TIME, /* K */ 939 LIST_MODEBITS|LIST_NLINKS|LIST_CONTEXT|LIST_SIZE|LIST_DATE_TIME, /* K */
899#endif 940#endif
900}; 941};
@@ -904,13 +945,24 @@ LS_DISP_HR, /* h */
904 945
905extern int ls_main(int argc, char **argv) 946extern int ls_main(int argc, char **argv)
906{ 947{
907 struct dnode **dnf, **dnd; 948 struct dnode **dnd;
908 int dnfiles, dndirs; 949 struct dnode **dnf;
909 struct dnode *dn, *cur, **dnp; 950 struct dnode **dnp;
910 int i, nfiles; 951 struct dnode *dn;
911 int opt; 952 struct dnode *cur;
912 int oi, ac; 953 long opt;
954 int nfiles = 0;
955 int dnfiles;
956 int dndirs;
957 int oi;
958 int ac;
959 int i;
913 char **av; 960 char **av;
961#ifdef CONFIG_FEATURE_AUTOWIDTH
962 char *tabstops_str = NULL;
963 char *terminal_width_str = NULL;
964#endif
965
914#ifdef CONFIG_SELINUX 966#ifdef CONFIG_SELINUX
915 is_flask_enabled_flag = is_flask_enabled(); 967 is_flask_enabled_flag = is_flask_enabled();
916#endif 968#endif
@@ -923,13 +975,13 @@ extern int ls_main(int argc, char **argv)
923 | SORT_NAME | SORT_ORDER_FORWARD 975 | SORT_NAME | SORT_ORDER_FORWARD
924#endif 976#endif
925 ; 977 ;
978
926#ifdef CONFIG_FEATURE_AUTOWIDTH 979#ifdef CONFIG_FEATURE_AUTOWIDTH
927 /* Obtain the terminal width. */ 980 /* Obtain the terminal width. */
928 get_terminal_width_height(0, &terminal_width, NULL); 981 get_terminal_width_height(0, &terminal_width, NULL);
929 /* Go one less... */ 982 /* Go one less... */
930 terminal_width--; 983 terminal_width--;
931#endif 984#endif
932 nfiles = 0;
933 985
934#ifdef CONFIG_FEATURE_LS_COLOR 986#ifdef CONFIG_FEATURE_LS_COLOR
935 if (isatty(fileno(stdout))) 987 if (isatty(fileno(stdout)))
@@ -937,27 +989,21 @@ extern int ls_main(int argc, char **argv)
937#endif 989#endif
938 990
939 /* process options */ 991 /* process options */
940 while ((opt = getopt(argc, argv, ls_opts)) > 0) {
941#ifdef CONFIG_FEATURE_AUTOWIDTH 992#ifdef CONFIG_FEATURE_AUTOWIDTH
942 if (opt == 'T') { 993 opt = bb_getopt_ulflags(argc, argv, ls_options, &tabstops_str, &terminal_width_str);
943 tabstops = atoi(optarg); 994 if (tabstops_str) {
944 continue; 995 tabstops = atoi(tabstops_str);
945 } 996 }
946 if (opt == 'w') { 997 if (terminal_width_str) {
947 terminal_width = atoi(optarg); 998 terminal_width = atoi(terminal_width_str);
948 continue; 999 }
949 } 1000#else
950 if (opt == ':') { 1001 opt = bb_getopt_ulflags(argc, argv, ls_options);
951 goto print_usage_message;
952 }
953#endif 1002#endif
954 { 1003 /* 16 = maximum options minus tabsize and screewn width */
955 unsigned int flags; 1004 for (i = 0; i < 16; i++) {
956 const char *p = strchr(ls_opts, opt); 1005 if (opt & (1 << i)) {
957 if (!p) { /* shouldn't be necessary */ 1006 unsigned int flags = opt_flags[i];
958 goto print_usage_message;
959 }
960 flags = opt_flags[(int)(p - ls_opts)];
961 if (flags & LIST_MASK_TRIGGER) { 1007 if (flags & LIST_MASK_TRIGGER) {
962 all_fmt &= ~LIST_MASK; 1008 all_fmt &= ~LIST_MASK;
963 } 1009 }
@@ -989,7 +1035,6 @@ extern int ls_main(int argc, char **argv)
989 } 1035 }
990 } 1036 }
991 1037
992
993 /* sort out which command line options take precedence */ 1038 /* sort out which command line options take precedence */
994#ifdef CONFIG_FEATURE_LS_RECURSIVE 1039#ifdef CONFIG_FEATURE_LS_RECURSIVE
995 if (all_fmt & DISP_NOLIST) 1040 if (all_fmt & DISP_NOLIST)
@@ -1088,7 +1133,4 @@ extern int ls_main(int argc, char **argv)
1088 } 1133 }
1089 } 1134 }
1090 return (status); 1135 return (status);
1091
1092 print_usage_message:
1093 bb_show_usage();
1094} 1136}