Mercurial > forge
diff extra/engine/engGetFull.c @ 0:6b33357c7561 octave-forge
Initial revision
author | pkienzle |
---|---|
date | Wed, 10 Oct 2001 19:54:49 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/extra/engine/engGetFull.c Wed Oct 10 19:54:49 2001 +0000 @@ -0,0 +1,153 @@ +#include <stdio.h> +#include <sys/time.h> +#include <sys/types.h> +#include <unistd.h> +#include <string.h> +#include "engine.h" +#include "engif.h" + +extern int matopen; + +#define GETSTR "save -ascii \"-\"\n" + +/* Improvement: It would be more efficient to use a binary format */ + +int engGetFull( Engine *ep, char *name, int *m, int *n, + double **pr, double **pi ) +{ + int i, j, retval; + char buf[BUFMAX]; + char comm, *ptr, str1[BUFMAX], str2[BUFMAX], str3[BUFMAX]; + +#ifdef DEBUGAPI + fprintf( stdout, "Begin engGetFull ...\n" ); + fflush( stdout ); +#endif + + retval = 1; + if( matopen ) + { + flushjunk(); + sprintf( buf, "exist(\"%s\")\n", name ); + putline( buf ); + getline( buf ); + flushprompt( 0 ); + sscanf( buf, " ans = %d", &i ); + + if( i == 1 ) + { + sprintf( buf, "save -ascii \"-\" %s\n", name ); + putline( buf ); + + getline( buf ); + sscanf( buf, "%c %s %s", &comm, str1, str2 ); + if( comm != '#' ) + return retval; + if( !strcmp( "Created", str1 ) ) /* New in Octave 2.0.14 */ + { + getline( buf ); + sscanf( buf, "%c %s %s", &comm, str1, str2 ); + } + if( strcmp( "name:", str1 ) ) + return retval; + if( strcmp( name, str2 ) ) + return retval; + getline( buf ); + sscanf( buf, "%c %s %s %s", &comm, str1, str2, str3 ); + if( comm != '#' ) + return retval; + if( strcmp( "type:", str1 ) ) + return retval; + if( !strcmp( "complex", str2 ) ) /* Complex data type */ + { + if( !strcmp( "scalar", str3 ) ) + { + *m = 1; + *n = 1; + *pr = mxCalloc( 1, sizeof( **pr ) ); + *pi = mxCalloc( 1, sizeof( **pi ) ); + getline( buf ); + sscanf( buf, "(%lf,%lf)", &pr[0][0], &pi[0][0] ); + } + else + { + if( !strcmp( "matrix", str3 ) ) + { + getline( buf ); + sscanf( buf, "%c %s %d", &comm, str1, m ); + if( strcmp( "rows:", str1 ) ) + return retval; + getline( buf ); + sscanf( buf, "%c %s %d", &comm, str1, n ); + if( strcmp( "columns:", str1 ) ) + return retval; + *pr = mxCalloc( (*m)*(*n), sizeof( **pr ) ); + *pi = mxCalloc( (*m)*(*n), sizeof( **pi ) ); + for( i=0; i<*m; i++ ) + { + getline( buf ); + ptr = strtok( buf, " " ); + for( j=0; j<*n; j++ ) + { + sscanf( ptr, "(%lf,%lf)", (*pr)+j*(*m)+i, (*pi)+j*(*m)+i ); + ptr = strtok( NULL, " " ); + } + } + } + else + return retval; + } + } + else /* Real data type */ + { + if( !strcmp( "scalar", str2 ) ) + { + *m = 1; + *n = 1; + *pr = mxCalloc( 1, sizeof( **pr ) ); + *pi = NULL; + getline( buf ); + sscanf( buf, "%lf", &pr[0][0] ); + } + else + { + if( !strcmp( "matrix", str2 ) ) + { + getline( buf ); + sscanf( buf, "%c %s %d", &comm, str1, m ); + if( strcmp( "rows:", str1 ) ) + return retval; + getline( buf ); + sscanf( buf, "%c %s %d", &comm, str1, n ); + if( strcmp( "columns:", str1 ) ) + return retval; + *pr = mxCalloc( (*m)*(*n), sizeof( **pr ) ); + *pi = NULL; + for( i=0; i<*m; i++ ) + { + getline( buf ); + ptr = strtok( buf, " " ); + for( j=0; j<*n; j++ ) + { + sscanf( ptr, "%lf", *pr+j*(*m)+i ); + ptr = strtok( NULL, " " ); + } + } + } + else + return retval; + } + } + retval = 0; + flushprompt( 0 ); + } /* if variable exists */ + + } /* if( matopen ) */ + +#ifdef DEBUGAPI + fprintf( stdout, "Exit engGetFull with status %d\n", retval ); + fflush( stdout ); +#endif + + return retval; +}