function opoutsize = FA_SZ_OPPLUS(in1size,in2size,in1type,in2type)
// function opoutsize = FA_SZ_OPPLUS(in1size,in2size,in1type,in2type)
// -----------------------------------------------------------------
// Returns the size of the output computed by OPPLUS operator,
// including the string operations.
//
// Assuming:
// size(in1) = [in1r,in1c]
// size(in2) = [in2r,in2c]
// size(out) = [outr,outc]
//
// we have the following combinations:
// in1   in2   outr   outc
// -----------------------
//  S     S    in2r   in2c
//  S     M    in2r   in2c
//  M     S    in1r   in1c
//  M     M    in1r   in1c
//
// Where S means that the input is a scalar
// and M means that the input is a matrix.
// There is also the case related to the string catenation!
// This is the main difference between - and + operators.
//
// Input data:
// in1size: size of input number 1. It is an array of 2 strings.
//          The first string specifies the number of rows.
//          The second string specifies the number of columns.
//
// in2size: size of input number 2. It is an array of 2 strings.
//          The first string specifies the number of rows.
//          The second string specifies the number of columns.
//
// Output data:
// opoutsize: size of output. It is an array of 2 strings.
//            The first string specifies the number of rows.
//            The second string specifies the number of columns.
//
// Status:
// 08-Dec-2007 -- Raffaele Nutricato: Author.
// 08-Dec-2007 -- Alberto Morea: Test Ok.
//
// Copyright 2007 Raffaele Nutricato & Alberto Morea.
// Contact: raffaele.nutricato@tiscali.it
// -----------------------------------------------------------------

// ------------------------------
// --- Check input arguments. ---
// ------------------------------
SCI2CNInArgCheck(argn(2),4,4);

// ------------------------
// --- Generate Output. ---
// ------------------------
// --- Get dimensions of input arguments. ---
disp(in1type,'in1type before casting : ');
disp(type(in1type),'in1type before casting using type function : ');
disp(in2type,'in2type before casting  : ');
disp(type(in2type),'in2type is before casting using type function : ');
disp(in1size,'in1size before casting : ');
disp(size(in1size),'in1size before casting using size funcion : ');
disp(in2size,'in2size before casting : ')
disp(size(in2size),'in2size before casting using size function : ');
in1size = string(in1size);
in2size = string(in2size);
in1type = string(in1type);
in2type = string(in2type);
disp(in1type,'in1type After casting : ');
disp(type(in1type),'in1type After casting using type function : ');
disp(in2type,'in2type After casting : ');
disp(type(in2type),'in2type After casting using type function : ');
disp(in1size,'in1size After casting : ');
disp(size(in1size),'in1size After casting using size funcion : ');
disp(in2size,'in2size After casting : ')
disp(size(in2size),'in2size After casting using size function : ');
in1dim = GetSymbolDimension(in1size);
in2dim = GetSymbolDimension(in2size);
disp(in1dim,'in1dimension is : ');
disp(in2dim,'in2dimension is : ');
if ((in1type ~= 'g') & (in2type ~= 'g'))
   disp("Inside 1st if condition");
   opoutsize = FA_SZ_OPPLUSA(in1size,in2size);
   disp(opoutsize,'Opoutsize in 1st if condition is : ');
disp("Going to 1st elseif statement");
elseif ((in1type == 'g') & (in2type == 'g'))
   disp("Inside to elseif statement");
   opoutsize(1) = '1';
   disp(opoutsize(1),"oputsize(1) is : ")
   if (isnum(in1size(1)) & isnum(in2size(1)))
      disp("Inside 2nd if condition");
      in1num = eval(in1size(1));
      disp(in1num,"in1num is in 2nd if  : ");
      in2num = eval(in2size(1));
      disp(in2num,"in2num is in 2nd if : ");
      if (in1num > 1 & in2num > 1)
         disp("Inside 3rd if condition");
         error(9999, 'String catenation can be performed only on strings of 1 x N size not N x 1 size');
         //NUT: mi pare che non possano proprio esistere stringe di dimensione Nx1 perche' in
         //NUT: scilab esiste il tipo string che e' di size 1x1 e sono io a trasformarlo in
         //NUT: 1xN per cui se uso sempre questa convenzione non sbaglio mai.
         //NUT: ho provato in scilab a fare la trasposta di una stringa e ottengo sempre 1x1.
         disp("End of 3rd if condition");
      end
   disp("End of 2nd if condition");
   end
   if (isnum(in1size(2)) & isnum(in2size(2)))
      disp("Inside 4th if condition");
      in1num = eval(in1size(2));
      disp(in1num,"in1num is in 4th if : ");
      in2num = eval(in2size(2));
      disp(in2num,"in2num is in 4th if : ");
      opoutsize(2) = string(in1num+in2num-1);
      disp(opoutsize(2),"Final Oputsize(2)  without casting to String : ");
      if isnan(opoutsize(2))
         disp("Inside 5th if condition");
         opoutsize(2) = '__SCI2CNANSIZE';
         disp(opoutsize(2),"Opoutsize(2) is when it is not a Number : ");  
      else
         opoutsize(2) = string(opoutsize(2));
         disp(opoutsize(2),"Opoutsize(2) is casting to String : ");
      end
      disp("Outside of 5th if condition");
   else
      opoutsize(2) = '('+string(in1size(2))+'+'+string(in2size(2))+'-1)';
      disp(opoutsize(2),"Final Opoutsize(2) casting to String :  ")
   end
   disp("Outside 4th if condition");
disp("Going to Inside 2nd elseif condition");

elseif (in2type == 'g')
    disp("Inside 4th elseif condition");
    if (isnum(in2size(2)))
        disp(in2size(2),"in2size(2) is inside 1st if of 4th elseif : ");
        if(in2size(2) == 3)
            in1num = eval(in1size(2));
            opoutsize(2) = string(in1num);
            #opoutsize = string(in1num);
            disp(opoutsize,"opoutsize inside 1st If condition of 4th elseif : ");
        else
            in2num = eval(in1size(1));
            opoutsize(1) = string(in2num);
            #opoutsize = in2num;
            disp(opoutsize,"opoutsize inside 1st Else condition of 4th elseif : ");
        end
     disp("OutSide of 1st if condition of 4th elseif");
    
    else
        disp("Inside else condition of 4th else")
        if(in2size(2) == 3)
           opoutsize(2) = '('+string(in1size(2))+')';
           disp(opoutsize(2),"Final Opoutsize(2) is not a number :  ")
        else
           opoutsize(1) = '('+string(in1size(1))+')';
           disp(opoutsize(1),"Final Opoutsize(1) is not a number :  ")
        end
   end
else
   error(9999, 'Unexpected type combination for ""+"" operator (type1,type2): ('+in1type+in2type+').');
end

endfunction