diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 85315b27..1e6cb60b 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -7,4 +7,6 @@ function(luna_app SOURCE_FILE APP_NAME) endfunction() luna_app(init.c init) +luna_app(cat.c cat) +luna_app(edit.c edit) luna_app(sh.c sh) diff --git a/apps/cat.c b/apps/cat.c new file mode 100644 index 00000000..b99c72ec --- /dev/null +++ b/apps/cat.c @@ -0,0 +1,41 @@ +#include +#include +#include + +static void do_cat(FILE* f) +{ + char buffer[4096]; + + while (1) + { + size_t nread = fread(buffer, 1, sizeof(buffer), f); + if (nread == 0) return; + fwrite(buffer, 1, nread, stdout); + } +} + +int main(int argc, char** argv) +{ + FILE* f; + + if (argc < 2) { do_cat(stdin); } + else + { + for (int i = 1; i < argc; i++) + { + if (!strcmp(argv[i], "-")) f = stdin; + else + { + f = fopen(argv[i], "r"); + if (!f) + { + perror(argv[i]); + return 1; + } + } + + do_cat(f); + if (f != stdin) fclose(f); + } + } +} diff --git a/apps/edit.c b/apps/edit.c new file mode 100644 index 00000000..0c5a17dd --- /dev/null +++ b/apps/edit.c @@ -0,0 +1,35 @@ +#include +#include +#include + +int main(int argc, char** argv) +{ + FILE* f; + + if (argc < 2) + { + fprintf(stderr, "usage: %s [file]", argv[0]); + return 1; + } + + f = fopen(argv[1], "w"); + if (!f) + { + perror(argv[1]); + return 1; + } + + char buffer[4096]; + + while (1) + { + char* rc = fgets(buffer, sizeof(buffer), stdin); + if (rc == 0) break; + if (!strcmp(rc, "EOF\n")) break; + fputs(buffer, f); + } + + fclose(f); + + return 0; +}