summaryrefslogtreecommitdiff
path: root/dviware/dvimerge/range.c
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /dviware/dvimerge/range.c
Initial commit
Diffstat (limited to 'dviware/dvimerge/range.c')
-rw-r--r--dviware/dvimerge/range.c72
1 files changed, 72 insertions, 0 deletions
diff --git a/dviware/dvimerge/range.c b/dviware/dvimerge/range.c
new file mode 100644
index 0000000000..0dd784f55a
--- /dev/null
+++ b/dviware/dvimerge/range.c
@@ -0,0 +1,72 @@
+/*
+ * range a to b [by c]
+ * generate for-loop values for Shell
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+
+long atol();
+void usage();
+long number();
+int isnumeric();
+
+int
+main(argc, argv)
+char **argv;
+{
+ register long a, b, c;
+
+ if (argc < 4 || strcmp(argv[2], "to"))
+ usage();
+ a = number(argv[1]);
+ b = number(argv[3]);
+ c = a <= b? 1: -1;
+ if (argc > 5) {
+ if (strcmp(argv[4], "by"))
+ usage();
+ c = number(argv[5]);
+ }
+ if (c < 0)
+ for (; a >= b; a += c)
+ printf("%ld\n", a);
+ else if (c == 0)
+ printf("%ld\n", a);
+ else
+ for (; a <= b; a += c)
+ printf("%ld\n", a);
+ exit(0);
+}
+
+void
+usage()
+{
+ fprintf(stderr, "Usage: range n1 to n2 [by n3]\n");
+ exit(1);
+}
+
+long
+number(s)
+char *s;
+{
+ if (!isnumeric(s)) {
+ fprintf(stderr, "range: ill-formed number `%s'\n", s);
+ exit(1);
+ }
+ return(atol(s));
+}
+
+int
+isnumeric(s)
+register char *s;
+{
+ while (*s == ' ' || *s == '\t')
+ s++;
+ if (*s == '+' || *s == '-')
+ s++;
+ do {
+ if (!isascii(*s) || !isdigit(*s))
+ return(0);
+ } while (*++s);
+ return(1);
+}