numtools

perform numerical operations on vectors and matrices in unix pipes
git clone git://src.adamsgaard.dk/numtools # fast
git clone https://src.adamsgaard.dk/numtools.git # slow
Log | Files | Refs | README | LICENSE Back to index

commit e6a23d29b0e98397210e40824f9f37929eb60c2b
parent 5b24cf0f0de9c6d52fa609cb59e025d2706e2e7e
Author: Anders Damsgaard <anders@adamsgaard.dk>
Date:   Sun, 12 Sep 2021 07:16:51 +0200

add missing transpose.c

Diffstat:
Atranspose.c | 48++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 48 insertions(+), 0 deletions(-)

diff --git a/transpose.c b/transpose.c @@ -0,0 +1,48 @@ +#include <err.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "util.h" + +int +main(void) +{ + size_t i = 0, j = 0, nf = 0, nr = 0, linesize = 0; + char *line = NULL, *data = NULL; + double val, **vals = NULL; + + if (pledge("stdio", NULL) == -1) + err(2, "pledge"); + + vals = calloc(1, sizeof(double *)); + while (getline(&line, &linesize, stdin) > 0) { + if (nr > 0) + if (!(vals = xreallocarray(vals, nr + 1, sizeof(double *)))) + err(1, "reallocarray"); + if ((nf = allocarr(&vals[nr], line, linesize)) == 0) + errx(1, "no fields in input"); + data = line; + for (i = 0; i < nf; i++) { + if (!scannextval(&data, &val)) + errx(1, "could not parse line %ld, field %ld", nr + 1, i + 1); + vals[nr][i] = val; + } + nr++; + } + for (i = 0; i < nf; i++) { + for (j = 0; j < nr; j++) { + printf("%g", vals[j][i]); + if (j < nr - 1) + printf(DELIMSTR); + } + puts(""); + } + + free(line); + for (i = 0; i < nr; i++) + free(vals[i]); + free(vals); + + return 0; +}