// Copyright (C) 2017 - IIT Bombay - FOSSEE

// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
// Author: Yash Pratap Singh Tomar
// Organization: FOSSEE, IIT Bombay
// Email: toolbox@scilab.in

//This function creates and compares the list of functions used in scilab code to existing function list from getallSources
function Required_addrs = get_rquird_fnctns(Standalone_files,Arduino_files,SharedInfo)
 Required_stdalon_indx = 1;
 Required_ardno_indx = 1;
 x = 1;
 y = 1;

//Creating lists for stanalone C file and function
//Some C files don't have their function name directory. So their address is being shifted to last of the list  
 Standalone_files_1 = Standalone_files;
// Standalone_files_extras(1) = Standalone_files_1(76);
// Standalone_files_extras(2) = Standalone_files_1(77);
// Standalone_files_extras(3) = Standalone_files_1(1009);
// Standalone_files_extras(4) = Standalone_files_1(1010);
// Standalone_files_extras(5) = Standalone_files_1(1011);
// Standalone_files_extras(6) = Standalone_files_1(1012);
// Standalone_files_1(1012) = [];
// Standalone_files_1(1011) = [];
// Standalone_files_1(1010) = [];
// Standalone_files_1(1009) = [];
// Standalone_files_1(77) = [];
// Standalone_files_1(76) = [];

//calculating the total no. of standalone files
 No_of_stdalon_files = size(Standalone_files_1);
 No_of_stdalon_files = No_of_stdalon_files(1);

//This for loop is to extract function name list from address list 
 for index=1:No_of_stdalon_files 
     K = strsplit(Standalone_files_1(index),"/");
     soK = size(K);
     soK = soK(1);
     Standalone_files_folders(index) = K((soK-1));
     Standalone_C_files(index) = K(soK);
     Standalone_C_files(index) = strtok(Standalone_C_files(index),".");
 end

//Here, it adds the functions to the list which were earlier removed to shift to the end  
 //for index=1:6
 //    K = strsplit(Standalone_files_extras(index),"/");
 //    Standalone_files_folders(No_of_stdalon_files+index) = K(3);
 //    Standalone_C_files(No_of_stdalon_files+index) = K(4);
 //    Standalone_files_1(No_of_stdalon_files+index)= Standalone_files_extras(index);
//     Standalone_C_files(No_of_stdalon_files+index) = strtok(Standalone_C_files(No_of_stdalon_files+index),".");
// end

//Following similar procedure for Arduino
 Arduino_files_1 = Arduino_files;
 No_of_ardno_files = size(Arduino_files_1);
 No_of_ardno_files = No_of_ardno_files(1);
 for index=1:No_of_ardno_files 
     K = strsplit(Arduino_files_1(index),"/");
     soK = size(K);
     soK = soK(1);
     Arduino_files_folders(index) = K((soK-1));
     Arduino_C_files(index) = K(soK);
     Arduino_C_files(index) = strtok(Arduino_C_files(index),".");
 end

//comparing
//this compares the list of functions used in scilab file to the created standalone C files and function list 
 for index = 1:SharedInfo.Function_list_index
      for k = 1:No_of_stdalon_files
 	  if SharedInfo.Function_list(index) == Standalone_files_folders(k)
            Required_fnctn_stdalon(Required_stdalon_indx) = k;
	    Required_fnctn_stdlon_f(x) = Standalone_C_files(k);
	    x = x+1;
           Required_stdalon_indx = Required_stdalon_indx + 1;
          end
      end
 end
 if x == 1
    Required_fnctn_stdlon_f = [];
 end
//this compares the list of functions used in scilab file to the created Arduino files and function list         
Required_stdalon_indx = Required_stdalon_indx - 1;

  for index = 1:SharedInfo.Function_list_index
      for k = 1:No_of_ardno_files
 	  if SharedInfo.Function_list(index) == Arduino_files_folders(k);
            Required_fnctn_ardno(Required_ardno_indx) = k;
            Required_fnctn_ardno_f(y) = Arduino_C_files(k);
	    y = y+1;
           Required_ardno_indx = Required_ardno_indx + 1;
          end
      end
  end

 Required_ardno_indx = Required_ardno_indx - 1;
//Calling Scilab2CDeps structure
 scilab2ccode = Scilab2CDeps();
//Looking for the depencies of the C files used on other files 
 for index = 1:Required_stdalon_indx
     call = "scilab2ccode.deps." + Standalone_C_files(Required_fnctn_stdalon(index));
     call_val = eval(call);
     Required_fnctn_stdlon_f = cat(1,Required_fnctn_stdlon_f,(call_val)');
 end

 Required_fnctn_stdlon_f = unique(Required_fnctn_stdlon_f);

//Looking for the depencies of the Arduino files used on other C or Arduino files 
 for index = 1:Required_ardno_indx
     call = "scilab2ccode.deps." + Arduino_C_files(Required_fnctn_ardno(index));
     call_val = eval(call);
     Required_fnctn_ardno_f = cat(1,Required_fnctn_ardno_f,(call_val)');
 end
 Required_fnctn_ardno_f = unique(Required_fnctn_ardno_f);

//Adding Standalone and Arudino files lists 
 all_files_addrs = cat(1,Standalone_files_1,Arduino_files_1);

//Adding Requied Standalone and Arudino files lists which are to be copied
 required_files = cat(1,Required_fnctn_stdlon_f,Required_fnctn_ardno_f);
 required_files = unique(required_files);
 no_of_required_files = size(required_files);
 no_of_required_files = no_of_required_files(1);
 no_of_all_files = size(all_files_addrs);
 no_of_all_files = no_of_all_files(1);

 all_files = cat(1,Standalone_C_files,Arduino_C_files);
 index = 1;
//Creating final list which has address of files to be copied
 for i=1:no_of_required_files
     for k=1:no_of_all_files
         if required_files(i) == all_files(k)
            Required_addrs(index) = all_files_addrs(k);
      	    index = index + 1;
         end
     end
 end
    
endfunction