diff options
author | Glenn L McGrath <bug1@ihug.co.nz> | 2004-01-18 05:15:16 +0000 |
---|---|---|
committer | Glenn L McGrath <bug1@ihug.co.nz> | 2004-01-18 05:15:16 +0000 |
commit | 792cae5f2a234c00c8c79783e2474135e0a78554 (patch) | |
tree | c6f1f2ed40d8864250736125b397333d6f342929 | |
parent | 58a2e0e2625d1fa21fe378f6ad3cad576af9e4d5 (diff) | |
download | busybox-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.c | 220 |
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 | ||
811 | static 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 | 868 | static 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 | ||
845 | static const unsigned opt_flags[] = { | 884 | static 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 |
892 | LS_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 | ||
905 | extern int ls_main(int argc, char **argv) | 946 | extern 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 | } |