Introduction
Introduction Statistics Contact Development Disclaimer Help
tutil.c - numtools - perform numerical operations on vectors and matrices in un…
git clone git://src.adamsgaard.dk/numtools
Log
Files
Refs
README
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(…
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…
78 (*arr)[nr][i] = val;
79 }
80 nr++;
81 }
82
83 free(line);
84
85 return nr;
86
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.