diff options
author | rupak | 2019-10-10 12:57:46 +0530 |
---|---|---|
committer | rupak | 2019-10-10 12:57:46 +0530 |
commit | ac01f75eaa0475879647e8c6e1343e4c49d7c18c (patch) | |
tree | ceefa71219ca3021f572323b6f0217e0f8fab93b /sci_gateway/cpp/sci_octave.cpp | |
parent | 999122e511f5f2cabdff0bb26908db4e57dfcee2 (diff) | |
download | fossee-scilab-octave-toolbox-ac01f75eaa0475879647e8c6e1343e4c49d7c18c.tar.gz fossee-scilab-octave-toolbox-ac01f75eaa0475879647e8c6e1343e4c49d7c18c.tar.bz2 fossee-scilab-octave-toolbox-ac01f75eaa0475879647e8c6e1343e4c49d7c18c.zip |
added help for toolbox
Diffstat (limited to 'sci_gateway/cpp/sci_octave.cpp')
-rw-r--r-- | sci_gateway/cpp/sci_octave.cpp | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/sci_gateway/cpp/sci_octave.cpp b/sci_gateway/cpp/sci_octave.cpp new file mode 100644 index 0000000..0e9c228 --- /dev/null +++ b/sci_gateway/cpp/sci_octave.cpp @@ -0,0 +1,217 @@ +#include <string> +#include "wchar.h" +#include <cstdlib> + +extern "C" +{ +#include<Scierror.h> +#include<sciprint.h> +#include<api_scilab.h> +#include "localization.h" +#include "fun.h" +#include <cstdio> +#include <math.h> +#include <stdio.h> +#include "os_string.h" +#include <stdlib.h> + + + +static const char fname[] = "octave_fun"; +int sci_octave_fun(scilabEnv env, int nin, scilabVar* in, int nopt, scilabOpt* opt, int nout, scilabVar* out) + +{ +//printf("nin: %d\n", nin); + if (nin < 2) + { + Scierror(999, _("%s: Wrong number of input arguments. Atleast %d expected.\n"), fname, 2); + return STATUS_ERROR; + } + + FUNCCALL funcall; + FUNCCALL *funptr = &funcall; + funcall.n_in_arguments = nin; + funcall.n_out_user = nout; + + FUNCARGS ins[funcall.n_in_arguments*nout]; + FUNCARGS *argptr = ins; + + int i,j; + double* d; + double* rd; + double* cd; + int size; + char str[20]; + char* c; + double* n = NULL; + int row = 0; + int col = 0; + double* in_real; + double* in_img; + + for(i=0;i<nin;i++) + { + if(scilab_getType(env, in[i])==1) + { + ins[i].type = TYPE_DOUBLE; + if(scilab_isComplex(env, in[i])==1) + { + ins[i].is_in_cmplx=1; + size = scilab_getDim2d(env, in[i], &row, &col); + ins[i].n_in_rows = row; + ins[i].n_in_cols = col; + scilab_getDoubleComplexArray(env, in[0],&in_real, &in_img); + + ins[i].in_data_real = malloc(sizeof(double)*size); + ins[i].in_data_img = malloc(sizeof(double)*size); + rd = (double *)ins[i].in_data_real; + cd = (double *)ins[i].in_data_img; + + ////This code snippet is to flatten matrix row wise and then store it + int p,q,k = 0; + for(p=0;p<row;p++) + { + for(q=0;q<col;q++) + { + rd[k] = in_real[p + q*row]; + cd[k] = in_img[p + q*row]; + k++; + //printf("%f\n",d[j]); + } + } + } + else + { + ins[i].is_in_cmplx=0; + size = scilab_getDim2d(env, in[i], &row, &col); + ins[i].n_in_rows = row; + ins[i].n_in_cols = col; + scilab_getDoubleArray(env, in[i], &n); + + ins[i].in_data_real = malloc(sizeof(double)*size); + d = (double *)ins[i].in_data_real; + + ////This code snippet is to flatten matrix row wise and then store it + int p,q,k = 0; + for(p=0;p<row;p++) + { + for(q=0;q<col;q++) + { + d[k] = n[p + q*row]; + k++; + //printf("%f\n",d[j]); + } + } + } +///////////////////////////////////////// + } + else if(scilab_getType(env, in[i])==10) + { + ins[i].is_in_cmplx=0; + wchar_t* in1 = 0; + + scilab_getString(env, in[i], &in1); + //printf("%S\n", in1); + + wcstombs(str, in1, sizeof(str)); + //printf("%s\n", str); + if(str) + { + //printf("lenght of string input: %d\n", strlen(str)); + ins[i].type = TYPE_STRING; + ins[i].n_in_rows = 1; + ins[i].n_in_cols = strlen(str); + size = (ins[i].n_in_rows)*(ins[i].n_in_cols); + ins[i].in_data_real = malloc(sizeof(char)*size+1); + c = (char *)ins[i].in_data_real; + int ci; + + strcpy(c,str); + ins[i].n_in_cols = strlen(c); + //printf("in scilab strin is: %s\n", c); + + } + } + } + + int status_fun = fun(argptr, funptr); + //printf("in scilab status_fun is: %d\n", status_fun); + //printf("in scilab funcall.n_out_arguments is: %d\n", funcall.n_out_arguments); + //printf("in scilab funcall.n_out_user is: %d\n", funcall.n_out_user); +//printf("in scilab ins[0].n_out_rows is: %d\n", ins[0].n_out_rows); +//printf("in scilab ins[0].n_out_cols is: %d\n", ins[0].n_out_cols); + + +//printf("in scilab ouput args are: %d\n", funcall.n_out_arguments); + if(status_fun==1) + { + Scierror(999, "\nOctave unable to process!\nCorrect usage:\n octave_fun(\"octave_function\",input1,input2,...)\n octave_fun(\"octave_function\",input1,input2,...,optional_input1,optional_input2,...)\n octave_fun(\"octave_function\",\"octave_package\",input1,input2,...)\n octave_fun(\"octave_function\",\"octave_package\",input1,input2,...,optional_input1,optional_input2,...)\n"); + return 1; + } + else if(funcall.n_out_user <= funcall.n_out_arguments) + { + for(i=0;i<nout;i++) + { + + if(ins[i].is_out_cmplx==1) + { + out[i] = scilab_createDoubleMatrix2d(env, ins[i].n_out_rows, ins[i].n_out_cols, 1); + double* out_real = NULL; + double* out_img = NULL; + scilab_getDoubleComplexArray(env, out[i],&out_real, &out_img); + int len = ins[i].n_out_rows*ins[i].n_out_cols; + double* ord = (double *)ins[i].out_data_real; + double* ocd = (double *)ins[i].out_data_img; + //printf("output length is: %d\n", len); + for(j=0; j<len; j++) + { + out_real[j] = ord[j]; + } + + for(j=0; j<len; j++) + { + out_img[j] = ocd[j]; + } + } + else + { + out[i] = scilab_createDoubleMatrix2d(env, ins[i].n_out_rows, ins[i].n_out_cols, 0); + double* out1 = NULL; + scilab_getDoubleArray(env, out[i], &out1); + int len = ins[i].n_out_rows*ins[i].n_out_cols; + double* dd = (double *)ins[i].out_data_real; + //printf("output length is: %d\n", len); + for(j=0; j<len; j++) + { + out1[j] = dd[j];//.float_value(); + } + } + } + } + else + { + Scierror(77, _("%s: Wrong number of output arguments: This function can return a maximum of %d output(s).\n"), fname, funcall.n_out_arguments); + return 1; + } + + + + + for(i=0;i<nout;i++) + { + free(ins[i].out_data_real); + + if(ins[i].is_out_cmplx==1) + free(ins[i].out_data_img); + } + + for(i=0;i<nin;i++) + { + free(ins[i].in_data_real); + + if(ins[i].is_in_cmplx==1) + free(ins[i].in_data_img); + } + return 0; +} +} |