double glsadf(double x, double *c, const int m, const int n, double *d) { int i; for (i = 0; i < n; i++) x = poledf(x, c, m, &d[m * i]); return (x); }
int main(int argc, char **argv) { int m = ORDER, fprd = FPERIOD, iprd = IPERIOD, i, j; FILE *fp = stdin, *fpc = NULL; double *c, *inc, *cc, *d, x; Boolean tp = TRANSPOSE, ngain = NGAIN; if ((cmnd = strrchr(argv[0], '/')) == NULL) cmnd = argv[0]; else cmnd++; while (--argc) if (**++argv == '-') { switch (*(*argv + 1)) { case 'm': m = atoi(*++argv); --argc; break; case 'p': fprd = atoi(*++argv); --argc; break; case 'i': iprd = atoi(*++argv); --argc; break; case 't': tp = 1 - tp; break; case 'k': ngain = 1 - ngain; break; case 'h': usage(0); default: fprintf(stderr, "%s : Invalid option '%c'!\n", cmnd, *(*argv + 1)); usage(1); } } else if (fpc == NULL) fpc = getfp(*argv, "rb"); else fp = getfp(*argv, "rb"); if (fpc == NULL) { fprintf(stderr, "%s : Cannot open coefficients file!\n", cmnd); return (1); } if (m < 0) { fprintf(stderr, "%s : Order must be equal to or greater than zero!\n", cmnd); return (1); } c = dgetmem(m + m + m + 3 + m); cc = c + m + 1; inc = cc + m + 1; d = inc + m + 1; if (freadf(c, sizeof(*c), m + 1, fpc) != m + 1) return (1); for (;;) { if (freadf(cc, sizeof(*cc), m + 1, fpc) != m + 1) return (0); for (i = 0; i <= m; i++) inc[i] = (cc[i] - c[i]) * iprd / fprd; for (j = fprd, i = (iprd + 1) / 2; j--;) { if (freadf(&x, sizeof(x), 1, fp) != 1) return (0); if (!ngain) x *= c[0]; if (m > 0) { if (!tp) x = poledf(x, c, m, d); else x = poledft(x, c, m, d); } fwritef(&x, sizeof(x), 1, stdout); if (!--i) { for (i = 0; i <= m; i++) c[i] += inc[i]; i = iprd; } } movem(cc, c, sizeof(*cc), m + 1); } return (0); }