|
|
1.1 root 1: #include <stdio.h>
2:
3: double min=1.0;
4: double max=0.0;
5: double incr=1.0;
6: int const=0;
7: int nsteps;
8: char *format;
9:
10: extern double atof();
11: extern char *strchr();
12:
13: main(argc, argv)
14: char *argv[];
15: {
16: register i;
17: char buf[BUFSIZ], ffmt[BUFSIZ];
18:
19: while(argc>1 && argv[1][0]=='-'){
20: switch(argv[1][1]){
21: case 'w':
22: const++;
23: break;
24: case 'f':
25: format= &argv[1][2];
26: if(format[strlen(format)-1] != '\n')
27: sprintf(format = ffmt, "%s\n", &argv[1][2]);
28: break;
29: default:
30: goto out;
31: }
32: --argc;
33: argv++;
34: }
35: out:
36: if(argc<2 || argc>4)
37: usage();
38: max=atof(argv[argc-1]);
39: if(argc>2)
40: min=atof(argv[1]);
41: if(argc>3)
42: incr=atof(argv[2]);
43: if(incr==0){
44: fprintf(stderr, "seq: zero increment\n");
45: exit(1);
46: }
47: nsteps=(max-min)/incr+.5;
48: if(!format)
49: buildfmt();
50: for(i=0; i<=nsteps; i++)
51: printf(format, min+i*incr);
52: return 0;
53: }
54: usage(){
55: fprintf(stderr, "usage: seq [-fformat] [-w] [first [incr]] last\n");
56: exit(1);
57: }
58: buildfmt()
59: {
60: register i;
61: register char *dp;
62: int w, p, maxw=0, maxp=0;
63: static char fmt[16];
64: char buf[32];
65:
66: format = "%g\n";
67: if(!const)
68: return;
69: for(i=0; i<=nsteps; i++) {
70: sprintf(buf,"%g",min+i*incr);
71: if(strchr(buf,'e')!=0)
72: return;
73: dp = strchr(buf,'.');
74: w = dp==0? strlen(buf): dp-buf;
75: p = dp==0? 0: strlen(strchr(buf,'.')+1);
76: if(w>maxw) maxw = w;
77: if(p>maxp) maxp = p;
78: }
79: if(maxp>0) maxw += maxp+1;
80: sprintf(fmt,"%%0%d.%df\n",maxw,maxp);
81: format = fmt;
82: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.