diff --git a/basename.c b/basename.c new file mode 100755 index 0000000..1ee21c4 --- /dev/null +++ b/basename.c @@ -0,0 +1,90 @@ +#include +#include +#include + +int main(int argc, char ** argv) { + int suffix_present = 0, i, j; + char *basename; char c; + int basename_length = 0, last_slash = 0; + int suffix_length = 0; + + if(argc > 2) { + suffix_present = 1; + } + else if(argc == 1) { + printf("\n"); + return 0; + } + + if(strcmp(argv[1], "//") == 0) { + printf("\n"); + return 0; + } + + i = 0; + + for(c = argv[1][i]; c != '\0'; c = argv[1][i]) { + i++; + } + + if(argv[1][i-1] == '/') { + argv[1][i-1] = '\0'; + } + + i = 0; + + for(c = argv[1][i]; c != '\0'; c = argv[1][i]) { + if(c == '/') { + last_slash = i; + } + i++; + } + + i = last_slash + 1; + + for(c = argv[1][i]; c != '\0'; c = argv[1][i]) { + basename_length++; i++; + } + + basename = calloc(basename_length + 1, sizeof(*basename)); + if(basename == NULL) { + fprintf(stderr, "%s: Could not allocate sufficient memory\n", argv[0]); + return 1; + } + + i = last_slash + 1; + + for(c = argv[1][i]; c != '\0'; c = argv[1][i]) { + basename[i - (last_slash + 1)] = c; + i++; + } + + basename[basename_length] = '\0'; + + if(suffix_present && strcmp(basename, argv[2]) != 0) { + i = 0; + for(c = argv[2][i]; c != '\0'; c = argv[2][i]) { + suffix_length++; + i++; + } + + j = suffix_length - 1; + + for(i = basename_length - 1; i > 0; i--) { + if(basename[i] != argv[2][j]) { + break; + } + else if(j == 0) { + basename[i] = '\0'; + i = 0; + } + j--; + } + } + + printf("%s\n", basename); + + free(basename); + + return 0; +} diff --git a/dirname.c b/dirname.c new file mode 100755 index 0000000..a9a19e4 --- /dev/null +++ b/dirname.c @@ -0,0 +1,49 @@ +#include +#include + +int main(int argc, char ** argv) { + int i, last_slash = -1, length; + + if(argc == 1) { + printf("/\n"); + return 0; + } + + if(strcmp(argv[1], "//") == 0) { + printf("/\n"); + return 0; + } + + length = strlen(argv[1]); + + if(argv[1][length - 1] == '/') { + argv[1][length - 1] = '\0'; + } + + for(i = 0; i < length; i++) { + if(argv[1][i] == '/') { + last_slash = i; + } + } + + if(last_slash == -1) { + printf(".\n"); + return 0; + } + + argv[1][last_slash] = '\0'; + + if(strcmp(argv[1], "//") == 0 || strcmp(argv[1], "") == 0 || + strcmp(argv[1], "/") == 0) { + printf("/\n"); + return 0; + } + + for(i = last_slash - 1; argv[1][i] == '/'; i--) { + argv[1][i] = '\0'; + } + + printf("%s\n", argv[1]); + + return 0; +} diff --git a/false.c b/false.c new file mode 100755 index 0000000..02fb0e1 --- /dev/null +++ b/false.c @@ -0,0 +1,3 @@ +int main() { + return -1; +} diff --git a/link.c b/link.c new file mode 100755 index 0000000..8b20a13 --- /dev/null +++ b/link.c @@ -0,0 +1,17 @@ +#include +#include +#include + +int main(int argc, char * argv[]) { + if(argc < 3) { + fprintf(stderr, "%s: missing file operand\n", argv[0]); + exit(1); + } + + if(argc > 3) { + fprintf(stderr, "%s: extra operand specified\n", argv[0]); + exit(1); + } + + return link(argv[1], argv[2]); +} diff --git a/true.c b/true.c new file mode 100755 index 0000000..4cce7f6 --- /dev/null +++ b/true.c @@ -0,0 +1,3 @@ +int main() { + return 0; +}