home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 22 gnu
/
22-gnu.zip
/
mesch12a.zip
/
zmatio.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-01-13
|
11KB
|
401 lines
/**************************************************************************
**
** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved.
**
** Meschach Library
**
** This Meschach Library is provided "as is" without any express
** or implied warranty of any kind with respect to this software.
** In particular the authors shall not be liable for any direct,
** indirect, special, incidental or consequential damages arising
** in any way from use of the software.
**
** Everyone is granted permission to copy, modify and redistribute this
** Meschach Library, provided:
** 1. All copies contain this copyright notice.
** 2. All modified copies shall carry a notice stating who
** made the last modification and the date of such modification.
** 3. No charge is made for this software or works derived from it.
** This clause shall not be construed as constraining other software
** distributed on the same medium as this software, nor is a
** distribution fee considered a charge.
**
***************************************************************************/
#include <stdio.h>
#include <ctype.h>
#include "zmatrix.h"
static char rcsid[] = "$Id: zmatio.c,v 1.1 1994/01/13 04:25:18 des Exp $";
/* local variables */
static char line[MAXLINE];
/**************************************************************************
Input routines
**************************************************************************/
complex z_finput(fp)
FILE *fp;
{
int io_code;
complex z;
skipjunk(fp);
if ( isatty(fileno(fp)) )
{
do {
fprintf(stderr,"real and imag parts: ");
if ( fgets(line,MAXLINE,fp) == NULL )
error(E_EOF,"z_finput");
#if REAL == DOUBLE
io_code = sscanf(line,"%lf%lf",&z.re,&z.im);
#elif REAL == FLOAT
io_code = sscanf(line,"%f%f",&z.re,&z.im);
#endif
} while ( io_code != 2 );
}
else
#if REAL == DOUBLE
if ( (io_code=fscanf(fp," (%lf,%lf)",&z.re,&z.im)) < 2 )
#elif REAL == FLOAT
if ( (io_code=fscanf(fp," (%f,%f)",&z.re,&z.im)) < 2 )
#endif
error((io_code == EOF) ? E_EOF : E_FORMAT,"z_finput");
return z;
}
ZMAT *zm_finput(fp,a)
FILE *fp;
ZMAT *a;
{
ZMAT *izm_finput(),*bzm_finput();
if ( isatty(fileno(fp)) )
return izm_finput(fp,a);
else
return bzm_finput(fp,a);
}
/* izm_finput -- interactive input of matrix */
ZMAT *izm_finput(fp,mat)
FILE *fp;
ZMAT *mat;
{
char c;
u_int i, j, m, n, dynamic;
/* dynamic set to TRUE if memory allocated here */
/* get matrix size */
if ( mat != ZMNULL && mat->m<MAXDIM && mat->n<MAXDIM )
{ m = mat->m; n = mat->n; dynamic = FALSE; }
else
{
dynamic = TRUE;
do
{
fprintf(stderr,"ComplexMatrix: rows cols:");
if ( fgets(line,MAXLINE,fp)==NULL )
error(E_INPUT,"izm_finput");
} while ( sscanf(line,"%u%u",&m,&n)<2 || m>MAXDIM || n>MAXDIM );
mat = zm_get(m,n);
}
/* input elements */
for ( i=0; i<m; i++ )
{
redo:
fprintf(stderr,"row %u:\n",i);
for ( j=0; j<n; j++ )
do
{
redo2:
fprintf(stderr,"entry (%u,%u): ",i,j);
if ( !dynamic )
fprintf(stderr,"old (%14.9g,%14.9g) new: ",
mat->me[i][j].re,mat->me[i][j].im);
if ( fgets(line,MAXLINE,fp)==NULL )
error(E_INPUT,"izm_finput");
if ( (*line == 'b' || *line == 'B') && j > 0 )
{ j--; dynamic = FALSE; goto redo2; }
if ( (*line == 'f' || *line == 'F') && j < n-1 )
{ j++; dynamic = FALSE; goto redo2; }
} while ( *line=='\0' ||
#if REAL == DOUBLE
sscanf(line,"%lf%lf",
#elif REAL == FLOAT
sscanf(line,"%f%f",
#endif
&mat->me[i][j].re,&mat->me[i][j].im)<1 );
fprintf(stderr,"Continue: ");
fscanf(fp,"%c",&c);
if ( c == 'n' || c == 'N' )
{ dynamic = FALSE; goto redo; }
if ( (c == 'b' || c == 'B') /* && i > 0 */ )
{ if ( i > 0 )
i--;
dynamic = FALSE; goto redo;
}
}
return (mat);
}
/* bzm_finput -- batch-file input of matrix */
ZMAT *bzm_finput(fp,mat)
FILE *fp;
ZMAT *mat;
{
u_int i,j,m,n,dummy;
int io_code;
/* get dimension */
skipjunk(fp);
if ((io_code=fscanf(fp," ComplexMatrix: %u by %u",&m,&n)) < 2 ||
m>MAXDIM || n>MAXDIM )
error(io_code==EOF ? E_EOF : E_FORMAT,"bzm_finput");
/* allocate memory if necessary */
if ( mat==ZMNULL || mat->m<m || mat->n<n )
mat = zm_resize(mat,m,n);
/* get entries */
for ( i=0; i<m; i++ )
{
skipjunk(fp);
if ( fscanf(fp," row %u:",&dummy) < 1 )
error(E_FORMAT,"bzm_finput");
for ( j=0; j<n; j++ )
{
/* printf("bzm_finput: j = %d\n", j); */
#if REAL == DOUBLE
if ((io_code=fscanf(fp," ( %lf , %lf )",
#elif REAL == FLOAT
if ((io_code=fscanf(fp," ( %f , %f )",
#endif
&mat->me[i][j].re,&mat->me[i][j].im)) < 2 )
error(io_code==EOF ? E_EOF : E_FORMAT,"bzm_finput");
}
}
return (mat);
}
ZVEC *zv_finput(fp,x)
FILE *fp;
ZVEC *x;
{
ZVEC *izv_finput(),*bzv_finput();
if ( isatty(fileno(fp)) )
return izv_finput(fp,x);
else
return bzv_finput(fp,x);
}
/* izv_finput -- interactive input of vector */
ZVEC *izv_finput(fp,vec)
FILE *fp;
ZVEC *vec;
{
u_int i,dim,dynamic; /* dynamic set if memory allocated here */
/* get vector dimension */
if ( vec != ZVNULL && vec->dim<MAXDIM )
{ dim = vec->dim; dynamic = FALSE; }
else
{
dynamic = TRUE;
do
{
fprintf(stderr,"ComplexVector: dim: ");
if ( fgets(line,MAXLINE,fp)==NULL )
error(E_INPUT,"izv_finput");
} while ( sscanf(line,"%u",&dim)<1 || dim>MAXDIM );
vec = zv_get(dim);
}
/* input elements */
for ( i=0; i<dim; i++ )
do
{
redo:
fprintf(stderr,"entry %u: ",i);
if ( !dynamic )
fprintf(stderr,"old (%14.9g,%14.9g) new: ",
vec->ve[i].re,vec->ve[i].im);
if ( fgets(line,MAXLINE,fp)==NULL )
error(E_INPUT,"izv_finput");
if ( (*line == 'b' || *line == 'B') && i > 0 )
{ i--; dynamic = FALSE; goto redo; }
if ( (*line == 'f' || *line == 'F') && i < dim-1 )
{ i++; dynamic = FALSE; goto redo; }
} while ( *line=='\0' ||
#if REAL == DOUBLE
sscanf(line,"%lf%lf",
#elif REAL == FLOAT
sscanf(line,"%f%f",
#endif
&vec->ve[i].re,&vec->ve[i].im) < 2 );
return (vec);
}
/* bzv_finput -- batch-file input of vector */
ZVEC *bzv_finput(fp,vec)
FILE *fp;
ZVEC *vec;
{
u_int i,dim;
int io_code;
/* get dimension */
skipjunk(fp);
if ((io_code=fscanf(fp," ComplexVector: dim:%u",&dim)) < 1 ||
dim>MAXDIM )
error(io_code==EOF ? 7 : 6,"bzv_finput");
/* allocate memory if necessary */
if ( vec==ZVNULL || vec->dim<dim )
vec = zv_resize(vec,dim);
/* get entries */
skipjunk(fp);
for ( i=0; i<dim; i++ )
#if REAL == DOUBLE
if ((io_code=fscanf(fp," (%lf,%lf)",
#elif REAL == FLOAT
if ((io_code=fscanf(fp," (%f,%f)",
#endif
&vec->ve[i].re,&vec->ve[i].im)) < 2 )
error(io_code==EOF ? 7 : 6,"bzv_finput");
return (vec);
}
/**************************************************************************
Output routines
**************************************************************************/
static char *zformat = " (%14.9g, %14.9g) ";
char *setzformat(f_string)
char *f_string;
{
char *old_f_string;
old_f_string = zformat;
if ( f_string != (char *)NULL && *f_string != '\0' )
zformat = f_string;
return old_f_string;
}
void z_foutput(fp,z)
FILE *fp;
complex z;
{
fprintf(fp,zformat,z.re,z.im);
putc('\n',fp);
}
void zm_foutput(fp,a)
FILE *fp;
ZMAT *a;
{
u_int i, j, tmp;
if ( a == ZMNULL )
{ fprintf(fp,"ComplexMatrix: NULL\n"); return; }
fprintf(fp,"ComplexMatrix: %d by %d\n",a->m,a->n);
if ( a->me == (complex **)NULL )
{ fprintf(fp,"NULL\n"); return; }
for ( i=0; i<a->m; i++ ) /* for each row... */
{
fprintf(fp,"row %u: ",i);
for ( j=0, tmp=1; j<a->n; j++, tmp++ )
{ /* for each col in row... */
fprintf(fp,zformat,a->me[i][j].re,a->me[i][j].im);
if ( ! (tmp % 2) ) putc('\n',fp);
}
if ( tmp % 2 != 1 ) putc('\n',fp);
}
}
void zv_foutput(fp,x)
FILE *fp;
ZVEC *x;
{
u_int i, tmp;
if ( x == ZVNULL )
{ fprintf(fp,"ComplexVector: NULL\n"); return; }
fprintf(fp,"ComplexVector: dim: %d\n",x->dim);
if ( x->ve == (complex *)NULL )
{ fprintf(fp,"NULL\n"); return; }
for ( i=0, tmp=0; i<x->dim; i++, tmp++ )
{
fprintf(fp,zformat,x->ve[i].re,x->ve[i].im);
if ( (tmp % 2) == 1 ) putc('\n',fp);
}
if ( (tmp % 2) != 0 ) putc('\n',fp);
}
void zm_dump(fp,a)
FILE *fp;
ZMAT *a;
{
u_int i, j, tmp;
if ( a == ZMNULL )
{ fprintf(fp,"ComplexMatrix: NULL\n"); return; }
fprintf(fp,"ComplexMatrix: %d by %d @ 0x%lx\n",a->m,a->n,(long)a);
fprintf(fp,"\tmax_m = %d, max_n = %d, max_size = %d\n",
a->max_m, a->max_n, a->max_size);
if ( a->me == (complex **)NULL )
{ fprintf(fp,"NULL\n"); return; }
fprintf(fp,"a->me @ 0x%lx\n",(long)(a->me));
fprintf(fp,"a->base @ 0x%lx\n",(long)(a->base));
for ( i=0; i<a->m; i++ ) /* for each row... */
{
fprintf(fp,"row %u: @ 0x%lx ",i,(long)(a->me[i]));
for ( j=0, tmp=1; j<a->n; j++, tmp++ )
{ /* for each col in row... */
fprintf(fp,zformat,a->me[i][j].re,a->me[i][j].im);
if ( ! (tmp % 2) ) putc('\n',fp);
}
if ( tmp % 2 != 1 ) putc('\n',fp);
}
}
void zv_dump(fp,x)
FILE *fp;
ZVEC *x;
{
u_int i, tmp;
if ( ! x )
{ fprintf(fp,"ComplexVector: NULL\n"); return; }
fprintf(fp,"ComplexVector: dim: %d @ 0x%lx\n",x->dim,(long)(x));
if ( ! x->ve )
{ fprintf(fp,"NULL\n"); return; }
fprintf(fp,"x->ve @ 0x%lx\n",(long)(x->ve));
for ( i=0, tmp=0; i<x->dim; i++, tmp++ )
{
fprintf(fp,zformat,x->ve[i].re,x->ve[i].im);
if ( tmp % 2 == 1 ) putc('\n',fp);
}
if ( tmp % 2 != 0 ) putc('\n',fp);
}