trange.c - numtools - perform numerical operations on vectors and matrices in unix pipes
 (HTM) git clone git://src.adamsgaard.dk/numtools
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       trange.c (2162B)
       ---
            1 #include <stdio.h>
            2 #include <stdlib.h>
            3 #include <err.h>
            4 #include <limits.h>
            5 #include <string.h>
            6 #include <math.h>
            7 #include <unistd.h>
            8 
            9 #include "util.h"
           10 
           11 static void
           12 usage(void)
           13 {
           14         errx(1, "usage: range [-b] [-d delimstr] [-e] [-l] [-n] [-N num] "
           15              "[-p prec] [-s] [[min_val] max_val]");
           16 }
           17 
           18 int
           19 main(int argc, char *argv[])
           20 {
           21         int i, j, ch, n = 10, logrange = 0, openstart = 0, openend = 0,
           22                 prec = 17, finalnl = 1, reportdx = 0;
           23         double minv = 0.0, maxv = 1.0, dx, val;
           24         const char *errstr;
           25         char *delimstr = "\n";
           26 
           27         if (pledge("stdio", NULL) == -1)
           28                 err(2, "pledge");
           29 
           30         while ((ch = getopt(argc, argv, "bd:elnN:p:s")) != -1) {
           31                 switch (ch) {
           32                 case 'b':
           33                         openstart = 1;
           34                         break;
           35                 case 'd':
           36                         delimstr = optarg;
           37                         break;
           38                 case 'e':
           39                         openend = 1;
           40                         break;
           41                 case 'l':
           42                         logrange = 1;
           43                         break;
           44                 case 'n':
           45                         finalnl = 0;
           46                         break;
           47                 case 'N':
           48                         n = strtonum(optarg, 0, LONG_MAX, &errstr);
           49                         if (errstr != NULL)
           50                                 errx(1, "bad num value, %s: %s", errstr, optarg);
           51                         break;
           52                 case 'p':
           53                         prec = strtonum(optarg, -10, INT_MAX, &errstr);
           54                         if (errstr != NULL)
           55                                 errx(1, "bad precision value, %s: %s", errstr, optarg);
           56                         break;
           57                 case 's':
           58                         reportdx = 1;
           59                         break;
           60                 default:
           61                         usage();
           62                 }
           63         }
           64         argc -= optind;
           65         argv += optind;
           66         if (argc > 2)
           67                 usage();
           68         else if (argc == 2) {
           69                 if (!sscanf(argv[0], "%lf", &minv))
           70                         errx(1, "bad minv value: %s", argv[0]);
           71                 if (!sscanf(argv[1], "%lf", &maxv))
           72                         errx(1, "bad maxv value: %s", argv[1]);
           73         } else if (argc == 1)
           74                 if (!sscanf(argv[0], "%lf", &maxv))
           75                         errx(1, "bad maxv value: %s", argv[0]);
           76 
           77         if (logrange) {
           78                 if (minv <= 0.0)
           79                         errx(1, "minv is not positive: %g", minv);
           80                 if (maxv <= 0.0)
           81                         errx(1, "maxv is not positive: %g", maxv);
           82                 minv = log10(minv);
           83                 maxv = log10(maxv);
           84         }
           85         dx = (maxv - minv) / (n - 1 + openend + openstart);
           86         if (reportdx) {
           87                 printf("%.*g", prec, dx);
           88                 if (finalnl)
           89                         putchar('\n');
           90                 return 0;
           91         }
           92         for (i = 0; i < n; i++) {
           93                 j = i + openstart;
           94                 if (logrange)
           95                         val = pow(10, minv + j * dx);
           96                 else
           97                         val = minv + j * dx;
           98                 printf("%.*g", prec, val);
           99                 if (i < n - 1)
          100                         fputs(delimstr, stdout);
          101         }
          102         if (finalnl)
          103                 putchar('\n');
          104 
          105         return 0;
          106 }