diff options
author | Jakob Kaivo <jkk@ung.org> | 2019-03-15 15:45:09 -0400 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2019-03-15 15:45:09 -0400 |
commit | 00a1b0aff0700353a4464a64722d8334b580ad9e (patch) | |
tree | 3d80f539d5a5832dd841b5bec80236aa5d13fc0b | |
parent | b01bcc2f7e0545a95e8549fc84cfe80d748f5e39 (diff) |
multi-call alias to echo
-rw-r--r-- | printf.c | 27 |
1 files changed, 24 insertions, 3 deletions
@@ -1,6 +1,7 @@ #define _XOPEN_SOURCE 700 #include <errno.h> #include <ctype.h> +#include <libgen.h> #include <locale.h> #include <stdarg.h> #include <stdio.h> @@ -9,11 +10,12 @@ #include <unistd.h> static int errors = 0; +static const char *progname = "printf"; static void diagnose(const char *fmt, ...) { char ofmt[strlen(fmt) + 10]; - sprintf(ofmt, "printf: %s\n", fmt); + sprintf(ofmt, "%s: %s\n", progname, fmt); va_list ap; va_start(ap, fmt); @@ -93,7 +95,7 @@ static const char *echo(const char *s) } if (*s == '0' || !isdigit(*s)) { - s = escape(s); + s = escape(s + 1); } else { diagnose("unknown escape \"\\%c\"", *s); s++; @@ -222,7 +224,7 @@ static const char *convert(const char *conv, const char *operand) return conv + 1; } -int main(int argc, char *argv[]) +int printf_main(int argc, char *argv[]) { setlocale(LC_ALL, ""); @@ -273,3 +275,22 @@ int main(int argc, char *argv[]) return errors; } + +int echo_main(int argc, char *argv[]) +{ + for (int i = 1; i < argc; i++) { + echo(argv[i]); + putchar(i == argc - 1 ? '\n' : ' '); + } + return errors; +} + +int main(int argc, char *argv[]) +{ + if (!strcmp(basename(argv[0]), "echo")) { + progname = "echo"; + return echo_main(argc, argv); + } + + return printf_main(argc, argv); +} |