#include "mex.h"

/*subroutine computazionale*/
void convec (double *xr, double *xi, int nx, double *yr, double *yi, int ny, double *zr, double *zi) {
	int i, j;
	zr[0]=0.0;
	zi[0]=0.0;
	/*Convoluzione di vettori complessi*/
	for (i=0;i<nx;i++) {
		for (j=0;j<ny;j++) {
			*(zr+i+j) = *(zr+i+j) + *(xr+i) * *(yr+j) - *(xi+i) * *(yi+j);
			*(zi+i+j) = *(zi+i+j) + *(xr+i) * *(yi+j) + *(xi+i) * *(yr+j);
			}
		}
	}
	
/*la gateway routine*/
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
	double *xr, *xi, *yr, *yi, *zr, *zi;
	int rows, cols, nx, ny;
	/*Controlla il corretto numero di argomenti*/
	if (nrhs!=2) mexErrMsgTxt("Due input richiesti");
	if (nlhs>1) mexErrMsgTxt("Troppi argomenti in output!");
	/*Controlla che entrambi gli input siano vettori riga*/
	if (mxGetM(prhs[0])!=1 || mxGetM(prhs[1])!=1) mexErrMsgTxt("Entrambi gli input devono essere dei vettori riga");
	/*Controlla che entrambi gli input siano complessi*/
	if(!mxIsComplex(prhs[0]) || !mxIsComplex(prhs[1])) mexErrMsgTxt("Gli input devono essere complessi");
	/*Ottiene la lunghezza di ogni vettore di input*/
	nx = mxGetN(prhs[0]);
	ny = mxGetN(prhs[1]);
	/*Ottiene puntatori alle parti reali e immaginari degli input*/
	xr = mxGetPr(prhs[0]); 
	xi = mxGetPi(prhs[0]);
	yr = mxGetPr(prhs[1]);
	yi = mxGetPi(prhs[1]);
	/*Crea un nuovo array e posiziona il puntatore di output su di esso*/
	cols = nx + ny -1;
	plhs[0] = mxCreateDoubleMatrix(rows, cols, mxCOMPLEX);
	zr = mxGetPr(plhs[0]);
	zi = mxGetPi(plhs[0]);
	/*Chiama la subroutine C*/
	convec(xr, xi, nx, yr, yi, ny, zr, zi);
	return;
	}
	

