void mgc2sp(double *mgc, const int m, const double a, const double g, double *x, double *y, const int flng) { static double *c = NULL; static int size; if (c == NULL) { c = dgetmem(flng / 2 + 1); size = flng; } if (flng > size) { free(c); c = dgetmem(flng / 2 + 1); size = flng; } mgc2mgc(mgc, m, a, g, c, flng / 2, 0.0, 0.0); c2sp(c, flng / 2, x, y, flng); return; }
int main(int argc, char **argv) { int m1 = ORDER1, m2 = ORDER2, i; double a1 = ALPHA1, a2 = ALPHA2, g1 = GAMMA1, g2 = GAMMA2, *c1, *c2; Boolean norm1 = NORMFLG1, norm2 = NORMFLG2, mulg1 = MULGFLG1, mulg2 = MULGFLG2; FILE *fp = stdin; if ((cmnd = strrchr(argv[0], '/')) == NULL) cmnd = argv[0]; else cmnd++; while (--argc) if (**++argv == '-') { switch (*(*argv + 1)) { case 'm': m1 = atoi(*++argv); --argc; break; case 'M': m2 = atoi(*++argv); --argc; break; case 'a': a1 = atof(*++argv); --argc; break; case 'A': a2 = atof(*++argv); --argc; break; case 'g': g1 = atof(*++argv); --argc; break; case 'c': g1 = atoi(*++argv); --argc; if (g1 < 1) fprintf(stderr, "%s : value of c must be c>=1!\n", cmnd); g1 = -1.0 / g1; break; case 'G': g2 = atof(*++argv); --argc; break; case 'C': g2 = atoi(*++argv); --argc; if (g2 < 1) fprintf(stderr, "%s : value of C must be C>=1!\n", cmnd); g2 = -1.0 / g2; break; case 'n': norm1 = 1 - norm1; break; case 'N': norm2 = 1 - norm2; break; case 'u': mulg1 = 1 - mulg1; break; case 'U': mulg2 = 1 - mulg2; break; case 'h': usage(0); default: fprintf(stderr, "%s : Invalid option '%c'!\n", cmnd, *(*argv + 1)); usage(1); } } else fp = getfp(*argv, "rb"); c1 = dgetmem(m1 + m2 + 2); c2 = c1 + m1 + 1; if (mulg1 && g1 == 0) { fprintf(stderr, "%s : gamma for input mgc coefficients should not equal to 0 if you specify -u option!\n", cmnd); usage(1); } while (freadf(c1, sizeof(*c1), m1 + 1, fp) == m1 + 1) { if (norm1) ignorm(c1, c1, m1, g1); else if (mulg1) c1[0] = (c1[0] - 1.0) / g1; if (mulg1) for (i = m1; i >= 1; i--) c1[i] /= g1; mgc2mgc(c1, m1, a1, g1, c2, m2, a2, g2); if (norm2) gnorm(c2, c2, m2, g2); else if (mulg2) c1[0] = c1[0] * g2 + 1.0; if (mulg2) for (i = m2; i >= 1; i--) c2[i] *= g2; fwritef(c2, sizeof(*c2), m2 + 1, stdout); } return (0); }