diff options
| author | Thorsten Töpper <atsutane@freethoughts.de> | 2025-07-07 23:09:19 +0200 |
|---|---|---|
| committer | Thorsten Töpper <atsutane@freethoughts.de> | 2025-07-07 23:09:19 +0200 |
| commit | d91dca7a417c55224167e33d7d0cad550218ead9 (patch) | |
| tree | 654e316764a3fc5eff65a79ca479d590d518571b /src | |
| parent | 2b9b4dd8321dbe253b5edcb031fc2f2a71a6d4cc (diff) | |
| download | dir_monitor-d91dca7a417c55224167e33d7d0cad550218ead9.tar.gz dir_monitor-d91dca7a417c55224167e33d7d0cad550218ead9.tar.bz2 | |
output: --print-header to label columns
Diffstat (limited to 'src')
| -rw-r--r-- | src/options.c | 14 | ||||
| -rw-r--r-- | src/output.c | 93 |
2 files changed, 104 insertions, 3 deletions
diff --git a/src/options.c b/src/options.c index 16d6cf5..9220003 100644 --- a/src/options.c +++ b/src/options.c @@ -21,6 +21,7 @@ struct option long_options[] = { { "help", no_argument, 0, 0 }, { "format-string", required_argument, 0, 0 }, { "long-timestamp", no_argument, 0, 0 }, + { "print-header", no_argument, 0, 0 }, { "reverse-sort", no_argument, 0, 0 }, { "show-hidden-entries", no_argument, 0, 0 }, { "sort-by", required_argument, 0, 0 }, @@ -30,6 +31,7 @@ struct option long_options[] = { bool option_sort_reverse_order = false; enum esort_type option_sort_type = SORT_BY_SIZE; +bool option_print_header = false; bool option_show_hidden_entries = false; bool option_timestamp_long = false; char *option_format_string = NULL; @@ -55,6 +57,8 @@ void usage(char *executable) { "define columns to print, details below"); fprintf(stderr, " %-25s %2s %10s - %s\n", "--long-timestamp", "-t", "", "Print timestamp in long form yyyymmdd HH:MM:SS ZONE"); + fprintf(stderr, " %-25s %2s %10s - %s\n", "--print-header", "-H", "", + "Print a header above the columns"); fprintf(stderr, " %-25s %2s %10s - %s\n", "--reverse-sort", "", "", "Sort reversed"); fprintf(stderr, " %-25s %2s %10s - %s\n", "--show-hidden-entries", "-v", "", @@ -108,6 +112,11 @@ void set_option(const char *option_name, char *option_argument) { return; } + if (strcmp("print-header", option_name) == 0) { + option_print_header = true; + return; + } + if (strcmp("show-hidden-entries", option_name) == 0) { option_show_hidden_entries = true; return; @@ -171,7 +180,7 @@ int parse_arguments(int argc, char **argv) { while(1) { index = 0; - c = getopt_long(argc, argv, "htv", long_options, &index); + c = getopt_long(argc, argv, "Hhtv", long_options, &index); if (c == -1) { break; @@ -184,6 +193,9 @@ int parse_arguments(int argc, char **argv) { case 'h': usage(exec_name); exit(EXIT_SUCCESS); + case 'H': + option_print_header = true; + break; case 't': option_timestamp_long = true; break; diff --git a/src/output.c b/src/output.c index 04cafe7..5c68f17 100644 --- a/src/output.c +++ b/src/output.c @@ -25,6 +25,8 @@ /* === DEFINITIONS === */ +#define DM_OUT_FORMAT_MAX_LEN 80 + #define out_vsep fputc('|', stdout) #define out_print_newline() fputc('\n', stdout) @@ -40,6 +42,7 @@ void out_print_time_by_option(struct list_node *ptr); void out_print_type(struct list_node *ptr); void out_print_user_name(struct list_node *ptr); +void out_print_format_string_header(const char *format); /* === IMPLEMENTATION === */ @@ -174,7 +177,7 @@ inline void out_print_time(time_t tv) { tm = localtime(&tv); if (option_timestamp_long) { strftime(timestamp, sizeof(timestamp), "%Y%m%d %H:%M:%S %Z", tm); - printf(" %20s ", timestamp); + printf(" %22s ", timestamp); } else { strftime(timestamp, sizeof(timestamp), "%H:%M:%S", tm); printf(" %8s ", timestamp); @@ -286,6 +289,83 @@ inline void out_print_permissions(struct list_node *ptr) { printf(" %4o ", mode); } +inline void out_print_format_string_header(const char *format) { + size_t i=0, format_len=0; + char header[4096] = ""; + char *pos = header; + + if (format == NULL) return; + DBGTRC("DEBUG: format string: \"%s\"\n", format); + + + format_len = strnlen(format, DM_OUT_FORMAT_MAX_LEN); + /* Prevent buffer overflow, with the header string 32 byte buffer */ + for (i=0; (i < format_len) && (strlen(header) < 4064); i++) { + switch (format[i]) { + case 'n': + sprintf(pos, " FILE "); + break; + case 's': + sprintf(pos, " %11s ", "SIZE "); + break; + case 't': + if (option_timestamp_long) { + sprintf(pos, " %c%-21s ", toupper(option_time_field), "TIME"); + } else { + sprintf(pos, " %c%-7s ", toupper(option_time_field), "TIME"); + } + break; + case 'A': + if (option_timestamp_long) { + sprintf(pos, " %-22s ", "ACCESS TIME"); + } else { + sprintf(pos, " %-8s ", "ATIME"); + } + break; + case 'C': + if (option_timestamp_long) { + sprintf(pos, " %-22s ", "CREATION TIME"); + } else { + sprintf(pos, " %-8s ", "CTIME"); + } + break; + case 'M': + if (option_timestamp_long) { + sprintf(pos, " %-22s ", "MODIFICATION TIME"); + } else { + sprintf(pos, " %-8s ", "MTIME"); + } + break; + case 'T': + sprintf(pos, " %-12s ", "TYPE"); + break; + case 'u': + sprintf(pos, " %-4s ", "UID"); + break; + case 'g': + sprintf(pos, " %-4s ", "GID"); + break; + case 'U': + sprintf(pos, " %-10s ", "USER"); + break; + case 'G': + sprintf(pos, " %-10s ", "GROUP"); + break; + case 'p': + sprintf(pos, " %-4s ", "PERM"); + break; + case ' ': + break; + default: + LOGERR("WARNING: Invalid character 0x%02X ignoring it\n", format[i]); + break; + }; + pos = &header[strlen(header)]; + } + printf("%s\n", header); + fputc_width_x('-', strlen(header), stdout); + out_print_newline(); +} /* === END OF FORMATTING FUNCTIONS === */ @@ -305,6 +385,10 @@ void print_list(struct list_head *list) { } } + if (option_print_header) { + out_print_format_string_header("stn"); + } + ptr = lh->first; while (ptr != NULL) { out_print_size(ptr); @@ -370,7 +454,12 @@ void print_list_formatted(const char *format, struct list_head *list) { /* Note: the maximum length needs to be adjusted if the strings * shall contain more complicated settings */ - format_len = strnlen(format, 80); + format_len = strnlen(format, DM_OUT_FORMAT_MAX_LEN); + DBGTRC("DEBUG: format_len = %lu\n", format_len); + + if (option_print_header) { + out_print_format_string_header(format); + } ptr = lh->first; while (ptr != NULL) { |
