summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-03-15 15:45:09 -0400
committerJakob Kaivo <jkk@ung.org>2019-03-15 15:45:09 -0400
commit00a1b0aff0700353a4464a64722d8334b580ad9e (patch)
tree3d80f539d5a5832dd841b5bec80236aa5d13fc0b
parentb01bcc2f7e0545a95e8549fc84cfe80d748f5e39 (diff)
multi-call alias to echo
-rw-r--r--printf.c27
1 files changed, 24 insertions, 3 deletions
diff --git a/printf.c b/printf.c
index ec0b351..7b6ef76 100644
--- a/printf.c
+++ b/printf.c
@@ -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);
+}