From 4d0d973c8d81eb6b7cbbd14016ecc15479e55494 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Mon, 9 Apr 2012 08:25:52 -0400 Subject: [PATCH] porting bash func for truncating home dir to C (mostly for practice) --- digressions/.gitignore | 1 + digressions/Makefile | 2 +- digressions/truncpwd.c | 76 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 digressions/truncpwd.c diff --git a/digressions/.gitignore b/digressions/.gitignore index 0086ed8..538ff14 100644 --- a/digressions/.gitignore +++ b/digressions/.gitignore @@ -1 +1,2 @@ /temperatures +/truncpwd diff --git a/digressions/Makefile b/digressions/Makefile index 1884913..e522565 100644 --- a/digressions/Makefile +++ b/digressions/Makefile @@ -1,5 +1,5 @@ CFLAGS += -g -Wall -Wextra -all: temperatures +all: temperatures truncpwd .PHONY: all diff --git a/digressions/truncpwd.c b/digressions/truncpwd.c new file mode 100644 index 0000000..1f225a0 --- /dev/null +++ b/digressions/truncpwd.c @@ -0,0 +1,76 @@ +#include +#include +#include +#include +#include + + +#define BUFSIZE 2048 + 1 +#define DEFAULT_TRUNCPWD_LEN "40" + + +void substr(char *dest, char *src, int offset, int len) { + int i; + for (i = 0; i < len && src[offset + i] != '\0'; i++) { + dest[i] = src[offset + i]; + } + dest[i] = '\0'; +} + + +void with_home_as_tilde(char *dest, char *src, char *home) { + size_t src_len = strlen(src); + size_t home_len = strlen(home); + + if (strncmp(src, home, home_len) == 0) { + char less_home[BUFSIZE]; + substr(less_home, src, home_len, src_len - home_len); + sprintf(dest, "~%s", less_home); + } else { + sprintf(dest, "%s", src); + } +} + + +int main(void) +{ + char pwd[BUFSIZE]; + const char *home = getenv("HOME"); + const char *truncpwd_len_str = getenv("TRUNCPWD_LEN"); + if (truncpwd_len_str == NULL) { + truncpwd_len_str = DEFAULT_TRUNCPWD_LEN; + } + unsigned int truncpwd_len = (unsigned int)atoi(truncpwd_len_str); + + const char *truncpwd_leader = getenv("TRUNCPWD_LEADER"); + if (truncpwd_leader == NULL) { + truncpwd_leader = "..."; + } + + if (getcwd(pwd, sizeof(pwd)) == NULL) { + fprintf(stderr, "truncpwd: %s\n", strerror(errno)); + return 1; + } + + size_t pwd_len = strlen(pwd); + + if (strncmp(home, pwd, pwd_len) == 0) { + printf("~\n"); + } + + char tilde_subbed[BUFSIZE]; + with_home_as_tilde(tilde_subbed, pwd, (char *)home); + + size_t tilde_subbed_len = strlen(tilde_subbed); + + if (tilde_subbed_len <= truncpwd_len) { + printf("%s\n", tilde_subbed); + return 0; + } else { + char last_n[truncpwd_len + 1]; + int offset = tilde_subbed_len - truncpwd_len + 1; + substr(last_n, tilde_subbed, offset, truncpwd_len + 1); + printf("%s%s\n", truncpwd_leader, last_n); + } + return 0; +}