|
|
1.1 root 1: /*
2: * from - generate a list of numbers
3: * usage - from number to number [ by number ]
4: */
5: #include <stdio.h>
6:
7: #define sign(x) (x<0?-1:1) /* returns sign of number */
8:
9: char usage[] = "Usage: from number to number [by number]\n";
10: char signmsg[] = "Increment has wrong sign\n";
11:
12: main(argc, argv)
13: char *argv[];
14: {
15: int i;
16: int start, end, incr;
17:
18: switch ( argc ) {
19:
20: case 4:
21: incr = 1;
22: break;
23:
24: case 6:
25: if ( strcmp(argv[4], "by") )
26: error(usage);
27: else
28: if ( (incr = numeric(argv[5])) == 0 )
29: error("Increment must be non-zero\n");
30: break;
31:
32: default:
33: error(usage);
34: break;
35: }
36: if ( strcmp(argv[2], "to") )
37: error(usage);
38: start = numeric(argv[1]);
39: end = numeric(argv[3]);
40: if ( sign(end-start) * sign(incr) < 0 )
41: error(signmsg);
42:
43: if ( incr > 0 )
44: for ( i = start; i <= end; i += incr )
45: printf("%d\n", i);
46: else
47: for ( i = start; i >= end; i += incr )
48: printf("%d\n", i);
49: exit(0);
50: }
51:
52: /*
53: * Return the value of a numeric arg;
54: * otherwise, call usage().
55: */
56: numeric(s)
57: register char *s;
58: {
59: register int n;
60:
61: n = atoi(s);
62: if ( *s == '-' )
63: s++;
64: for ( ; *s; s++)
65: if (*s<'0' || *s>'9')
66: error(usage);
67: return(n);
68: }
69:
70: error(x)
71: {
72: fprintf(stderr, "%r", &x);
73: exit(1);
74: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.