summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjofret2008-06-06 15:44:47 +0000
committerjofret2008-06-06 15:44:47 +0000
commit1c6d2d04fff62258d03c11538c70906ee8ed9cba (patch)
tree27fb7381c32c37c64f3cad62d965e8688f7fd89d /src
parent41512442614eb22d701e15007dbb25965b9c824a (diff)
downloadscilab2c-1c6d2d04fff62258d03c11538c70906ee8ed9cba.tar.gz
scilab2c-1c6d2d04fff62258d03c11538c70906ee8ed9cba.tar.bz2
scilab2c-1c6d2d04fff62258d03c11538c70906ee8ed9cba.zip
- Clean add for Raffaele
Diffstat (limited to 'src')
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/%program_p.sci202
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST2Ccode.sci224
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_CheckCommonInOutArgs.sci62
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_CheckLastFunc.sci65
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_CheckLineLength.sci21
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_CheckPrecSpecifier.sci53
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_DisplayStack.sci33
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_ExtractNameAndScope.sci78
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_GetASTFile.sci49
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_GetFuncallPrm.sci41
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_GetPrecAndLhsArg.sci65
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEOL.sci45
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndGenFun.sci315
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndProgram.sci51
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndWhile.sci54
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_HandleHeader.sci182
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_ParseEqualStruct.sci105
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_ParseFuncallStruct.sci77
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_ParseIfExprStruct.sci74
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_ParseOperStruct.sci64
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_PopSCI2CStack.sci29
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_PushSCI2CStack.sci26
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_ReadASTHeader.sci76
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/AST_ReadEqualRhsNames.sci48
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/GenOutArgNames.sci49
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/Operator2FunName.sci101
-rw-r--r--src/Scilab2C/Scilab2C/ASTManagement/SciFile2ASTFile.sci23
27 files changed, 2212 insertions, 0 deletions
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/%program_p.sci b/src/Scilab2C/Scilab2C/ASTManagement/%program_p.sci
new file mode 100644
index 00000000..931f1f17
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/%program_p.sci
@@ -0,0 +1,202 @@
+function %program_p(p)
+ //overloading function for "program" type tlist display
+ mprintf("%s\n",string(p))
+endfunction
+
+function txt=%program_string(p)
+//overloading function for "program" type tlist string function
+//main (root) node of the Abstract Formal Tree
+//fields:
+// name : string (the function name)
+// outputs : list of "variable" type tlist (the output arg names)
+// inputs : list of "variable" type tlist (the intput arg names)
+// statements: list of "equal" type tlist and list('EOL') (the
+// instructions list)
+// nblines : number (the number of lines in the scilab function)
+ txt=['Program'
+ 'Name : '+p.name
+ 'Outputs: '+strcat(objectlist2string(p.outputs),' ')
+ 'Inputs : '+strcat(objectlist2string(p.inputs),' ')
+ 'Statements '
+ ' '+objectlist2string(p.statements)
+ 'EndProgram'
+ ]
+endfunction
+
+
+function txt=%equal_string(e)
+//overloading function for "equal" type tlist string function
+//this is a node of the AST
+
+//fields:
+// expression: "expression" type tlist (the right hand side)
+// lhs : list of "variable" type tlist and "operation" type tlist // (the assignment)
+// endsymbol : string (the orginal end-of-instruction symbol (, ; <CR>))
+ txt=['Equal'
+ ' Expression: '
+ ' '+string(e.expression)
+ ' Lhs : '
+ ' '+objectlist2string(e.lhs)
+ 'EndEqual'
+ ]
+endfunction
+
+
+function txt=%for_string(F)
+//overloading function for "for" type tlist string function
+//this is a node of the AST
+//fields:
+// expression : "expression" type tlist (the loop expression)
+// statements : list of "equal" type tlist and list('EOL') (the
+// for instructions list)
+//NUT: raf cambiato ForExpression e ForStatements
+ txt=['For'
+ ' ForExpression:'
+ ' '+string(F.expression)
+ ' ForStatements:'
+ ' '+objectlist2string(F.statements)
+ 'EndFor']
+endfunction
+
+function txt=%while_string(W)
+//overloading function for "while" type tlist string function
+//this is a node of the AST
+//fields:
+// expression : "expression" type tlist (the loop expression)
+// statements : list of "equal" type tlist and list('EOL') (the
+// while instructions list)
+ txt=['While'
+ ' WhileExpression:'
+ ' '+string(W.expression)
+ ' WhileStatements:'
+ ' '+objectlist2string(W.statements)
+ 'EndWhile']
+endfunction
+
+function txt=%ifthenel_string(I)
+//overloading function for "ifthenel" type tlist string function
+//this is a node of the AST
+//fields:
+// expression : "expression" type tlist (the if expression)
+// then : list of "equal" type tlist and list('EOL') (the
+// then instructions list)
+// elseifs : a list of tlists
+// else : list of "equal" type tlist and list('EOL') (the
+// else instructions list)
+ txt=['If '
+ ' Expression:'
+ ' '+string(I.expression)
+ ' If Statements'
+ ' '+objectlist2string(I.then)]
+ for e=I.elseifs
+ txt=[txt;
+ ' Else If Expression'
+ ' '+string(e.expression)
+ ' Else If Statements'
+ ' '+objectlist2string(e.then)]
+ end
+ txt=[txt;
+ ' Else Statements'
+ ' '+objectlist2string(I.else)
+ 'EndIf']
+endfunction
+
+function txt=%operatio_string(O)
+//overloading function for "operation" type tlist string function
+//this is a node of the AST
+//fields:
+// operands: a list
+// operator: a string
+ txt=['Operation'
+ ' Operands:'
+ ' '+objectlist2string(O.operands)
+ ' Operator: '+O.operator
+ 'EndOperation'
+ ]
+endfunction
+
+function txt=%funcall_string(F)
+//overloading function for "funcall" type tlist string function
+//this is a node of the AST
+//fields:
+// rhs : a list
+// name : string, the name of the function
+// lhsnb: number, the number of function lhs
+
+txt=['Funcall : '+F.name
+ ' #lhs : '+string(F.lhsnb)
+ ' Rhs : '
+ ' '+objectlist2string(F.rhs)
+ 'EndFuncall'
+ ]
+endfunction
+
+function txt=%variable_string(v)
+ global anscounter; //NUT: just to fix problem with ans variables.
+//overloading function for "variable" type tlist string function
+//fields: name
+//this is a leaf of the AST
+//NUT: changed here. For me %i is a number not a variable.
+ if (v.name == "%T" | ...
+ v.name == "%F"| ...
+ v.name == "%nan"| ...
+ v.name == "%inf"| ...
+ v.name == "%pi")
+ txt=['Number_x: '+v.name];
+ elseif (v.name == "%i")
+ txt=['Number_X: '+v.name];
+ else
+ if (v.name == 'ans')
+ anscounter = anscounter + 1;
+ txt=['Variable: '+v.name+string(anscounter)];
+ else
+ txt=['Variable: '+v.name];
+ end
+ end
+endfunction
+
+function txt=%cste_string(c)
+//overloading function for "cste" type tlist string function
+//this is a leaf of the AST
+//fields:
+// value : a number or a string
+//NUT: added cste I also need "" for strings in order to be sure that the blanks are
+//NUT: correctly considered and not mistaken with additional blanks present in the ast text file.
+ stringcvalue = string(c.value);
+ if (stringcvalue == "%T" | ...
+ stringcvalue == "%F" | ...
+ stringcvalue == "%nan" | ...
+ stringcvalue == "%inf" | ...
+ stringcvalue == "%pi")
+ txt=['Number_x: '+stringcvalue];
+ elseif (SCI2Cisnum(stringcvalue))
+ //NUT needed to convert format 1D-14 into 1d-14
+ txt=['Number_x: '+strsubst(stringcvalue,'D','e')];
+ elseif (stringcvalue == "%i")
+ txt=['Number_X: '+stringcvalue];
+ else
+ txt=['String: ""'+stringcvalue+'""'];
+ end
+endfunction
+
+function txt=%comment_string(e)
+//overloading function for "comment" type tlist string function
+//fields:
+// text: a string
+//this is a leaf of the AST
+ txt=['Comment : '+e.text]
+endfunction
+
+function txt=objectlist2string(L)
+//auxiliary function for conversion of a list of objects
+//into a string vector
+ txt=[];
+ for o=L,
+ if type(o)==15 then //EOL case
+ txt=[txt;'<'+o(1)+'>'],
+ else
+ txt=[txt; string(o)],
+ end
+ end
+ if txt==[] then txt='<empty>',end
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST2Ccode.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST2Ccode.sci
new file mode 100644
index 00000000..0bcd2556
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST2Ccode.sci
@@ -0,0 +1,224 @@
+function AST2Ccode(FileInfoDatFile)
+// function AST2Ccode(FileInfoDatFile)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-May-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),1,1);
+
+
+//NUT: questa funzione e' da sistemare meglio
+
+// ---------------------
+// --- Load section. ---
+// ---------------------
+// --- Load File Info Structure. ---
+load(FileInfoDatFile,'FileInfo');
+
+// --- Load Shared Info Structure. ---
+load(FileInfo.SharedInfoDatFile,'SharedInfo');
+// -------------------------
+// --- End load section. ---
+// -------------------------
+
+// ---------------------------------------------------
+// --- Extraction of the function name and number. ---
+// ---------------------------------------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+
+// ---------------------------------
+// --- Parameter Initialization. ---
+// ---------------------------------
+global SCI2CSTACK
+SCI2CSTACK = ['EMPTYSTACK'];
+
+global StackPosition;
+StackPosition = 1;
+
+global STACKDEDUG
+STACKDEDUG = 0; // 1 -> Every Pop and Push operation on the stack, the stack content will be printed on screen.
+// -------------------------------------
+// --- End parameter Initialization. ---
+// -------------------------------------
+
+ASTFileName = FileInfo.Funct(nxtscifunnumber).ASTFileName;
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+// --- Open AST file. ---
+SharedInfo.ASTReader.fidAST = SCI2COpenFileRead(ASTFileName);
+fidAST = SharedInfo.ASTReader.fidAST;
+
+OrigWorkAreaUsedBytes = SharedInfo.WorkAreaUsedBytes;
+OrigUsedTempScalarVars = SharedInfo.UsedTempScalarVars;
+
+PrintStepInfo('Generate C code in '+FileInfo.Funct(nxtscifunnumber).FinalCFileName,...
+ FileInfo.GeneralReport,'both');
+// ---------------------------
+// --- End initialization. ---
+// ---------------------------
+
+// ------------------------
+// --- Parse AST header. ---
+// ------------------------
+ASTHeader = AST_ReadASTHeader(fidAST,ReportFileName);
+SharedInfo = AST_HandleHeader(ASTHeader,FileInfo,SharedInfo);
+AST_PushASTStack('Dummy');
+AST_PushASTStack('Dummy');
+AST_PushASTStack('Dummy');
+AST_PushASTStack('Dummy');
+AST_PushASTStack('Dummy');
+AST_PushASTStack('Dummy');
+AST_PushASTStack('Dummy');
+AST_PushASTStack('Dummy');
+// ----------------------------
+// --- End Parse AST header. ---
+// ----------------------------
+
+ TempVars = [];
+ SharedInfo.WorkAreaUsedBytes = OrigWorkAreaUsedBytes;
+ SharedInfo.UsedTempScalarVars = OrigUsedTempScalarVars;
+ SharedInfo.ASTReader.UsedTempVars = 0;
+
+// ----------------------------------
+// --- Main loop to read the AST. ---
+// ----------------------------------
+
+while ~meof(fidAST)
+ // Read a line from the AST
+ tline = mgetl(fidAST,1);
+ AST_CheckLineLength(tline);
+ treeline = stripblanks(tline);
+
+ if STACKDEDUG == 1
+ disp('Read AST Line: '+treeline);
+ end
+
+ // Analyze line.
+ select treeline
+
+ // ------------------
+ // --- Functions. ---
+ // ------------------
+ case 'EndOperation' then
+ [FileInfo,SharedInfo] = AST_HandleEndGenFun(FileInfo,SharedInfo,'Operation');
+ case 'EndFuncall' then
+ [FileInfo,SharedInfo] = AST_HandleEndGenFun(FileInfo,SharedInfo,'Funcall');
+
+ // --------------
+ // --- Equal. ---
+ // --------------
+ case 'EndEqual' then
+ [FileInfo,SharedInfo] = AST_HandleEndGenFun(FileInfo,SharedInfo,'Equal');
+ SharedInfo = INIT_SharedInfoEqual(SharedInfo);
+ case 'Equal' then
+ SharedInfo.Equal.Enabled = 1; // 1 means enabled -> we are inside an equal AST block.
+ AST_PushASTStack(treeline);
+ case 'Lhs :' then
+ SharedInfo.Equal.Lhs = 1; // 1 means that we are inside the Lhs block of the Equal
+ [EqualInArgName,EqualInArgScope,EqualNInArg] = AST_ReadEqualRhsNames(FileInfo,SharedInfo);
+ SharedInfo.Equal.NInArg = EqualNInArg;
+ for tmpcnt = 1:SharedInfo.Equal.NInArg
+ SharedInfo.Equal.InArg(tmpcnt).Name = EqualInArgName(tmpcnt);
+ SharedInfo.Equal.InArg(tmpcnt).Scope = EqualInArgScope(tmpcnt);
+ end
+ AST_PushASTStack(treeline);
+
+ // ----------------
+ // --- If/Else. ---
+ // ----------------
+ //NUT: da verificare la gestione dello stack
+ case 'If Statements' then
+ error('IF NOT SUPPORTED YET');
+ [FileInfo,SharedInfo] = AST_HandleIfElse(FileInfo,SharedInfo,'if');
+ case 'Else If Expression' then
+ AST_PushASTStack(treeline);
+ [FileInfo,SharedInfo] = AST_HandleIfElse(FileInfo,SharedInfo,'else');
+ case 'Else If Statements' then
+ [FileInfo,SharedInfo] = AST_HandleIfElse(FileInfo,SharedInfo,'elseif');
+ case 'Else Statements' then
+ [FileInfo,SharedInfo] = AST_HandleIfElse(FileInfo,SharedInfo,'else');
+ case 'EndIf' then
+ for counter=1:SharedInfo.CountNestedIf+1
+ SharedInfo = C_IfElseBlocks(FileInfo,SharedInfo,'out');
+ end
+ SharedInfo.CountNestedIf = 0;
+
+ // --------------
+ // --- Dummy. ---
+ // --------------
+ case 'Comment :' then
+ AST_HandleEOL(FileInfo,SharedInfo); //NUT: si potrebbe differenziare comment da EOL
+ case '<EOL>' then
+ AST_HandleEOL(FileInfo,SharedInfo);
+
+ // -----------------
+ // --- Epilogue. ---
+ // -----------------
+ case 'EndProgram'
+ SharedInfo = AST_HandleEndProgram(FileInfo,SharedInfo);
+
+ // ------------
+ // --- For. ---
+ // ------------
+ case 'For' then
+ error('FOR NOT SUPPORTED YET');
+ SharedInfo.For.Level = SharedInfo.For.Level + 1;
+ FileInfo = AST_HandleFor(FileInfo,SharedInfo);
+ case 'ForExpression:'
+ AST_PushASTStack(treeline);
+ SharedInfo.ForExpr.OnExec = SharedInfo.ForExpr.OnExec + 1;
+ case 'ForStatements:'
+ [FileInfo,SharedInfo] = AST_HandleForStatem(FileInfo,SharedInfo);
+ case 'EndFor' then
+ SharedInfo = AST_HandleEndFor(FileInfo,SharedInfo);
+ SharedInfo.For.Level = SharedInfo.For.Level - 1;
+
+ // --------------
+ // --- While. ---
+ // --------------
+ case 'While' then
+ error('WHILE NOT SUPPORTED YET');
+ AST_PushASTStack(treeline);
+ SharedInfo.While.Level = SharedInfo.While.Level + 1;
+ case 'WhileExpression:'
+ AST_PushASTStack(treeline);
+ [FileInfo,SharedInfo] = AST_HandleWhileExpr(FileInfo,SharedInfo);
+ case 'WhileStatements:'
+ [FileInfo,SharedInfo] = AST_HandleWhileStatem(FileInfo,SharedInfo);
+ case 'EndWhile' then
+ SharedInfo = AST_HandleEndWhile(FileInfo,SharedInfo);
+ SharedInfo.While.Level = SharedInfo.While.Level - 1;
+
+ // ----------------
+ // --- Default. ---
+ // ----------------
+ else
+ AST_PushASTStack(treeline);
+ end
+end
+// --------------------------------------
+// --- End main loop to read the AST. ---
+// --------------------------------------
+
+mclose(fidAST);
+// ---------------------
+// --- Save section. ---
+// ---------------------
+// --- Save Shared Info Structure. ---
+save(SharedInfoDatFile,SharedInfo);
+// -------------------------
+// --- End save section. ---
+// -------------------------
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckCommonInOutArgs.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckCommonInOutArgs.sci
new file mode 100644
index 00000000..f4593253
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckCommonInOutArgs.sci
@@ -0,0 +1,62 @@
+function AST_CheckCommonInOutArgs(InArg,NInArg,OutArg,NOutArg,ReportFileName)
+// function AST_CheckCommonInOutArgs(InArg,NInArg,OutArg,NOutArg,ReportFileName)
+// -----------------------------------------------------------------
+//
+// Status:
+// 08-Jan-2008 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),5,5);
+
+ncommonstrings = 0;
+commonstrings = '';
+
+for cnt1 = 1:NInArg
+ for cnt2 = 1:NOutArg
+ if ((InArg(cnt1).Name == OutArg(cnt2).Name) & ...
+ (InArg(cnt1).Dimension > 0))
+ ncommonstrings = ncommonstrings + 1;
+ commonstrings(ncommonstrings) = InArg(cnt1).Name;
+ end
+ end
+end
+
+
+if (ncommonstrings > 0)
+ PrintStringInfo(' ',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: Found '+string(ncommonstrings)+' input/output 2-D arguments',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: with the same name: ',ReportFileName,'both','y');
+ for cntstr = 1:ncommonstrings
+ PrintStringInfo('SCI2CERROR: Arg('+string(cntstr)+'): '+commonstrings(cntstr),ReportFileName,'both','y');
+ end
+ PrintStringInfo(' ',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: This approach is not allowed because it is not safe',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: due to the fact that arrays are passed by reference to functions.',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: For example if A is a squared matrix then the following code,',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: A = A'';',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: could generate incorrect results.',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: Please consider renaming input or output arguments.',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: See examples below:',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: ',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: // Example 1: Function call.',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: A = zeros(10,9);',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: A = sin(A); // Not Allowed',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: // The previous line must be rewritten as:',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: MYTMP = A; // Allowed',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: A = sin(MYTMP); // Allowed',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: ',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: // Example 2: Function definition.',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: function d = myfun(a,b,c,d) // Not Allowed',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: // The previous line must be rewritten as:',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: function e = myfun(a,b,c,d) // Not Allowed',ReportFileName,'both','y');
+ PrintStringInfo(' ',ReportFileName,'both','y');
+ SCI2Cerror(' ');
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckLastFunc.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckLastFunc.sci
new file mode 100644
index 00000000..35e0d239
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckLastFunc.sci
@@ -0,0 +1,65 @@
+function [LhsArgNames,LhsArgScope,NLhsArg] = AST_CheckLastFunc(fidAST,SearchLevel)
+// function [LhsArgNames,LhsArgScope,NLhsArg] = AST_CheckLastFunc(fidAST,SearchLevel)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),2,2);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+astfilepos = mtell(fidAST);
+NLhsArg = 0;
+LhsArgNames = '';
+LhsArgScope = '';
+FlagLastFunc = 0;
+// ---------------------------
+// --- End Initialization. ---
+// ---------------------------
+
+tline = mgetl(fidAST,1);
+AST_CheckLineLength(tline);
+LhsField = stripblanks(tline);
+if ((SearchLevel == 1) & (LhsField == 'EndFuncall'))
+ SearchLevel = 0;
+ tline = mgetl(fidAST,1);
+ AST_CheckLineLength(tline);
+ LhsField = stripblanks(tline);
+end
+if ((SearchLevel == 0) & (LhsField == 'Lhs :'))
+ tline = mgetl(fidAST,1);
+ AST_CheckLineLength(tline);
+ LhsField = stripblanks(tline);
+ while(LhsField ~= 'EndEqual')
+ NLhsArg = NLhsArg + 1;
+ if (LhsField == '<EOL>')
+ SCI2Cerror('Found <EOL> before EndEqual');
+ elseif (LhsField == 'EndProgram')
+ SCI2Cerror('Found EndProgram before EndEqual');
+ end
+ if (LhsField == 'Operation')
+ LhsField = 'EndEqual'; // Force the exit from the while.
+ NLhsArg = 0;
+ LhsArgNames = '';
+ LhsArgScope = '';
+ else
+ [LhsArgNames(NLhsArg),LhsArgScope(NLhsArg)] = AST_ExtractNameAndScope(LhsField);
+ tline = mgetl(fidAST,1);
+ AST_CheckLineLength(tline);
+ LhsField = stripblanks(tline);
+ end
+ end
+end
+mseek(astfilepos,fidAST,'set');
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckLineLength.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckLineLength.sci
new file mode 100644
index 00000000..2936a306
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckLineLength.sci
@@ -0,0 +1,21 @@
+function AST_CheckLineLength(instring)
+// function AST_CheckLineLength(instring)
+// -----------------------------------------------------------------
+//
+// Status:
+// 15-May-2008 -- Raffaele Nutricato: Author.
+//
+// Copyright 2008 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),1,1);
+
+if length(instring) > 77
+ SCI2Cerror('Line too long: please reduce the length of the current line.');
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckPrecSpecifier.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckPrecSpecifier.sci
new file mode 100644
index 00000000..83e881b4
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_CheckPrecSpecifier.sci
@@ -0,0 +1,53 @@
+function AnnotationFnc = AST_CheckPrecSpecifier(FunctionName,FileInfo,SharedInfo);
+// function AnnotationFnc = AST_CheckPrecSpecifier(FunctionName,FileInfo,SharedInfo);
+// -----------------------------------------------------------------
+//
+// Status:
+// 13-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),3,3);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+PrintStringInfo(' ',ReportFileName,'file','y');
+
+//NUT: da sistemare senza le global
+global SCI2CSTACK
+global StackPosition;
+global STACKDEDUG
+
+AnnotationFnc = 'default';
+// ---------------------------
+// --- End Initialization. ---
+// ---------------------------
+
+Pop1 = AST_PopASTStack(); // Rhs :
+if (mtlb_strcmp(stripblanks(Pop1),'Rhs :'))
+ Pop2 = AST_PopASTStack(); // #lhs : 1
+ if (mtlb_strcmp(stripblanks(Pop2),'#lhs : 1'))
+ Pop3 = AST_PopASTStack(); // Funcall : double
+ FunctionName = stripblanks(part(Pop3,12:length(Pop3)));
+ for counterdataprec = 1:max(size(SharedInfo.Annotations.DataPrec))
+ if (mtlb_strcmp(FunctionName,SharedInfo.Annotations.DataPrec(counterdataprec)))
+ AnnotationFnc = FunctionName;
+ end
+ end
+ AST_PushASTStack(Pop3);
+ end
+ AST_PushASTStack(Pop2);
+end
+AST_PushASTStack(Pop1);
+
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_DisplayStack.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_DisplayStack.sci
new file mode 100644
index 00000000..b4e89a21
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_DisplayStack.sci
@@ -0,0 +1,33 @@
+function AST_DisplayStack()
+// function AST_DisplayStack()
+// -----------------------------------------------------------------
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),0,0);
+
+global SCI2CSTACK
+global StackPosition;
+global STACKDEDUG
+
+disp('*********************')
+disp('*********************')
+
+if (STACKDEDUG == 1)
+ for counterposition = 1:StackPosition
+ disp(SCI2CSTACK(counterposition,1))
+ end
+end
+disp('---------------------')
+disp('---------------------')
+disp(' ');disp(' ');disp('Press return to continue'); halt;
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_ExtractNameAndScope.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_ExtractNameAndScope.sci
new file mode 100644
index 00000000..1aba314e
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_ExtractNameAndScope.sci
@@ -0,0 +1,78 @@
+function [ArgName,ArgScope] = AST_ExtractNameAndScope(ASTField)
+// -----------------------------------------------------------------
+// Status:
+// 27-Dec-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),1,1);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+ArgName = '';
+ArgScope = '';
+
+cnttag = 0;
+cnttag = cnttag + 1;
+tagname(cnttag) = 'Number_';
+taglength(cnttag) = length(tagname(cnttag));
+
+cnttag = cnttag + 1;
+tagname(cnttag) = 'String:';
+taglength(cnttag) = length(tagname(cnttag));
+
+cnttag = cnttag + 1;
+tagname(cnttag) = 'Variable:';
+taglength(cnttag) = length(tagname(cnttag));
+
+cnttag = cnttag + 1;
+tagname(cnttag) = 'Global:';
+taglength(cnttag) = length(tagname(cnttag));
+
+cnttag = cnttag + 1;
+tagname(cnttag) = 'Local:';
+taglength(cnttag) = length(tagname(cnttag));
+
+cnttag = cnttag + 1;
+tagname(cnttag) = 'Temp:';
+taglength(cnttag) = length(tagname(cnttag));
+
+cnttag = cnttag + 1;
+tagname(cnttag) = '<empty>';
+taglength(cnttag) = length(tagname(cnttag));
+
+fieldlength = length(ASTField);
+
+if (SCI2Cstrncmps1size(tagname(1),ASTField))
+ ArgName = stripblanks(part(ASTField,taglength(1)+3:fieldlength));
+ ArgScope = stripblanks(part(ASTField,1:taglength(1)+1));
+elseif (SCI2Cstrncmps1size(tagname(2),ASTField))
+ ArgName = stripblanks(part(ASTField,taglength(2)+1:fieldlength));
+ ArgName = part(ArgName,2:length(ArgName)-1); // I remove also the first and the last "
+ ArgScope = 'String';
+elseif (SCI2Cstrncmps1size(tagname(3),ASTField))
+ ArgName = stripblanks(part(ASTField,taglength(3)+1:fieldlength));
+ ArgScope = 'Variable';
+elseif (SCI2Cstrncmps1size(tagname(4),ASTField))
+ ArgName = stripblanks(part(ASTField,taglength(4)+1:fieldlength));
+ ArgScope = 'Global';
+elseif (SCI2Cstrncmps1size(tagname(5),ASTField))
+ ArgName = stripblanks(part(ASTField,taglength(5)+1:fieldlength));
+ ArgScope = 'Local';
+elseif (SCI2Cstrncmps1size(tagname(6),ASTField))
+ ArgName = stripblanks(part(ASTField,taglength(6)+1:fieldlength));
+ ArgScope = 'Temp';
+elseif (SCI2Cstrncmps1size(tagname(7),ASTField))
+ ArgName = '<empty>';
+ ArgScope = 'None';
+else
+ SCI2Cerror('Argument specifier not found in the AST field: '+ASTField);
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_GetASTFile.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_GetASTFile.sci
new file mode 100644
index 00000000..91e5dd0b
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_GetASTFile.sci
@@ -0,0 +1,49 @@
+function AST_GetASTFile(FileInfoDatFile)
+// function AST_GetASTFile(FileInfoDatFile)
+// -----------------------------------------------------------------
+// Status:
+// 11-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;
+
+PrintStepInfo('Generate the AST in '+FileInfo.Funct(funnumber).ASTFileName,...
+ FileInfo.GeneralReport,'both');
+
+SciFile2ASTFile(FileInfo.Funct(funnumber).SCIFileName,...
+ FileInfo.Funct(funnumber).ASTFileName);
+
+// ---------------------
+// --- Save section. ---
+// ---------------------
+// --- Save File Info Structure. ---
+// save(FileInfoDatFile,FileInfo);
+// -------------------------
+// --- End save section. ---
+// -------------------------
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_GetFuncallPrm.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_GetFuncallPrm.sci
new file mode 100644
index 00000000..e97f0bfa
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_GetFuncallPrm.sci
@@ -0,0 +1,41 @@
+function [FunctionName,InArg,NInArg,OutArg,NOutArg] = ...
+ AST_GetFuncallPrm(FileInfo,SharedInfo,ASTFunType)
+// function [FunctionName,InArg,NInArg,NOutArg] = ...
+// AST_GetFuncallPrm(FileInfo,SharedInfo,ASTFunType)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),3,3);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+OutArg = [];
+NOutArg = 0;
+// ---------------------------
+// --- End Initialization. ---
+// ---------------------------
+
+if (ASTFunType=='Funcall')
+ [FunctionName,InArg,NInArg,NOutArg] = AST_ParseFuncallStruct(FileInfo,SharedInfo);
+elseif (ASTFunType=='Operation')
+ [FunctionName,InArg,NInArg,NOutArg] = AST_ParseOperStruct(FileInfo,SharedInfo);
+elseif (ASTFunType=='Equal')
+ [FunctionName,InArg,NInArg,OutArg,NOutArg] = AST_ParseEqualStruct(FileInfo,SharedInfo);
+else
+ SCI2CerrorFile('Unknown Function type: '+ASTFunType+'.',ReportFileName);
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_GetPrecAndLhsArg.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_GetPrecAndLhsArg.sci
new file mode 100644
index 00000000..10b3cc4e
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_GetPrecAndLhsArg.sci
@@ -0,0 +1,65 @@
+function [LhsArg,NLhsArg,PrecisionSpecifier,SharedInfo] = AST_GetPrecAndLhsArg(OutArg,NOutArg,FunctionName,FunTypeAnnot,FunSizeAnnot,ASTFunType,FileInfo,SharedInfo);
+// function [LhsArg,NLhsArg,PrecisionSpecifier,SharedInfo] = AST_GetPrecAndLhsArg(OutArg,NOutArg,FunctionName,FunTypeAnnot,FunSizeAnnot,ASTFunType,FileInfo,SharedInfo);
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),8,8);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+// ---------------------------
+// --- End Initialization. ---
+// ---------------------------
+
+// ---------------------------------------
+// --- Search for Precision Specifier. ---
+// ---------------------------------------
+if (NOutArg == 1 & FunTypeAnnot == 'FA_TP_USER')
+ PrecisionSpecifier = AST_CheckPrecSpecifier(FunctionName,FileInfo,SharedInfo);
+ if (PrecisionSpecifier == 'default')
+ SearchLevel = 0;
+ else
+ SearchLevel = 1;
+ SharedInfo.SkipNextPrec = 1;
+ end
+else
+ PrecisionSpecifier = '';
+ SearchLevel = 0;
+end
+
+if (ASTFunType~='Equal')
+ [LhsArgNames,LhsArgScope,NLhsArg] = AST_CheckLastFunc(SharedInfo.ASTReader.fidAST,SearchLevel);
+else
+ LhsArgNames = '';
+ LhsArgScope = '';
+ NLhsArg = 0;
+end
+
+LhsArg = [];
+for cntarg = 1:NLhsArg
+ LhsArg(cntarg).Name = LhsArgNames(cntarg);
+ LhsArg(cntarg).Scope = LhsArgScope(cntarg);
+end
+
+if (NLhsArg > 0)
+ SharedInfo.SkipNextEqual = 1; // 1 = the next equal in the AST will not produce C code.
+ if (NLhsArg ~= NOutArg)
+ SCI2CerrorFile('NLhsArg='+string(NLhsArg)+' must be equal to NOutArg='+string(NOutArg)+'.',ReportFileName);
+ end
+else
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEOL.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEOL.sci
new file mode 100644
index 00000000..00872e22
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEOL.sci
@@ -0,0 +1,45 @@
+function AST_HandleEOL(FileInfo,SharedInfo)
+// function AST_HandleEOL(FileInfo,SharedInfo)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),2,2);
+
+
+//NUT: questa parte e' molto interessante perche' ti puo' aiutare per fare confronti
+//NUT: incrociati tra le annotazioni della funzione e gli argomenti in uscita.
+//NUT: in particolare una volta messi nella tabella dei simboli anche gli argomenti
+//NUT: di uscita puoi benissimo verificare che li stai utilizzando bene nel corpo della funzione stessa.
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+CPass1FileName = FileInfo.Funct(nxtscifunnumber).CPass1FileName;
+SciFileFid = FileInfo.Funct(nxtscifunnumber).SCICopyFileFid;
+IndentLevel = SharedInfo.NIndent;
+
+PrintStepInfo('Handling EOL',ReportFileName,'file');
+sciline = mgetl(SciFileFid,1);
+
+PrintStringInfo(' ',CPass1FileName,'file','y');
+modeprintstringinfo = 'stdout';
+if (SharedInfo.CopySciCodeIntoCCode == 1)
+ modeprintstringinfo = 'both';
+end
+PrintStringInfo(C_IndentBlanks(IndentLevel)+'/*SCI2C: #############'+'############'+'##############'+'###############'+'############',CPass1FileName,modeprintstringinfo,'y');
+PrintStringInfo(C_IndentBlanks(IndentLevel)+' SCI2C: '+sciline,CPass1FileName,modeprintstringinfo,'y');
+PrintStringInfo(C_IndentBlanks(IndentLevel)+' SCI2C: #############'+'############'+'##############'+'###############'+'############*/',CPass1FileName,modeprintstringinfo,'y');
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndGenFun.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndGenFun.sci
new file mode 100644
index 00000000..d57089a6
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndGenFun.sci
@@ -0,0 +1,315 @@
+function [FileInfo,SharedInfo] = AST_HandleEndGenFun(FileInfo,SharedInfo,ASTFunType)
+// function [FileInfo,SharedInfo] = AST_HandleEndGenFun(FileInfo,SharedInfo,ASTFunType)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),3,3);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+Pass1HeaderFileName = FileInfo.Funct(nxtscifunnumber).Pass1HeaderFileName;
+FunInfoDatDir = FileInfo.FunctionList.FunInfoDatDir;
+
+Flag_FunAlreadyCalled = 0;
+PrintStepInfo('Handling Funcall/Operation/Equal',FileInfo.Funct(nxtscifunnumber).ReportFileName,'file');
+
+//NUT: da sistemare senza le global
+global SCI2CSTACK
+global StackPosition;
+global STACKDEDUG
+// ---------------------------
+// --- End Initialization. ---
+// ---------------------------
+
+// ---------------------------------------------
+// --- Retrieve FunCall Parameters from AST. ---
+// ---------------------------------------------
+//NUT: verifica se ASTFunType e' veramente importante
+[ASTFunName,InArg,NInArg,OutArg,NOutArg] = AST_GetFuncallPrm(FileInfo,SharedInfo,ASTFunType);
+if (ASTFunName == 'OpIns')
+ SharedInfo.SkipNextEqual = 1;
+ SharedInfo.Equal.Nins = SharedInfo.Equal.Nins + 1;
+ //NUT: Force ins to have 0 args. Double check it.
+ NOutArg = 0;
+ //NUT: io aumenterei qui gli argomenti in ingresso della ins cosi qui vengono fatte tutte le modifiche del
+ //NUT: caso e la C_FunCall non se ne deve preoccupare, vedi se lo stesso vale per le altre funzioni
+ //NUT: speciali presenti nell C_FunCall.
+
+ // 1 more input argument containing the values to be inserted in the matrix.
+ NInArg = NInArg + 1;
+ InArg(NInArg).Name = SharedInfo.Equal.InArg(SharedInfo.Equal.Nins).Name;
+ InArg(NInArg).Scope = SharedInfo.Equal.InArg(SharedInfo.Equal.Nins).Scope;
+elseif (ASTFunName == 'global')
+ SharedInfo.SkipNextEqual = 1;
+ SharedInfo.SkipNextFun = 1;
+ if (NInArg ~= 1)
+ PrintStringInfo(' ',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: Multiple declaration of global variables is not allowed.',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: See example below:',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: global var1 var2; //NOT ALLOWED',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: global var1; //ALLOWED',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: global var2; //ALLOWED',ReportFileName,'both','y');
+ PrintStringInfo(' ',ReportFileName,'both','y');
+ SCI2Cerror(' ');
+ end
+ if (NOutArg ~= 1)
+ PrintStringInfo(' ',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: Unexpected number of output arguments for global function.',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: Please report this error to:',ReportFileName,'both','y');
+ PrintStringInfo('SCI2CERROR: raffaele.nutricato@tiscali.it',ReportFileName,'both','y');
+ PrintStringInfo(' ',ReportFileName,'both','y');
+ SCI2Cerror(' ');
+ end
+end
+
+// --------------------------------------
+// --- Read the function annotations. ---
+// --------------------------------------
+if (ASTFunName == 'OpEqual')
+ FunTypeAnnot = '';
+ FunSizeAnnot = '';
+else
+ [FunTypeAnnot,FunSizeAnnot] = FA_GetFunAnn(NInArg,NOutArg,ASTFunName,FileInfo,SharedInfo);
+end
+
+// -------------------------------------------------------------------------------------------
+// --- Search for Equal Lhs and precision specifier to be applied to the current function. ---
+// -------------------------------------------------------------------------------------------
+[LhsArg,NLhsArg,FunPrecSpecifier,SharedInfo] = AST_GetPrecAndLhsArg(OutArg,NOutArg,ASTFunName,FunTypeAnnot,FunSizeAnnot,ASTFunType,FileInfo,SharedInfo);
+//NUT: questa funzione contiene troppi parametri e mi sembra disordinata.
+
+// --------------------------------
+// --- Input Arguments Section. ---
+// --------------------------------
+// --- Get Input Arguments info from their numerical value or from the symbol table. ---
+if (ASTFunName == 'global')
+ [TBFlagfound,TBType,TBSize,TBValue,TBFindLike,TBDimension,TBScope] = ...
+ ST_GetSymbolInfo(InArg(1).Name,FileInfo,SharedInfo);
+ if (TBFlagfound == 1)
+ InArg(1).Type = TBType;
+ InArg(1).Size = TBSize;
+ InArg(1).Value = TBValue;
+ InArg(1).FindLike = TBFindLike;
+ InArg(1).Dimension = TBDimension;
+ InArg(1).Scope = TBScope;
+ else
+ // That means it is the first time we encounter
+ // this global variable and in C this means that
+ // we don't have to do nothing.
+ // SharedInfo.SkipNextFun = SharedInfo.SkipNextFun + 1;
+ SharedInfo.SkipNextFun = 1;
+
+ InArg(1).Type = 'GBLToBeDefined';
+ InArg(1).Size(1) = 'GBLToBeDefined';
+ InArg(1).Size(2) = 'GBLToBeDefined';
+ InArg(1).Value = %nan;
+ InArg(1).FindLike = %nan;
+ InArg(1).Dimension = %nan;
+ InArg(1).Scope = 'Global';
+
+
+ ST_Set(InArg(1).Name,...
+ InArg(1).Type,...
+ InArg(1).Size,...
+ InArg(1).Value,...
+ InArg(1).FindLike,...
+ InArg(1).Dimension,...
+ FileInfo.GlobalVarFileName);
+ end
+else
+ [InArg,SharedInfo] = ST_GetInArgInfo(InArg,NInArg,FileInfo,SharedInfo);
+end
+
+// ---------------------------------
+// --- Output Arguments Section. ---
+// ---------------------------------
+// --- Update Out arg structure with info stored in the function annotations. ---
+if (ASTFunName == 'OpEqual')
+ for cntin = 1:NInArg
+ OutArg(cntin).Type = InArg(cntin).Type;
+ OutArg(cntin).Size = InArg(cntin).Size;
+ OutArg(cntin).Dimension = InArg(cntin).Dimension;
+ OutArg(cntin).Value = InArg(cntin).Value;
+ OutArg(cntin).FindLike = InArg(cntin).FindLike;
+ //NUT: forse qui occorre aggiungere lo scope che dovrebbe essere local or global.
+ //NUT: per ora lo scope viene settato da AST_ParseEqualStruct
+ end
+elseif ((ASTFunName == 'OpMinus') & (NInArg == 1) & (InArg(1).Dimension == 0)&(InArg(1).Scope == 'Number'))
+ // --- Manage OpMinus when applied to scalars. ---
+ // -1 is not translated as tmp = OpMinus(1), but
+ // it is considered as a single entity "-1"
+ SharedInfo.SkipNextFun = 1; //RN: SISTEMAMI
+ OutArg(1).Type = InArg(1).Type;
+ OutArg(1).Size = InArg(1).Size;
+ OutArg(1).Dimension = InArg(1).Dimension;
+ OutArg(1).Value = -InArg(1).Value;
+ OutArg(1).FindLike = InArg(1).FindLike;
+ OutArg(1).Scope = 'Number_'+InArg(1).Type;
+elseif ((ASTFunName == 'float') & (NInArg == 1) & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ // --- Manage OpMinus when applied to scalars. ---
+ // -1 is not translated as tmp = OpMinus(1), but
+ // it is considered as a single entity "-1"
+ SharedInfo.SkipNextFun = 1; //RN: SISTEMAMI
+ OutArg(1).Type = InArg(1).Type;
+ OutArg(1).Size = InArg(1).Size;
+ OutArg(1).Dimension = InArg(1).Dimension;
+ OutArg(1).Value = InArg(1).Value;
+ OutArg(1).FindLike = InArg(1).FindLike;
+ OutArg(1).Scope = 'Number_s';
+elseif ((ASTFunName == 'double') & (NInArg == 1) & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ // --- Manage OpMinus when applied to scalars. ---
+ // -1 is not translated as tmp = OpMinus(1), but
+ // it is considered as a single entity "-1"
+ SharedInfo.SkipNextFun = 1;
+ //RN: SISTEMAMI
+ SharedInfo.SkipNextFun = 1; //RN: SISTEMAMI
+ OutArg(1).Type = InArg(1).Type;
+ OutArg(1).Size = InArg(1).Size;
+ OutArg(1).Dimension = InArg(1).Dimension;
+ OutArg(1).Value = InArg(1).Value;
+ OutArg(1).FindLike = InArg(1).FindLike;
+ OutArg(1).Scope = 'Number_d';
+else
+ OutArg = FA_GetOutArgInfo(InArg,NInArg,OutArg,NOutArg,SharedInfo,FunPrecSpecifier,FunTypeAnnot,FunSizeAnnot,ReportFileName);
+end
+
+// --- Generate the names for the output arguments. ---
+// Update of OutArg.Name and OutArg.Scope fields.
+if ((ASTFunName == 'OpMinus') & (NInArg == 1) & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ OutArg(1).Name = string(OutArg(1).Value);
+elseif ((ASTFunName == 'float') & (NInArg == 1) & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ OutArg(1).Name = string(OutArg(1).Value);
+elseif ((ASTFunName == 'double') & (NInArg == 1) & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ OutArg(1).Name = string(OutArg(1).Value);
+else
+ [OutArg,SharedInfo] = GenOutArgNames(ASTFunName,InArg,NInArg,OutArg,NOutArg,LhsArg,NLhsArg,FileInfo,SharedInfo);
+end
+
+// --- Push in the AST stack the Output arguments. ---
+if (ASTFunName == 'OpEqual')
+ // Do nothing
+else
+ for counteroutargs = 1:NOutArg
+ tmppushstack = OutArg(counteroutargs).Scope+': '+OutArg(counteroutargs).Name;
+ AST_PushASTStack(tmppushstack);
+ end
+end
+
+//NUT: verificare se si puo' accorpare qualcosa qui sotto
+//RN: non capisco come mai analizzo lo scope dopo che faccio il push nello stack dove lo utilizzo!!!
+// --- Scope analysis of the output arguments. ---
+if (ASTFunName == 'OpMinus' & NInArg == 1 & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ // Scope already set above.
+elseif (ASTFunName == 'float' & NInArg == 1 & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ // Scope already set above.
+elseif (ASTFunName == 'double' & NInArg == 1 & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ // Scope already set above.
+else
+ OutArg = ST_AnalyzeScope(OutArg,NOutArg,FileInfo,SharedInfo);
+end
+
+// --- Check if the current function is handling for counter variables. ---
+[OutArg,SharedInfo] = ST_InsForCntVars(InArg,NInArg,OutArg,NOutArg,ASTFunName,FileInfo,SharedInfo);
+
+// --- Store the while condition variable (if any). ---
+SharedInfo = GetWhileCondVariable(OutArg,NOutArg,ASTFunName,FileInfo,SharedInfo);
+
+// --- Update Symbol Table with output arguments. ---
+if ((ASTFunName == 'OpMinus') & (NInArg == 1) & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ // A number is not inserted in the symbol table.
+elseif ((ASTFunName == 'float') & (NInArg == 1) & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ // A number is not inserted in the symbol table.
+elseif ((ASTFunName == 'double') & (NInArg == 1) & (InArg(1).Dimension == 0) & (InArg(1).Scope == 'Number'))
+ // A number is not inserted in the symbol table.
+else
+ ST_InsOutArg(OutArg,NOutArg,FileInfo,SharedInfo,'all');
+end
+//NUT: per risparmiare tempo di esecuzione puoi mettere delle if sulle funzioni che devono
+//NUT: essere skippate.
+
+// --------------------------------------------
+// --- Generate the C name of the function. ---
+// --------------------------------------------
+CFunName = C_GenerateFunName(ASTFunName,InArg,NInArg,OutArg,NOutArg);
+
+// -------------------------------------------------------------------------
+// --- Determine which library the function belongs to: USER2C or SCI2C. ---
+// -------------------------------------------------------------------------
+if SCI2Cfileexist(FileInfo.SCI2CLibCAnnFun,ASTFunName+'.ann')
+ LibTypeInfo = 'SCI2C';
+else
+ LibTypeInfo = 'USER2C';
+end
+
+// ---------------------------------------------------------------------------
+// --- Check existence of the FunInfo.dat file -> function already called. ---
+// ---------------------------------------------------------------------------
+FunInfoDatFileName = fullfile(FunInfoDatDir,CFunName+'.dat');
+if SCI2Cfileexist(FunInfoDatDir,CFunName+'.dat')
+ Flag_FunAlreadyCalled = 1;
+end
+
+// ----------------------------------
+// --- Generate FunInfo dat file. ---
+// ----------------------------------
+//NUT: questo .dat deve essere generato sempre perche' cambiano i nomi degli argomenti mentre il resto dovrebbe
+//NUT: essere tutto uguale
+//NUT: magari posso fare una funzione che inserisce solo i campi diversi e fa un check su quelli che
+//NUT: dovrebbero essere identici.
+GenCFunDatFiles(ASTFunName,FunPrecSpecifier,FunTypeAnnot,FunSizeAnnot,InArg,NInArg,OutArg,NOutArg,CFunName,LibTypeInfo,FunInfoDatDir);
+
+// -----------------------------------
+// --- Update SCI2C Function List. ---
+// -----------------------------------
+// Functions that are not already available in C are stored
+// in the SCI2C Function List and converted in C at the end of
+// the translation of the current .sci file.
+//NUT: il problema della d0d0OpEqual dovrebbe essere legato al fatto che cerco di fare la opequal legata alla ins...
+//NUT: devo evitare di scriveral dentro la lsista delle funzioni da tradurre.
+SharedInfo = FL_UpdateToBeConv(ASTFunName,CFunName,FunPrecSpecifier,FunTypeAnnot,FunSizeAnnot,InArg,NInArg,OutArg,NOutArg,FileInfo,SharedInfo);
+
+// -----------------------------------------------
+// --- Check on common input/output arguments. ---
+// -----------------------------------------------
+if (((ASTFunName=='OpEqual') & (SharedInfo.SkipNextEqual == 1)) | ...
+ SharedInfo.SkipNextFun > 0 | ...
+ ((sum(mtlb_strcmp(ASTFunName,SharedInfo.Annotations.DataPrec)) > 0) & (SharedInfo.SkipNextPrec == 1)))
+ // Do nothing
+else
+ AST_CheckCommonInOutArgs(InArg,NInArg,OutArg,NOutArg,ReportFileName);
+end
+
+// -----------------------------
+// --- C Generation Section. ---
+// -----------------------------
+// --- Load FunInfo structure. ---
+load(FunInfoDatFileName,'FunInfo');
+
+// --- Generate include. ---
+if ((Flag_FunAlreadyCalled == 0) & (FunInfo.LibTypeInfo == 'USER2C'))
+ PrintStringInfo('#include ""'+CFunName+'.h""',...
+ ReportFileName,'file','y');
+ PrintStringInfo('#include ""'+CFunName+'.h""',...
+ Pass1HeaderFileName,'file','y');
+end
+
+// --- Generate the C code for the current function. ---
+FlagCall = 1;
+SharedInfo = C_Funcall(FunInfo,FileInfo,SharedInfo,FlagCall);
+//NUT: anziche farla fare alla cfuncall l'aggiornamento delle skip metti qui una funzione dedicata a cio'
+//NUT: e' piu' ordinato.
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndProgram.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndProgram.sci
new file mode 100644
index 00000000..4d50317b
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndProgram.sci
@@ -0,0 +1,51 @@
+function SharedInfo = AST_HandleEndProgram(FileInfo,SharedInfo)
+// function SharedInfo = AST_HandleEndProgram(FileInfo,SharedInfo)
+// -----------------------------------------------------------------
+//
+// Status:
+// 12-Jun-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),2,2);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+CPass1FileName = FileInfo.Funct(nxtscifunnumber).CPass1FileName
+
+IndentLevel = SharedInfo.NIndent;
+CCall = '';
+PrintStepInfo('Handling EndProgram',ReportFileName,'file');
+tmpposfirstscalar = SharedInfo.CurrentFunInfo.PosFirstOutScalar;
+
+if (1==2)
+ //NUT: disabled because at the moment I am able to decode the return instruction.
+ if (SharedInfo.CurrentFunInfo.CFunctionName == SharedInfo.CMainFunName)
+ CCall = CCall+'return(0);';
+ else
+ if (SharedInfo.CurrentFunInfo.PosFirstOutScalar > 0)
+ CCall = CCall+'return('+SharedInfo.CurrentFunInfo.OutArg(tmpposfirstscalar).Name+');'
+ end
+ end
+
+ PrintStringInfo(C_IndentBlanks(IndentLevel)+CCall,CPass1FileName,'file','y');
+end
+
+
+SharedInfo.NIndent = SharedInfo.NIndent - 1;
+IndentLevel = SharedInfo.NIndent;
+PrintStringInfo(C_IndentBlanks(IndentLevel)+'}',CPass1FileName,'file','y');
+
+// --- Close the copy of the scilab file. ---
+mclose(FileInfo.Funct(nxtscifunnumber).SCICopyFileFid);
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndWhile.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndWhile.sci
new file mode 100644
index 00000000..952497cb
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleEndWhile.sci
@@ -0,0 +1,54 @@
+function SharedInfo = AST_HandleEndWhile(FileInfo,SharedInfo)
+// function SharedInfo = AST_HandleEndWhile(FileInfo,SharedInfo)
+// -----------------------------------------------------------------
+//
+// Status:
+// 15-Nov-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),2,2);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+CPass1FileName = FileInfo.Funct(nxtscifunnumber).CPass1FileName;
+CPass1WhileEpilFileName = FileInfo.Funct(nxtscifunnumber).CPass1WhileEpilFileName(SharedInfo.While.Level);
+
+CCall ='';
+// ---------------------------
+// --- End Initialization. ---
+// ---------------------------
+
+// ----------------------------
+// --- Generate the C code. ---
+// ----------------------------
+// --- Copy Epilogue into C code (Pass1) file. ---
+[CLinesArray,N_Lines] = File2StringArray(CPass1WhileEpilFileName);
+CLinesArray = stripblanks(CLinesArray);
+
+for tmpcnt = 1:N_Lines-1
+ PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent)+CLinesArray(tmpcnt),CPass1FileName,'file','y');
+end
+PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent-1)+CLinesArray(N_Lines),CPass1FileName,'file','y');
+
+// --------------------------
+// --- Update SharedInfo. ---
+// --------------------------
+SharedInfo.NIndent = SharedInfo.NIndent - 1;
+
+// -------------------------------
+// --- Delete temporary files. ---
+// -------------------------------
+SCI2Cmdelete(CPass1WhileEpilFileName);
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleHeader.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleHeader.sci
new file mode 100644
index 00000000..e7505bb4
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_HandleHeader.sci
@@ -0,0 +1,182 @@
+function SharedInfo = AST_HandleHeader(ASTHeader,FileInfo,SharedInfo)
+// function SharedInfo = AST_HandleHeader(ASTHeader,FileInfo,SharedInfo)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),3,3);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+
+FunctionName = ASTHeader.Name;
+if (mtlb_strcmp(ASTHeader.Name,SharedInfo.NextSCIFunName) == %F)
+ SCI2CerrorFile('Very strange! AST Name field ""'+ASTHeader.Name+...
+ '""is different from function name ""'+SharedInfo.NextSCIFunName+'"".',ReportFileName);
+end
+// ---------------------------
+// --- End Initialization. ---
+// ---------------------------
+
+// -------------------------------------
+// --- Extract info from AST header. ---
+// -------------------------------------
+TmpInNames = tokens(ASTHeader.Inputs,' ');
+TmpOutNames = tokens(ASTHeader.Outputs,' ');
+
+// Remove Variable: Number: or String: specifier.
+NInArg = 0;
+for tmpcnt = 1:size(TmpInNames,1)
+ TmpSingleName = TmpInNames(tmpcnt);
+ if ((TmpSingleName == 'Variable:') | ...
+ (TmpSingleName == 'String:') | ...
+ (TmpSingleName == 'Number:'))
+ // Skip the specifier.
+ else
+ NInArg = NInArg + 1;
+ InNames(NInArg) = TmpSingleName;
+ end
+end
+
+// Remove Variable: Number: or String: specifier.
+NOutArg = 0;
+for tmpcnt = 1:size(TmpOutNames,1)
+ TmpSingleName = TmpOutNames(tmpcnt);
+ if ((TmpSingleName == 'Variable:') | ...
+ (TmpSingleName == 'String:') | ...
+ (TmpSingleName == 'Number_x:') | ...
+ (TmpSingleName == 'Number_s:') | ...
+ (TmpSingleName == 'Number_d:') | ...
+ (TmpSingleName == 'Number_c:') | ...
+ (TmpSingleName == 'Number_z:'))
+ // Skip the specifier.
+ else
+ NOutArg = NOutArg + 1;
+ OutNames(NOutArg) = TmpSingleName;
+ end
+end
+
+if (mtlb_strcmp(InNames(1),'<empty>'))
+ NInArg = 0;
+else
+ NInArg = size(InNames,1);
+end
+
+if ((OutNames(1)=='<empty>') | (FunctionName == 'ins'))
+ //NUT: Force ins to have 0 args. Double check it.
+ NOutArg = 0;
+else
+ NOutArg = size(OutNames,1);
+end
+
+
+// -------------------------------------
+// --- Load the C function dat file. ---
+// -------------------------------------
+//NUT: This load is useful expecially for the second approach. In this case we are not using
+//NUT: the size info.
+load(fullfile(FileInfo.FunctionList.FunInfoDatDir,SharedInfo.NextCFunName+'.dat'),'FunInfo');
+
+SharedInfo.CurrentFunInfo = FunInfo;
+clear FunInfo
+
+// -----------------------------------------------------------------------------
+// --- Check coherence between In/Out names and In/Out Arg structure loaded. ---
+// -----------------------------------------------------------------------------
+if (length(SharedInfo.CurrentFunInfo.InArg(1).Name) > 0)
+ NInArgDat = size(SharedInfo.CurrentFunInfo.InArg,1);
+else
+ NInArgDat = 0;
+end
+
+if (NInArgDat == NInArg)
+ for tmpcnt = 1:NInArg
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Name = InNames(tmpcnt);
+ if (SharedInfo.CurrentFunInfo.InArg(tmpcnt).Dimension == 0)
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Size(1) = '1';
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Size(2) = '1';
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Value = %nan;
+ else
+ //NUT: using approach 1: Setting for input and output arguments symbolic sizes.
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Size(1) = '__'+SharedInfo.CurrentFunInfo.InArg(tmpcnt).Name+'Size[0]';
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Size(2) = '__'+SharedInfo.CurrentFunInfo.InArg(tmpcnt).Name+'Size[1]';
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Value = %nan;
+ end
+ end
+else
+ SCI2CerrorFile('Number of input arguments specified in AST is different from the number specified in .dat file.',ReportFileName);
+end
+
+
+if (SharedInfo.CurrentFunInfo.NOutArg == NOutArg)
+ for tmpcnt = 1:NOutArg
+ SharedInfo.CurrentFunInfo.OutArg(tmpcnt).Name = OutNames(tmpcnt);
+ end
+else
+ //
+end
+//NUT: using approach 1: Setting for input and output arguments symbolic sizes.
+SharedInfo.CurrentFunInfo.OutArg = ...
+ FA_GetOutArgInfo(SharedInfo.CurrentFunInfo.InArg,NInArg,...
+ SharedInfo.CurrentFunInfo.OutArg,NOutArg,...
+ SharedInfo,...
+ SharedInfo.CurrentFunInfo.FunPrecSpecifier,...
+ SharedInfo.CurrentFunInfo.FunTypeAnnot,SharedInfo.CurrentFunInfo.FunSizeAnnot,ReportFileName);
+
+// -------------------------------------------------------------------------
+// --- Stores InArg structure into the temporary variables symbol table. ---
+// -------------------------------------------------------------------------
+SymbTableFileName = FileInfo.Funct(nxtscifunnumber).LocalVarFileName;
+
+
+for tmpcnt = 1:NInArg
+
+ ST_Set(SharedInfo.CurrentFunInfo.InArg(tmpcnt).Name,...
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Type,...
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Size,...
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Value,...
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).FindLike,...
+ SharedInfo.CurrentFunInfo.InArg(tmpcnt).Dimension,...
+ SymbTableFileName);
+end
+
+// --------------------------------------------------------------------------
+// --- Stores OutArg structure into the temporary variables symbol table. ---
+// --------------------------------------------------------------------------
+//NUT: verifica se puoi usare l'outarg2symboltable qui.
+for tmpcnt = 1:NOutArg
+
+ ST_Set(SharedInfo.CurrentFunInfo.OutArg(tmpcnt).Name,...
+ SharedInfo.CurrentFunInfo.OutArg(tmpcnt).Type,...
+ SharedInfo.CurrentFunInfo.OutArg(tmpcnt).Size,...
+ SharedInfo.CurrentFunInfo.OutArg(tmpcnt).Value,...
+ SharedInfo.CurrentFunInfo.OutArg(tmpcnt).FindLike,...
+ SharedInfo.CurrentFunInfo.OutArg(tmpcnt).Dimension,...
+ SymbTableFileName);
+end
+
+// -----------------------------------------------
+// --- Check on common input/output arguments. ---
+// -----------------------------------------------
+AST_CheckCommonInOutArgs(SharedInfo.CurrentFunInfo.InArg,NInArg,SharedInfo.CurrentFunInfo.OutArg,NOutArg,ReportFileName);
+
+// ------------------------
+// --- Generate C code. ---
+// ------------------------
+FlagCall = 0;
+SharedInfo = C_Funcall(SharedInfo.CurrentFunInfo,FileInfo,SharedInfo,FlagCall);
+SharedInfo.NIndent = SharedInfo.NIndent+1; // Increase indentation level.
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseEqualStruct.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseEqualStruct.sci
new file mode 100644
index 00000000..50158a1a
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseEqualStruct.sci
@@ -0,0 +1,105 @@
+function [FunctionName,InArg,NInArg,OutArg,NOutArg] = AST_ParseEqualStruct(FileInfo,SharedInfo)
+// function [FunctionName,InArg,NInArg,OutArg,NOutArg] = AST_ParseEqualStruct(FileInfo,SharedInfo)
+// -----------------------------------------------------------------
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),2,2);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+
+global SCI2CSTACK
+global StackPosition;
+global STACKDEDUG
+
+
+// -------------------------------
+// --- Read Output parameters. ---
+// -------------------------------
+LhsField = AST_PopASTStack();
+NOutArg = 0;
+OutputArgumentNames = [];
+OutputArgumentScope = [];
+while (LhsField ~= 'Lhs :')
+ NOutArg = NOutArg + 1;
+ [OutputArgumentNames(NOutArg),OutputArgumentScope(NOutArg)] = AST_ExtractNameAndScope(LhsField);
+ LhsField = AST_PopASTStack();
+ if (LhsField == 'Expression:')
+ SCI2Cerror('Found Expression: before Lhs');
+ elseif (LhsField == 'Equal')
+ SCI2Cerror('Found Equal before Lhs');
+ end
+end
+OutputArgumentNames = SCI2Cflipud(OutputArgumentNames);
+OutputArgumentScope = SCI2Cflipud(OutputArgumentScope);
+
+// ------------------------------
+// --- Read input parameters. ---
+// ------------------------------
+ExprField = AST_PopASTStack();
+NInArg = 0;
+InputArgumentNames = [];
+while (ExprField ~= 'Expression:')
+ NInArg = NInArg + 1;
+ [InputArgumentNames(NInArg),InputArgumentScope(NInArg)] = AST_ExtractNameAndScope(ExprField);
+ ExprField = AST_PopASTStack();
+ if (ExprField == 'Equal')
+ SCI2Cerror('Found Equal before Lhs');
+ end
+end
+InputArgumentNames = SCI2Cflipud(InputArgumentNames);
+InputArgumentScope = SCI2Cflipud(InputArgumentScope);
+
+// ------------------------------
+// --- Extract function name. ---
+// ------------------------------
+FunctionName = AST_PopASTStack();
+if (FunctionName ~= 'Equal') then
+ SCI2Cerror('Problems with Equal, Expected Equal tag.');
+end
+FunctionName = 'OpEqual';
+
+// -------------------------------------
+// --- Generate the InArg structure. ---
+// -------------------------------------
+InArg = [];
+for counterinputargs = 1:NInArg
+ InArg(counterinputargs).Name=InputArgumentNames(counterinputargs);
+ InArg(counterinputargs).Scope=InputArgumentScope(counterinputargs);
+end
+
+// -------------------------------------
+// --- Generate the InArg structure. ---
+// -------------------------------------
+OutArg = [];
+for counteroutputargs = 1:NOutArg
+ OutArg(counteroutputargs).Name=OutputArgumentNames(counteroutputargs);
+ OutArg(counteroutputargs).Scope=OutputArgumentScope(counteroutputargs);
+end
+
+// ------------------------
+// --- Print Some Info. ---
+// ------------------------
+if (SharedInfo.Equal.Nins > 0)
+ if (NInArg ~= SharedInfo.Equal.Nins)
+ SCI2CerrorFile('Number of input arguments must be equal to number of ins functions.',ReportFileName);
+ end
+else
+ if (NInArg ~= NOutArg)
+ SCI2CerrorFile('Number of input arguments must be equal to number of output arguments.',ReportFileName);
+ end
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseFuncallStruct.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseFuncallStruct.sci
new file mode 100644
index 00000000..97a2bb3f
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseFuncallStruct.sci
@@ -0,0 +1,77 @@
+function [FunctionName,InArg,NInArg,NOutArg] = AST_ParseFuncallStruct(FileInfo,SharedInfo)
+// function [FunctionName,InArg,NInArg,NOutArg] = AST_ParseFuncallStruct(FileInfo,SharedInfo)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),2,2);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+
+global SCI2CSTACK
+global StackPosition;
+global STACKDEDUG
+
+
+// ------------------------------
+// --- Read input parameters. ---
+// ------------------------------
+RhsField = AST_PopASTStack();
+NInArg = 0;
+while (RhsField ~= 'Rhs :')
+ NInArg = NInArg + 1;
+ [InputArgumentNames(NInArg),InputArgumentScope(NInArg)] = AST_ExtractNameAndScope(RhsField);
+ RhsField = AST_PopASTStack();
+ if (RhsField == '#lhs :')
+ SCI2Cerror('Found #lhs before Rhs');
+ elseif (RhsField == 'Funcall :')
+ SCI2Cerror('Found Funcall before Rhs');
+ end
+end
+if (stripblanks(InputArgumentNames(NInArg)) == '<empty>')
+ NInArg = 0;
+ InputArgumentNames = [];
+ InputArgumentScope = [];
+end
+InputArgumentNames = SCI2Cflipud(InputArgumentNames);
+InputArgumentScope = SCI2Cflipud(InputArgumentScope);
+
+// --------------------------------------------
+// --- Extract number of output parameters. ---
+// --------------------------------------------
+buffstring = AST_PopASTStack();
+NOutArg = eval(stripblanks(part(buffstring,10:length(buffstring))));
+
+// ------------------------------
+// --- Extract function name. ---
+// ------------------------------
+buffstring = AST_PopASTStack();
+FunctionName = stripblanks(part(buffstring,12:length(buffstring)));
+
+// -------------------------------------
+// --- Generate the InArg structure. ---
+// -------------------------------------
+InArg = [];
+for counterinputargs = 1:NInArg
+ if (InputArgumentNames(counterinputargs) == 'r')
+ InputArgumentNames(counterinputargs) = 'rr'; //NUT: per ora cerco di risolvere cosi' il baco sulla 'r'
+ end
+ InArg(counterinputargs).Name=InputArgumentNames(counterinputargs);
+ InArg(counterinputargs).Scope=InputArgumentScope(counterinputargs);
+end
+
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseIfExprStruct.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseIfExprStruct.sci
new file mode 100644
index 00000000..f80b07e5
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseIfExprStruct.sci
@@ -0,0 +1,74 @@
+function [IfCondArg,NIfCondArg] = AST_ParseIfExprStruct(FileInfo,SharedInfo,ASTIfExpType)
+// function [IfCondArg,NIfCondArg] = AST_ParseIfExprStruct(FileInfo,SharedInfo,ASTIfExpType)
+// -----------------------------------------------------------------
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),3,3);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+IfCondArg = [];
+NIfCondArg = 0;
+
+global SCI2CSTACK
+global StackPosition;
+global STACKDEDUG
+// ---------------------------
+// --- End Initialization. ---
+// ---------------------------
+
+// ------------------------------------
+// --- Read if condition variables. ---
+// ------------------------------------
+flagendpop = 0;
+IfExprField = AST_PopASTStack();
+if (ASTIfExpType=='if')
+ if (IfExprField=='Expression:')
+ flagendpop = 1;
+ IfExprField = AST_PopASTStack();
+ end
+elseif (ASTIfExpType=='elseif')
+ if (IfExprField=='Else If Expression')
+ flagendpop = 1;
+ end
+else
+ SCI2CerrorFile('Unknown ASTIfExpType ""'+ASTIfExpType+'"".',ReportFileName);
+end
+
+while (flagendpop == 0)
+ if (IfExprField~='<EOL>')
+ if (ASTIfExpType=='if')
+ if (IfExprField=='Expression:')
+ flagendpop = 1;
+ IfExprField = AST_PopASTStack();
+ else
+ NIfCondArg = NIfCondArg + 1;
+ [IfCondArg(NIfCondArg),tmpscope] = AST_ExtractNameAndScope(IfExprField);
+ end
+ elseif (ASTIfExpType=='elseif')
+ if (IfExprField=='Else If Expression')
+ flagendpop = 1;
+ else
+ NIfCondArg = NIfCondArg + 1;
+ IfCondArg(NIfCondArg) = IfExprField;
+ [IfCondArg(NIfCondArg),tmpscope] = AST_ExtractNameAndScope(IfExprField);
+ end
+ end
+ end
+ IfExprField = AST_PopASTStack();
+end
+
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseOperStruct.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseOperStruct.sci
new file mode 100644
index 00000000..4061d07c
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_ParseOperStruct.sci
@@ -0,0 +1,64 @@
+function [FunctionName,InArg,NInArg,NOutArg] = AST_ParseOperStruct(FileInfo,SharedInfo)
+// function [FunctionName,InArg,NInArg,NOutArg] = AST_ParseOperStruct(FileInfo,SharedInfo)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+SCI2CNInArgCheck(argn(2),2,2);
+
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+
+global SCI2CSTACK
+global StackPosition;
+global STACKDEDUG
+
+buffstring = AST_PopASTStack();
+LabelFunctName = 'Operator: ';
+FunctionName = stripblanks(part(buffstring,length(LabelFunctName)+1:length(buffstring)));
+FunctionName = Operator2FunName(FunctionName);
+
+RhsField = AST_PopASTStack();
+NInArg = 0;
+while (RhsField ~= 'Operands:')
+ NInArg = NInArg + 1;
+ [InputArgumentNames(NInArg),InputArgumentScope(NInArg)] = AST_ExtractNameAndScope(RhsField);
+ RhsField = AST_PopASTStack();
+ if (RhsField == 'Operation')
+ SCI2Cerror('Found Operation before Rhs');
+ end
+end
+
+if (stripblanks(InputArgumentNames(NInArg)) == '<empty>')
+ NInArg = 0;
+ InputArgumentNames = [];
+ InputArgumentScope = [];
+end
+InputArgumentNames = SCI2Cflipud(InputArgumentNames);
+InputArgumentScope = SCI2Cflipud(InputArgumentScope);
+
+OperationField = AST_PopASTStack();
+if (OperationField ~= 'Operation') then
+ SCI2Cerror('Problems with Operation, Expected Operation tag.');
+end
+
+if (FunctionName == 'ins')
+ NOutArg = 0; // It is always 1. Double check it!
+else
+ NOutArg = 1; // It is always 1. Double check it!
+end
+
+InArg = [];
+for counterinputargs = 1:NInArg
+ InArg(counterinputargs).Name=InputArgumentNames(counterinputargs);
+ InArg(counterinputargs).Scope=InputArgumentScope(counterinputargs);
+end
+
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_PopSCI2CStack.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_PopSCI2CStack.sci
new file mode 100644
index 00000000..d32cb400
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_PopSCI2CStack.sci
@@ -0,0 +1,29 @@
+function stackelement = AST_PopASTStack()
+// function stackelement = AST_PopASTStack()
+// -----------------------------------------------------------------
+// Status:
+// 11-Aug-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+SCI2CNInArgCheck(argn(2),0,0);
+
+global SCI2CSTACK;
+global StackPosition;
+global STACKDEDUG;
+
+if StackPosition == 1
+ SCI2Cerror('Stack empty. Cannot pop from stack.');
+end
+
+stackelement = SCI2CSTACK(StackPosition,1);
+SCI2CSTACK = SCI2CSTACK(1:StackPosition-1);
+StackPosition = StackPosition - 1;
+
+if (STACKDEDUG == 1)
+ AST_DisplayStack();
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_PushSCI2CStack.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_PushSCI2CStack.sci
new file mode 100644
index 00000000..130f300f
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_PushSCI2CStack.sci
@@ -0,0 +1,26 @@
+function AST_PushASTStack(stackelement)
+// function AST_PushASTStack(stackelement)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Aug-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+SCI2CNInArgCheck(argn(2),1,1);
+
+
+global SCI2CSTACK
+global StackPosition;
+global STACKDEDUG
+
+StackPosition = StackPosition + 1;
+SCI2CSTACK(StackPosition,1) = stackelement;
+
+if (STACKDEDUG == 1)
+ AST_DisplayStack();
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_ReadASTHeader.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_ReadASTHeader.sci
new file mode 100644
index 00000000..cf92d881
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_ReadASTHeader.sci
@@ -0,0 +1,76 @@
+function ASTHeader = AST_ReadASTHeader(fidAST,ReportFileName)
+// function ASTHeader = AST_ReadASTHeader(fidAST,ReportFileName)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),2,2);
+
+
+ASTHeader = [];
+
+tline = mgetl(fidAST,1);
+AST_CheckLineLength(tline);
+treeline = stripblanks(tline);
+if STACKDEDUG == 1
+ disp('Read AST Line: '+treeline);
+end
+if (SCI2Cstrncmps1size('Program',treeline) == 0)
+ SCI2CerrorFile('Expected ""Program"" label in the AST',ReportFileName);
+end
+
+tline = mgetl(fidAST,1);
+AST_CheckLineLength(tline);
+treeline = stripblanks(tline);
+if STACKDEDUG == 1
+ disp('Read AST Line: '+treeline);
+end
+if (SCI2Cstrncmps1size('Name : ',treeline) == 0)
+ SCI2CerrorFile('Expected ""Name : "" label in the AST',ReportFileName);
+else
+ ASTHeader.Name = stripblanks(part(treeline,length('Name : ')+1:length(treeline)));
+end
+
+tline = mgetl(fidAST,1);
+AST_CheckLineLength(tline);
+treeline = stripblanks(tline);
+if STACKDEDUG == 1
+ disp('Read AST Line: '+treeline);
+end
+if (SCI2Cstrncmps1size('Outputs: ',treeline) == 0)
+ SCI2CerrorFile('Expected ""Outputs: "" label in the AST',ReportFileName);
+else
+ ASTHeader.Outputs = stripblanks(part(treeline,length('Outputs: ')+1:length(treeline)));
+end
+
+tline = mgetl(fidAST,1);
+AST_CheckLineLength(tline);
+treeline = stripblanks(tline);
+if STACKDEDUG == 1
+ disp('Read AST Line: '+treeline);
+end
+if (SCI2Cstrncmps1size('Inputs : ',treeline) == 0)
+ SCI2CerrorFile('Expected ""Inputs : "" label in the AST',ReportFileName);
+else
+ ASTHeader.Inputs = stripblanks(part(treeline,length('Inputs : ')+1:length(treeline)));
+end
+
+tline = mgetl(fidAST,1);
+AST_CheckLineLength(tline);
+treeline = stripblanks(tline);
+if STACKDEDUG == 1
+ disp('Read AST Line: '+treeline);
+end
+if (SCI2Cstrncmps1size('Statements ',treeline) == 0)
+ SCI2CerrorFile('Expected ""Statements "" label in the AST',ReportFileName);
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/AST_ReadEqualRhsNames.sci b/src/Scilab2C/Scilab2C/ASTManagement/AST_ReadEqualRhsNames.sci
new file mode 100644
index 00000000..f4424de5
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/AST_ReadEqualRhsNames.sci
@@ -0,0 +1,48 @@
+function [RhsNames,RhsScope,NRhs] = AST_ReadEqualRhsNames(FileInfo,SharedInfo)
+// function [RhsNames,RhsScope,NRhs] = AST_ReadEqualRhsNames(FileInfo,SharedInfo)
+// -----------------------------------------------------------------
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+// ------------------------------
+// --- Check input arguments. ---
+// ------------------------------
+SCI2CNInArgCheck(argn(2),2,2);
+
+// -----------------------
+// --- Initialization. ---
+// -----------------------
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+
+global SCI2CSTACK
+global StackPosition;
+global STACKDEDUG
+
+
+// -------------------------------
+// --- Read Output parameters. ---
+// -------------------------------
+cntpop = 1;
+NRhs = 0;
+RhsField(cntpop) = AST_PopASTStack();
+RhsNames = [];
+while (RhsField(cntpop) ~= 'Expression:')
+ NRhs = NRhs + 1;
+ [RhsNames(NRhs),RhsScope(NRhs)] = AST_ExtractNameAndScope(RhsField(cntpop));
+ cntpop = cntpop + 1;
+ RhsField(cntpop) = AST_PopASTStack();
+end
+RhsNames = SCI2Cflipud(RhsNames);
+RhsScope = SCI2Cflipud(RhsScope);
+
+for cntpush = cntpop:-1:1
+ AST_PushASTStack(RhsField(cntpush));
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/GenOutArgNames.sci b/src/Scilab2C/Scilab2C/ASTManagement/GenOutArgNames.sci
new file mode 100644
index 00000000..1107f321
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/GenOutArgNames.sci
@@ -0,0 +1,49 @@
+function [OutArg,SharedInfo] = GenOutArgNames(FunctionName,InArg,NInArg,OldOutArg,NOutArg,LhsArg,NLhsArg,FileInfo,SharedInfo)
+// function [OutArg,SharedInfo] = GenOutArgNames(FunctionName,OutArg,NOutArg,LhsArg,NLhsArg,FileInfo,SharedInfo)
+// -----------------------------------------------------------------
+//
+// Status:
+// 11-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+SCI2CNInArgCheck(argn(2),9,9);
+
+nxtscifunname = SharedInfo.NextSCIFunName;
+nxtscifunnumber = SharedInfo.NextSCIFunNumber;
+ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName;
+OutArg = OldOutArg;
+
+if (NLhsArg > 0)
+ if (NLhsArg ~= NOutArg)
+ SCI2CerrorFile('NLhsArg='+string(NLhsArg)+' must be equal to NOutArg='+string(NOutArg)+'.',ReportFileName);
+ end
+ for counteroutputargs = 1:NOutArg
+ OutArg(counteroutputargs).Name=LhsArg(counteroutputargs).Name;
+ OutArg(counteroutputargs).Scope=LhsArg(counteroutputargs).Scope;
+ end
+else
+ if ((sum(mtlb_strcmp(FunctionName,SharedInfo.Annotations.DataPrec)) > 0) & ...
+ (SharedInfo.SkipNextPrec == 1))
+ for counteroutputargs = 1:NOutArg
+ OutArg(counteroutputargs).Name = InArg(counteroutputargs).Name;
+ end
+ elseif (mtlb_strcmp(FunctionName,'OpEqual'))
+ else
+ for counteroutputargs = 1:NOutArg
+ if ((SharedInfo.ASTReader.EnableTempVarsReuse == 1) & ...
+ (length(SharedInfo.ASTReader.ReusableTempVars) > 0))
+ TmpOutArgName = strcat([SharedInfo.ASTReader.TempVarsName,string(SharedInfo.ASTReader.ReusableTempVars(1))]);
+ SharedInfo.ASTReader.ReusableTempVars = SharedInfo.ASTReader.ReusableTempVars(2:$);
+ else
+ SharedInfo.ASTReader.UsedTempVars = SharedInfo.ASTReader.UsedTempVars + 1;
+ TmpOutArgName = strcat([SharedInfo.ASTReader.TempVarsName,string(SharedInfo.ASTReader.UsedTempVars)]);
+ end
+ OutArg(counteroutputargs).Name=TmpOutArgName;
+ end
+ end
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/Operator2FunName.sci b/src/Scilab2C/Scilab2C/ASTManagement/Operator2FunName.sci
new file mode 100644
index 00000000..89cea7fb
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/Operator2FunName.sci
@@ -0,0 +1,101 @@
+function FunName = Operator2FunName(OperatorName);
+// -----------------------------------------------------------------
+//
+// Status:
+// 29-May-2007 -- Nutricato Raffaele: Changed code into a function.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+
+SCI2CNInArgCheck(argn(2),1,1);
+
+FuncPrefix = 'Op';
+FuncSuffix = '';
+
+if (OperatorName == '+')
+ FunName = FuncPrefix+'Plus'+FuncSuffix;
+elseif (OperatorName == '-')
+ FunName = FuncPrefix+'Minus'+FuncSuffix;
+elseif (OperatorName == '*')
+ FunName = FuncPrefix+'Star'+FuncSuffix;
+elseif (OperatorName == '.*')
+ FunName = FuncPrefix+'DotStar'+FuncSuffix;
+elseif (OperatorName == '*.')
+ PrintStringInfo('SCI2CERROR: Operator ""'+OperatorName+'"" not supported.','','stout','y');
+ SCI2Cerror(' ');
+elseif (OperatorName == '.*.')
+ PrintStringInfo('SCI2CERROR: Operator ""'+OperatorName+'"" not supported.','','stout','y');
+ SCI2Cerror(' ');
+elseif (OperatorName == '/')
+ FunName = FuncPrefix+'Slash'+FuncSuffix;
+elseif (OperatorName == './')
+ FunName = FuncPrefix+'DotSlash'+FuncSuffix;
+elseif (OperatorName == '/.')
+ PrintStringInfo('SCI2CERROR: Operator ""'+OperatorName+'"" not supported.','','stout','y');
+ SCI2Cerror(' ');
+elseif (OperatorName == './.')
+ PrintStringInfo('SCI2CERROR: Operator ""'+OperatorName+'"" not supported.','','stout','y');
+ SCI2Cerror(' ');
+elseif (OperatorName == '.\')
+ FunName = FuncPrefix+'DotBackSlash'+FuncSuffix;
+elseif (OperatorName == '\\')
+ PrintStringInfo('SCI2CERROR: Operator ""'+OperatorName+'"" not supported.','','stout','y');
+ SCI2Cerror(' ');
+elseif (OperatorName == '.\\')
+ PrintStringInfo('SCI2CERROR: Operator ""'+OperatorName+'"" not supported.','','stout','y');
+ SCI2Cerror(' ');
+elseif (OperatorName == '\\.')
+ PrintStringInfo('SCI2CERROR: Operator ""'+OperatorName+'"" not supported.','','stout','y');
+ SCI2Cerror(' ');
+elseif (OperatorName == '.\\.')
+ PrintStringInfo('SCI2CERROR: Operator ""'+OperatorName+'"" not supported.','','stout','y');
+ SCI2Cerror(' ');
+elseif (OperatorName == '^')
+ FunName = FuncPrefix+'Hat'+FuncSuffix;
+elseif (OperatorName == '.^')
+ FunName = FuncPrefix+'DotHat'+FuncSuffix;
+elseif (OperatorName == '''')
+ FunName = FuncPrefix+'Apex'+FuncSuffix;
+elseif (OperatorName == '.''')
+ FunName = FuncPrefix+'DotApex'+FuncSuffix;
+elseif (OperatorName == '==')
+ FunName = FuncPrefix+'LogEq'+FuncSuffix;
+elseif (OperatorName == '<')
+ FunName = FuncPrefix+'LogLt'+FuncSuffix;
+elseif (OperatorName == '>')
+ FunName = FuncPrefix+'LogGt'+FuncSuffix;
+elseif (OperatorName == '<=')
+ FunName = FuncPrefix+'LogLe'+FuncSuffix;
+elseif (OperatorName == '>=')
+ FunName = FuncPrefix+'LogGe'+FuncSuffix;
+elseif (OperatorName == '~=')
+ FunName = FuncPrefix+'LogNe'+FuncSuffix;
+elseif (OperatorName == '<>')
+ FunName = FuncPrefix+'LogNe'+FuncSuffix;
+elseif (OperatorName == '|')
+ FunName = FuncPrefix+'LogOr'+FuncSuffix;
+elseif (OperatorName == '&')
+ FunName = FuncPrefix+'LogAnd'+FuncSuffix;
+elseif (OperatorName == '~')
+ FunName = FuncPrefix+'LogNot'+FuncSuffix;
+elseif (OperatorName == ':')
+ FunName = FuncPrefix+'Colon'+FuncSuffix;
+elseif (OperatorName == 'rc')
+ FunName = 'OpRc';
+elseif (OperatorName == 'cc')
+ FunName = 'OpCc';
+elseif (OperatorName == 'ins')
+ FunName = 'OpIns';
+elseif (OperatorName == 'ext')
+ FunName = 'OpExt';
+elseif (OperatorName == 'cceol')
+ PrintStringInfo('SCI2CERROR: Operator ""'+OperatorName+'"" not supported.','','stout','y');
+ SCI2Cerror(' ');
+else
+ PrintStringInfo('SCI2CERROR: Unknown Operator ""'+OperatorName+'.','','stout','y');
+ SCI2Cerror(' ');
+end
+
+endfunction
diff --git a/src/Scilab2C/Scilab2C/ASTManagement/SciFile2ASTFile.sci b/src/Scilab2C/Scilab2C/ASTManagement/SciFile2ASTFile.sci
new file mode 100644
index 00000000..ed377eb8
--- /dev/null
+++ b/src/Scilab2C/Scilab2C/ASTManagement/SciFile2ASTFile.sci
@@ -0,0 +1,23 @@
+function SciFile2ASTFile(SciFile,ASTFile);
+// function SciFile2ASTFile(SciFile,ASTFile);
+// -----------------------------------------------------------------
+//
+// Status:
+// 12-Apr-2007 -- Raffaele Nutricato: Author.
+//
+// Copyright 2007 Raffaele Nutricato.
+// Contact: raffaele.nutricato@tiscali.it
+// -----------------------------------------------------------------
+
+getf(SciFile);
+[tmppath,ScilabFunName,tmpext] = fileparts(SciFile);
+AST=eval('macr2tree('+ScilabFunName+')');
+
+
+[ASTx,ASTierr]=fileinfo(ASTFile);
+if ASTierr == 0
+ mdelete(ASTFile);
+end
+write(ASTFile,string(AST));
+
+endfunction