aboutsummaryrefslogtreecommitdiff
path: root/src/main.c
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@users.noreply.github.com>2021-05-07 10:35:28 -0400
committerGitHub <noreply@github.com>2021-05-07 10:35:28 -0400
commitb072d93e47949c9729c979fceef8a7c7bfd22d39 (patch)
tree96172b7aa41d6e0b4a44a4d8e67e7bcfd15511ef /src/main.c
parent003c7d1b27140d42c026c25fbca1cef545bfb5c7 (diff)
downloadcleanpath-b072d93e47949c9729c979fceef8a7c7bfd22d39.tar.gz
Improvements (#4)
* Move display code into functions * Mark windows supported * Guard against overruns * Add --list argument to docs
Diffstat (limited to 'src/main.c')
-rw-r--r--src/main.c47
1 files changed, 40 insertions, 7 deletions
diff --git a/src/main.c b/src/main.c
index 7bb92c3..ec77f78 100644
--- a/src/main.c
+++ b/src/main.c
@@ -10,7 +10,7 @@
// Global program path
static char *program;
-static int is_valid_arg(char **args, char *s) {
+int is_valid_arg(char **args, char *s) {
int match;
match = 0;
@@ -29,8 +29,7 @@ static int is_valid_arg(char **args, char *s) {
return match;
}
-
-static char *getenv_ex(char *s) {
+char *getenv_ex(char *s) {
char *env_var;
env_var = getenv(s);
if (!env_var || !strlen(env_var)) {
@@ -39,6 +38,31 @@ static char *getenv_ex(char *s) {
return env_var;
}
+void show_listing(struct CleanPath *path) {
+ if (path == NULL) {
+ return;
+ }
+
+ for (size_t i = 0; i < CLEANPATH_PART_MAX && path->part[i] != NULL; i++) {
+ if (*path->part[i] == '\0') {
+ continue;
+ }
+ puts(path->part[i]);
+ }
+}
+
+void show_path(struct CleanPath *path) {
+ char *result;
+
+ result = cleanpath_read(path);
+ if (result == NULL) {
+ return;
+ }
+
+ printf("%s\n", result);
+ free(result);
+}
+
static void show_version() {
puts(CLEANPATH_VERSION);
}
@@ -50,6 +74,7 @@ static void show_usage() {
printf("usage: %s [-hVelrsv] [pattern ...]\n", bname ? bname + 1 : program);
printf(" --help -h Displays this help message\n");
printf(" --version -V Displays the program's version\n");
+ printf(" --list Format output as a list\n");
printf(" --exact -e Filter when pattern is an exact match (default)\n");
printf(" --loose -l Filter when any part of the pattern matches\n");
printf(" --regex -r Filter matches with (Extended) Regular Expressions " CLEANPATH_MSG_NOAVAIL "\n");
@@ -63,6 +88,7 @@ int main(int argc, char *argv[]) {
char *sys_var;
char *result;
size_t pattern_nelem;
+ int do_listing;
int filter_mode;
int args_invalid;
char *pattern[CLEANPATH_PART_MAX];
@@ -71,6 +97,7 @@ int main(int argc, char *argv[]) {
result = NULL;
sys_var = NULL;
sep = CLEANPATH_SEP;
+ do_listing = 0;
filter_mode = CLEANPATH_FILTER_NONE;
memset(pattern, 0, sizeof(pattern) / sizeof(char *));
pattern_nelem = 0;
@@ -79,6 +106,7 @@ int main(int argc, char *argv[]) {
char *args_valid[] = {
"--help", "-h",
"--version", "-V",
+ "--list",
"--exact", "-e",
"--loose", "-l",
"--regex", "-r",
@@ -104,6 +132,9 @@ int main(int argc, char *argv[]) {
show_version();
exit(0);
}
+ if (ARGM("--list")) {
+ do_listing = 1;
+ }
if (ARGM("--exact") || ARGM("-e")) {
filter_mode = CLEANPATH_FILTER_EXACT;
continue;
@@ -151,16 +182,18 @@ int main(int argc, char *argv[]) {
}
// Remove patterns from sys_var
- for (size_t i = 0; pattern[i] != NULL; i++) {
+ for (size_t i = 0; i < CLEANPATH_PART_MAX && pattern[i] != NULL; i++) {
cleanpath_filter(path, filter_mode, pattern[i]);
}
// Print filtered result
- result = cleanpath_read(path);
- printf("%s\n", result);
+ if (do_listing) {
+ show_listing(path);
+ } else {
+ show_path(path);
+ }
// Clean up
- free(result);
cleanpath_free(path);
return 0;