function UpdateSCI2CInfo(FileInfoDatFile)
// function UpdateSCI2CInfo(FileInfoDatFile)
// -----------------------------------------------------------------
// #RNU_RES_B
// Updates the FileInfo struct according to the new scilab function
// to be converted in C.
//
// Input data:
// FileInfoDatFile: name of the .dat file containing the FileInfo structure.
//
// Output data:
// ---
//
// #RNU_RES_E
// Status:
// 13-Apr-2007 -- Raffaele Nutricato: Author.
//
// Copyright 2007 Raffaele Nutricato.
// Contact: raffaele.nutricato@tiscali.it
// -----------------------------------------------------------------

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

// ---------------------------------
// --- Load File Info Structure. ---
// ---------------------------------
clear FileInfo
load(FileInfoDatFile,'FileInfo');

// -----------------------------------
// --- Load Shared Info Structure. ---
// -----------------------------------
clear SharedInfo
load(FileInfo.SharedInfoDatFile,'SharedInfo');

// ---------------------------------------------------
// --- Extraction of the function name and number. ---
// ---------------------------------------------------
funname   = SharedInfo.NextSCIFunName;
funnumber = SharedInfo.NextSCIFunNumber;
// #RNU_RES_B
//NUT: sicuro che mi serve questa struttura? SharedInfo.NextSCIFunNumber cioe' il numero della funzione a che serve?
// #RNU_RES_E
PrintStepInfo('Start translation of function ""'+funname+'""',...
   FileInfo.GeneralReport,'both');

// -----------------------------------
// --- Update File Info structure. ---
// -----------------------------------
FileInfo.Funct(funnumber).Name                   = funname;
FileInfo.Funct(funnumber).SCIFileName            = SharedInfo.NextSCIFileName;
FileInfo.Funct(funnumber).ASTFileName            = fullfile(FileInfo.WorkingDir,funname,funname+'.ast');
FileInfo.Funct(funnumber).CPass1FileName         = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_pass1.c');
FileInfo.Funct(funnumber).PfxP1ForProlFileName   = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_pass1ProlFor');
FileInfo.Funct(funnumber).PfxP1ForEpilFileName   = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_pass1EpilFor');
FileInfo.Funct(funnumber).PfxP1WhileProlFileName = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_pass1ProlWhile');
FileInfo.Funct(funnumber).PfxP1WhileEpilFileName = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_pass1EpilWhile');
FileInfo.Funct(funnumber).CPass1FreeFileName     = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_pass1free.c');
FileInfo.Funct(funnumber).CPass2FileName         = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_pass2.c');
FileInfo.Funct(funnumber).Pass1HeaderFileName    = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'.h');
if (SharedInfo.Target == 'Arduino')
//In case of "Arduino" target, *.cpp files should be generated, not *.c files.
	FileInfo.Funct(funnumber).FinalCFileName         = fullfile(FileInfo.OutCCCodeDir,SharedInfo.NextCFunName+'.cpp');
else
	FileInfo.Funct(funnumber).FinalCFileName         = fullfile(FileInfo.OutCCCodeDir,SharedInfo.NextCFunName+'.c');
end
FileInfo.Funct(funnumber).FinalHeaderFileName    = fullfile(FileInfo.OutCCCodeDir,SharedInfo.NextCFunName+'.h');
FileInfo.Funct(funnumber).CInitVarsFileName      = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_initvars.c');
FileInfo.Funct(funnumber).CDeclarationFileName   = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_declarations.c');
FileInfo.Funct(funnumber).CGblDeclarFileName     = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_globaldeclarations.c');
FileInfo.Funct(funnumber).ReportFileName         = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'.rpt');
FileInfo.Funct(funnumber).LocalVarFileName       = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_LOCVAR.dat');
FileInfo.Funct(funnumber).TempVarFileName        = fullfile(FileInfo.WorkingDir,funname,SharedInfo.NextCFunName+'_TMPVAR.dat');
FileInfo.Funct(funnumber).SCICopyFileName        = fullfile(FileInfo.WorkingDir,funname,funname+'_copy.sci');


// -------------------------------------
// --- Update Shared Info structure. ---
// -------------------------------------
SharedInfo.NIndent                = 0; // Indentation Level. Useful to produce indentated C code.
SharedInfo.SkipNextEqual          = 0; // 1 = the next equal in the AST will not produce C code.
SharedInfo.SkipNextPrec           = 0; // 1 = the next precision specifier in the AST will not produce C code.
SharedInfo.SkipNextFun            = 0; // 1 = the next function in the AST will not produce C code.
SharedInfo.ASTReader.fidAST       = -1;
SharedInfo.CountNestedIf          = 0;
SharedInfo.CountForTempVars       = 0;
SharedInfo.For.Level              = 0;
SharedInfo.ForExpr.OnExec         = 0;
SharedInfo.ForExpr.IntCntArg      = [];
SharedInfo.ForExpr.MtxValCntArg   = [];
SharedInfo.ForExpr.SclValCntArg   = [];
SharedInfo.ForExpr.OpColonInfoIn1 = '';
SharedInfo.ForExpr.OpColonInfoIn2 = '';
SharedInfo.ForExpr.OpColonInfoIn3 = '';
SharedInfo.ForExpr.AssignmentFun  = 0;

SharedInfo.WhileExpr.OnExec     = 0;
SharedInfo.WhileExpr.CondVar    = '';
SharedInfo.WhileExpr.DimCondVar = -1;
SharedInfo.While.Level      = 0;
//NUT: anche questa sarebbe da inizializzare con una bella funzione.


