diff options
Diffstat (limited to '')
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | cat.c | 22 | ||||
-rw-r--r-- | ls.c | 34 | ||||
-rw-r--r-- | rm.c | 67 | ||||
-rw-r--r-- | sleep.c | 9 | ||||
-rw-r--r-- | touch.c | 12 |
6 files changed, 145 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..b659731 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +I rewrote some of the core utils! @@ -0,0 +1,22 @@ +#include <stdio.h> + +int main(int argc, char *argv[]) +{ + FILE *f; + char c; + + for (int i = 1; i < argc; i++) { + f = fopen(argv[i], "r"); + + if (f == NULL) { + fprintf(stderr, "Cannot read input file \"%s\"\n", argv[i]); + return 1; + } + + do { + c = fgetc(f); + printf("%c", c); + } while (c != EOF); + fclose(f); + } +} @@ -0,0 +1,34 @@ +#include <dirent.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +int main(int argc, char *argv[]) +{ + DIR *d; + char *dirs; + struct dirent *dir; + int hidden = 1; + int c; + + while ((c = getopt(argc, argv, "a")) != -1) { + switch (c) { + case 'a': hidden = 0; break; + } + } + + if (argc > 0) { + for (int i = 1; i < argc; i++) { + dirs = argv[i]; + if ((d = opendir(dirs))) { + while ((dir = readdir(d)) != NULL) { + if (strncmp(dir->d_name, ".", 1) != 0 && hidden) /* dont print hidden files */ + printf("%s\n", dir->d_name); + else if (!hidden) + printf("%s\n", dir->d_name); + } + closedir(d); + } + } + } +} @@ -0,0 +1,67 @@ +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +/* TODO make a recursive flag */ + +int rm(char *fn, int frc, int ask, int expAsk); + +int +rm(char *fn, int frc, int ask, int prompt) +{ + FILE *f; + int sz; + char yn; + + /* get length of fn and check if it exists */ + if ((f = fopen(fn, "r"))) { + fseek(f, 0L, SEEK_END); + sz = ftell(f); + } else { + fprintf(stderr, "fn '%s' doesn't exist!\n", fn); + return 1; + } + + /* confirm deletion(s) when ask is on, and size is over 0 */ + if (prompt && !frc || (ask && sz > 0)) { + printf("Do you want to delete %s? ", fn); + yn = getchar(); + + if (yn == 'y') + remove(fn); + } else + remove(fn); + + return 0; +} + +int +main(int argc, char *argv[]) +{ + int ask = 1; /* confirm deletion */ + int prompt = 0; /* explicitly confirm deletion */ + int frc = 0; /* force deletion */ + int c; + + while ((c = getopt(argc, argv, "efh")) != -1) { + switch (c) { + case 'i': prompt = 1; break; + case 'f': frc = 1; ask = 0; break; + case 'h': goto usage; break; + default: printf("run %s -h for help\n", argv[0]); return 1; break; + } + } + + /* for each argument */ + for (int i = 1; i < argc; i++) { + if (strncmp(argv[i], "-", 1) == 0) /* ignore args that start with - */ + i++; + rm(argv[i], frc, ask, prompt); + } + + return 0; + +usage: + printf("Usage: %s -option(s) file(s)\n", argv[0]); + printf("\n\t-i prompt user for deletion of every file\n\t-f force deletion, does not ask for confirmation\n\t-h shows this help message\n"); +} @@ -0,0 +1,9 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +int main(int argc, char *argv[]) +{ + if (argc > 0) + sleep(atoi(argv[1])); +} @@ -0,0 +1,12 @@ +#include <stdio.h> + +int main(int argc, char *argv[]) +{ + FILE *f; + + for (int i = 1; i < argc; i++) { + f = fopen(argv[i], "a"); + fprintf(f, "\n"); /* TODO make this actually work without writing anything to the file*/ + fclose(f); + } +} |