From 6b9edb2946fff8177ce9b1a8944b762101dda2ae Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 17 Nov 2023 15:29:29 +0300 Subject: [PATCH] head add, uname fix --- config.h | 3 ++ coreutils/head.c | 93 ++++++++++++++++++++++++++++++++++++++++++ coreutils/uname.c | 100 +++++++++++++++++++--------------------------- 3 files changed, 138 insertions(+), 58 deletions(-) create mode 100644 coreutils/head.c diff --git a/config.h b/config.h index 06641aa..813abef 100644 --- a/config.h +++ b/config.h @@ -7,6 +7,9 @@ /* Random source for shred */ #define RAND_SOURCE "/dev/urandom" +/* format for printf (head) */ +#define HEAD_FMT "==> %s <==\n" + /* Options: To disable, comment line */ /* Add escape-char support in echo */ #define ECHO_FANCY diff --git a/coreutils/head.c b/coreutils/head.c new file mode 100644 index 0000000..385c2e5 --- /dev/null +++ b/coreutils/head.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include +#include "config.h" + +unsigned int v_flag; +unsigned int c_flag; + +long parse_long(const char *str) { + char *ptr; + long ret = strtol(str, &ptr, 0); + if (*ptr) { + fprintf(stderr, "head: %s invalid number\n", ptr); + exit(1); + } + + return ret; +} + +void print(const char *file, FILE *fp, long lines, long bytes) { + if (v_flag) + printf(HEAD_FMT, file); + + long lcount = 0; + long bcount = 0; + + while (1) { + int c = getc(fp); + if (c == EOF || lcount == lines || (c_flag && bcount == bytes)) + break; + + if (c == '\n') + lcount++; + + bcount++; + putchar(c); + } +} + +int main(int argc, char **argv) { + long lines = 10; + long bytes = 0; + + int opt; + while ((opt = getopt(argc, argv, "n:c:v")) != -1) { + switch (opt) { + case 'n': + lines = parse_long(optarg); + break; + + case 'c': + c_flag = 1; + bytes = parse_long(optarg); + break; + + case 'v': + v_flag = 1; + break; + + default: + printf("head [file1 file2...]\n\t[-n Print N lines] [-c Print N bytes]\n\t[-v Print headers]\n"); + return 0; + } + } + + argv += optind; + argc -= optind; + + if (argc == 0) + print("-", stdin, lines, bytes); + + for (int i = 0; i < argc; i++) { + FILE *fp = NULL; + if (argv[i][0] == '-') + fp = stdin; + + else + fp = fopen(argv[i], "r"); + + if (fp == NULL) { + fprintf(stderr, "head: %s: %s\n", argv[i], strerror(errno)); + return 1; + } + + print(argv[i], fp, lines, bytes); + fclose(fp); + } + + return 0; +} diff --git a/coreutils/uname.c b/coreutils/uname.c index 8c14d52..3abbedd 100644 --- a/coreutils/uname.c +++ b/coreutils/uname.c @@ -4,72 +4,56 @@ #include #include -/* sys node release version machine */ -int flags[] = {0, 0, 0, 0, 0}; -enum { - O_SYS, - O_NODE, - O_RELEASE, - O_VERSION, - O_MACHINE, - O_ALL -}; - int main(int argc, char **argv) { - int opt; - while ((opt = getopt(argc, argv, "ashrvm")) != -1) { - switch (opt) { - case 'a': - for (int i = 0; i < O_ALL; i++) - flags[i] = 1; - break; - - case 's': - flags[O_SYS] = 1; - break; - - case 'n': - flags[O_NODE] = 1; - break; - - case 'r': - flags[O_RELEASE] = 1; - break; - - case 'v': - flags[O_VERSION] = 1; - break; - - case 'm': - flags[O_MACHINE] = 1; - break; - - default: - printf("uname [-a All] [-s Sys] [-n Nodename] [-r Release] [-v Version] [-m Machine]\n"); - return 0; - } - } - struct utsname uts; if (uname(&uts)) { fprintf(stderr, "uname: %s", strerror(errno)); return 1; } - if (flags[O_SYS] || argc == 1) + + unsigned int a_flag = 0; + + int opt; + while ((opt = getopt(argc, argv, "ashrvm")) != -1) { + switch (opt) { + case 'a': + a_flag = 1; + /* fallthrough */ + + case 's': + printf("%s ", uts.sysname); + if (!a_flag) + break; + + case 'n': + printf("%s ", uts.nodename); + if (!a_flag) + break; + + case 'r': + printf("%s ", uts.release); + if (!a_flag) + break; + + case 'v': + printf("%s ", uts.version); + if (!a_flag) + break; + + case 'm': + printf("%s ", uts.machine); + break; + + default: + printf("uname\n\t[-a All] [-s Sys]\n\t[-n Nodename] [-r Release]\n\t[-v Version] [-m Machine]\n"); + return 0; + } + } + + argc -= optind; + if (argc == 0) printf("%s ", uts.sysname); - if (flags[O_NODE]) - printf("%s ", uts.nodename); - - if (flags[O_RELEASE]) - printf("%s ", uts.release); - - if (flags[O_VERSION]) - printf("%s ", uts.version); - - if (flags[O_MACHINE]) - printf("%s ", uts.machine); - putchar('\n'); }