URI:
       tutil.c - numtools - perform numerical operations on vectors and matrices in unix pipes
  HTML git clone git://src.adamsgaard.dk/numtools
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tutil.c (1495B)
       ---
            1 #include <err.h>
            2 #include <stdlib.h>
            3 #include <stdio.h>
            4 #include "util.h"
            5 
            6 size_t
            7 allocarr(double **arr, const char *str, size_t maxlen)
            8 {
            9         size_t i, nf = 0;
           10 
           11         if (maxlen > 0)
           12                 nf = 1;
           13         for (i = 0; i < maxlen && str[i] != '\0'; i++)
           14                 if (str[i] == DELIM)
           15                         nf++;
           16         if (!(*arr = calloc(nf, sizeof(double))))
           17                 err(1, "calloc");
           18 
           19         return nf;
           20 }
           21 
           22 int
           23 scannextval(char **str, double *val)
           24 {
           25         int offset;
           26 
           27         if (sscanf(*str, "%lg%n", val, &offset) != 1)
           28                 return 0;
           29         *str += offset;
           30 
           31         return 1;
           32 }
           33 
           34 void
           35 printarr(double *arr, size_t len)
           36 {
           37         size_t i;
           38 
           39         for (i = 0; i < len; i++) {
           40                 printf("%.17g", arr[i]);
           41                 if (i < len)
           42                         printf(DELIMSTR);
           43         }
           44         putchar('\n');
           45 }
           46 
           47 void
           48 printfarr(char *delimstr, int prec, double *arr, size_t len)
           49 {
           50         size_t i;
           51 
           52         for (i = 0; i < len; i++) {
           53                 printf("%.*g", prec, arr[i]);
           54                 if (i < len - 1)
           55                         fputs(delimstr, stdout);
           56         }
           57 }
           58 
           59 size_t
           60 fscanmatrix(FILE *stream, double ***arr, size_t *nf)
           61 {
           62         size_t i, nr = 0, linesize = 0;
           63         char *line = NULL, *data = NULL;
           64         double val;
           65 
           66         *arr = calloc(1, sizeof(double *));
           67 
           68         while (getline(&line, &linesize, stream) > 0) {
           69                 if (nr > 0)
           70                         if (!(*arr = xreallocarray(*arr, nr + 1, sizeof(double *))))
           71                                 err(1, "reallocarray");
           72                 if ((*nf = allocarr(&(*arr)[nr], line, linesize)) == 0)
           73                         errx(1, "no fields in input");
           74                 data = line;
           75                 for (i = 0; i < *nf; i++) {
           76                         if (!scannextval(&data, &val))
           77                                 errx(1, "could not parse line %ld, field %ld", nr + 1, i + 1);
           78                         (*arr)[nr][i] = val;
           79                 }
           80                 nr++;
           81         }
           82 
           83         free(line);
           84 
           85         return nr;
           86