summaryrefslogtreecommitdiff
path: root/dviware/dvimerge/range.c
blob: 0dd784f55add865bb7eb442382654c05e4f79125 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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);
}