SharedInfo.CFunId.OpColon   = 3;
SharedInfo.CFunId.EqScalar  = 4;
SharedInfo.CFunId.EqMatrix  = 5;
SharedInfo.CFunId.GenFunMtx = 6; // (scalar functions are fall in the scalar equal category.)

SharedInfo = INIT_SharedInfoEqual(SharedInfo);

// Contains the list of the C calls calls made in the current .sci file.
SharedInfo.CFunctsAlreadyCalled = '_____________'; // Initialization with a dummy name

// ---------------------------------------
// --- Update Converted Function List. ---
// ---------------------------------------
Converted = FL_UpdateConverted(SharedInfo.NFilesToTranslate,FileInfo.FunctionList.ConvertedDat);

// --------------------------------------
// --- Create the function directory. ---
// --------------------------------------
rmdir(fullfile(FileInfo.WorkingDir,funname),'s');
mkdir(FileInfo.WorkingDir,funname);

// -----------------------------------------
// --- Initialize Other FileInfo fields. ---
// -----------------------------------------
PrintStringInfo(' ',FileInfo.Funct(funnumber).SCICopyFileName,'file','y'); // Cannot use copyfile when the directory is empty!.
SCI2Ccopyfile(FileInfo.Funct(funnumber).SCIFileName,FileInfo.Funct(funnumber).SCICopyFileName,'overwrite');

FileInfo.Funct(funnumber).SCICopyFileFid = SCI2COpenFileRead(FileInfo.Funct(funnumber).SCICopyFileName);
// Perform a dummy reading up to the function.
//NUT: mettimi in una funzione.
scicopyfid       = FileInfo.Funct(funnumber).SCICopyFileFid;
CPass1FileName   = FileInfo.Funct(funnumber).CPass1FileName;
IndentLevel      = SharedInfo.NIndent;
FoundFunctionKey = 0;
PrintStringInfo(C_IndentBlanks(IndentLevel)+'/*',CPass1FileName,'file','y');
PrintStringInfo(C_IndentBlanks(IndentLevel)+'  SCI2C: ------------------------------------------------------------------',CPass1FileName,'file','y');
while (~meof(scicopyfid) & (FoundFunctionKey==0))
   // Read a line from the scilab file
   sciline = mgetl(scicopyfid,1);
   noblkssciline = stripblanks(sciline);
   if (SCI2Cstrncmps1size('function',noblkssciline))
      FoundFunctionKey = 1;
   end
   PrintStringInfo(C_IndentBlanks(IndentLevel)+'  SCI2C: '+sciline,CPass1FileName,'file','y');
end
PrintStringInfo(C_IndentBlanks(IndentLevel)+'  SCI2C: ------------------------------------------------------------------',CPass1FileName,'file','y');
PrintStringInfo(C_IndentBlanks(IndentLevel)+'*/',CPass1FileName,'file','y');

// -------------------------
// --- Initialize Files. ---
// -------------------------
PrintStringInfo(' ',FileInfo.Funct(funnumber).CDeclarationFileName,'file','y');
PrintStringInfo(' ',FileInfo.Funct(funnumber).CGblDeclarFileName,'file','y');
PrintStringInfo(' ',FileInfo.Funct(funnumber).CInitVarsFileName,'file','y');
CPass1FreeFileName = FileInfo.Funct(funnumber).CPass1FreeFileName;
PrintStringInfo(' ',CPass1FreeFileName,'file','y');
PrintStringInfo(C_IndentBlanks(1)+'/*',CPass1FreeFileName,'file','y');
PrintStringInfo(C_IndentBlanks(1)+'** --------------------- ',CPass1FreeFileName,'file','y');
PrintStringInfo(C_IndentBlanks(1)+'** --- Free Section. --- ',CPass1FreeFileName,'file','y');
PrintStringInfo(C_IndentBlanks(1)+'** --------------------- ',CPass1FreeFileName,'file','y');
PrintStringInfo(C_IndentBlanks(1)+'*/',CPass1FreeFileName,'file','y');

// -----------------------------------
// --- Initialize Local/Temp Vars. ---
// -----------------------------------
LocalVars = [];
TempVars = [];

// ------------------------------------
// --- Determine Default Precision. ---
// ------------------------------------
// For the current release only the following approaches are available:
// 'NO_RESIZE'
// 'REALLOC_ALL_RESIZE_ALL'
SharedInfo.DefaultPrecision = ...
   FA_GetDefaultPrecision(FileInfo.Funct(funnumber).SCICopyFileName,FileInfo.Funct(funnumber).ReportFileName);

// ----------------------------------
// --- Determine Resize Approach. ---
// ----------------------------------
SharedInfo.ResizeApproach = FA_GetResizeApproach(FileInfo.Funct(funnumber).SCICopyFileName,FileInfo.Funct(funnumber).ReportFileName);

// ---------------------
// --- Save section. ---
// ---------------------
// --- Save File Info Structure. ---
save(FileInfoDatFile, "FileInfo");

// --- Save File Info Structure. ---
save(FileInfo.SharedInfoDatFile, "SharedInfo");

// --- Save Local/Temp Vars. ---
save(FileInfo.Funct(funnumber).LocalVarFileName, "LocalVars");
save(FileInfo.Funct(funnumber).TempVarFileName, "TempVars");

// --- Save Converted .dat file. ---
save(FileInfo.FunctionList.ConvertedDat, "Converted");
// -------------------------
// --- End save section. ---
// -------------------------

endfunction