function ST_InsOutArg(OutArg,NOutArg,FileInfo,SharedInfo,MatchRule) // function ST_InsOutArg(OutArg,NOutArg,FileInfo,SharedInfo,MatchRule) // ----------------------------------------------------------------- // //NUT: add description here // // Input data: // //NUT: add description here // // Output data: // //NUT: add description here // // Status: // 26-Oct-2007 -- Raffaele Nutricato: Author. // 26-Oct-2007 -- Alberto Morea: Test Ok. // // Copyright 2007 Raffaele Nutricato & Alberto Morea. // Contact: raffaele.nutricato@tiscali.it // ----------------------------------------------------------------- // ------------------------------ // --- Check input arguments. --- // ------------------------------ SCI2CNInArgCheck(argn(2),5,5); // ----------------------- // --- Initialization. --- // ----------------------- nxtscifunname = SharedInfo.NextSCIFunName; nxtscifunnumber = SharedInfo.NextSCIFunNumber; ReportFileName = FileInfo.Funct(nxtscifunnumber).ReportFileName; CDeclarationFileName = FileInfo.Funct(nxtscifunnumber).CDeclarationFileName; CGblDeclarFileName = FileInfo.Funct(nxtscifunnumber).CGblDeclarFileName; GlobalVarsFileName = FileInfo.GlobalVarFileName; LocalVarsFileName = FileInfo.Funct(nxtscifunnumber).LocalVarFileName; TempVarsFileName = FileInfo.Funct(nxtscifunnumber).TempVarFileName; CPass1FileName = FileInfo.Funct(nxtscifunnumber).CPass1FileName; CPass1FreeFileName = FileInfo.Funct(nxtscifunnumber).CPass1FreeFileName; // #RNU_RES_B PrintStringInfo(' ',ReportFileName,'file','y'); PrintStringInfo('***Putting output arguments in the symbol table***',ReportFileName,'file','y','n'); // #RNU_RES_E // --------------------------- // --- End Initialization. --- // --------------------------- for counteroutput = 1:NOutArg // #RNU_RES_B PrintStringInfo(' Symbol ""'+OutArg(counteroutput).Name+'""',ReportFileName,'file','y','n'); PrintStringInfo(' Type: '+OutArg(counteroutput).Type,ReportFileName,'file','y','n'); PrintStringInfo(' Size(1): '+string(OutArg(counteroutput).Size(1)),ReportFileName,'file','y','n'); PrintStringInfo(' Size(2): '+string(OutArg(counteroutput).Size(2)),ReportFileName,'file','y','n'); PrintStringInfo(' Value: '+string(OutArg(counteroutput).Value),ReportFileName,'file','y','n'); PrintStringInfo(' FindLike: '+string(OutArg(counteroutput).FindLike),ReportFileName,'file','y','n'); PrintStringInfo(' Dimension: '+string(OutArg(counteroutput).Dimension),ReportFileName,'file','y','n'); PrintStringInfo(' Scope: '+string(OutArg(counteroutput).Scope),ReportFileName,'file','y','n'); PrintStringInfo(' ',ReportFileName,'file','y','n'); // #RNU_RES_E if (OutArg(counteroutput).Scope == 'Temp') SymbTableFileName = TempVarsFileName; elseif (OutArg(counteroutput).Scope == 'Local') SymbTableFileName = LocalVarsFileName; elseif (OutArg(counteroutput).Scope == 'Global') SymbTableFileName = GlobalVarsFileName; else error(9999, 'Unknown scope ""'+OutArg(counteroutput).Scope+'"" for symbol: '+OutArg(counteroutput).Name); end // #RNU_RES_B PrintStringInfo(' Setting symbol ""'+OutArg(counteroutput).Name+'"" in '+SymbTableFileName+'.',ReportFileName,'file','y'); // #RNU_RES_E // #RNU_RES_B // Check existence and conflicts in the symbol table. // Here we have four possibilities: // 1. the symbol is a global variable not initialized yet -> we have to initialize it. // 2. the symbol already exists with different settings -> we have to issue an error. // 3. the symbol already exists with the same settings -> ok, we don't have to do nothing. // 4. the symbol doesn't exist -> we have to insert it into the table. // #RNU_RES_E [TBFlagfound,TBFlagEqualSymbols] = ... ST_MatchSymbol(OutArg(counteroutput).Name,... OutArg(counteroutput).Type,... OutArg(counteroutput).Size,... OutArg(counteroutput).Value,... OutArg(counteroutput).FindLike,... OutArg(counteroutput).Dimension,... SymbTableFileName,MatchRule); if (TBFlagfound == 1) if (TBFlagEqualSymbols == 0) PrintStringInfo(' ',ReportFileName,'both','y'); PrintStringInfo('SCI2CERROR: Symbol Table Conflict. Trying to insert again symbol ""'+... OutArg(counteroutput).Name+'"" with different settings',ReportFileName,'both','y'); PrintStringInfo('SCI2CERROR: Please check that you are not using variable ""'+OutArg(counteroutput).Name+'""',ReportFileName,'both','y'); PrintStringInfo('SCI2CERROR: with different sizes and/or types.',ReportFileName,'both','y'); PrintStringInfo(' ',ReportFileName,'both','y'); error(9999, 'SCI2CERROR: Symbol Table Conflict. Trying to insert again symbol ""'+... OutArg(counteroutput).Name+'"" with different settings'); else // #RNU_RES_B // It's ok symbols do match. //NUT: forse occorre un altro check sulla size per capire se occore fare il malloc. //NUT: qui entro anche quando ho una variabile global gia' dichiarata tale in un altro //NUT: per cui devo dichiararala come external. //RNU qui ci puoi mettere una warning quando stai riallocando uno stesso simbolo con size simbolica. //RNU puoi anche aggiungere del codice in c o un semplice commento. per esempio una funzione c del tipo checksize che controlla il valore //RNU prima dopo delle size di una data variabile. Cosa succede se cambio la size anche nel caso di array e approccio //RNU di resize non attivo? L'unica cosa e' che molte size numeriche scompaiono e incomincio a creare numerose variabili //RNU con size simbolica. // If the symbol is scalar we update its value if it is an array we update its size // only in case we are using the 'REALLOC_ALL_RESIZE_ALL' resize approach // #RNU_RES_E if ((GetSymbolDimension(OutArg(counteroutput).Size)) == 0 | (SharedInfo.ResizeApproach=='REALLOC_ALL_RESIZE_ALL')) ST_Set(OutArg(counteroutput).Name,... OutArg(counteroutput).Type,... OutArg(counteroutput).Size,... OutArg(counteroutput).Value,... OutArg(counteroutput).FindLike,... OutArg(counteroutput).Dimension,... SymbTableFileName); end // IndentLevelDeclaration = 1; //NUT: per ora lo forzo sempre a 1 // IndentLevelMalloc = SharedInfo.NIndent; // FlagExt = 0; // C_GenDeclarations(OutArg(counteroutput),CDeclarationFileName,IndentLevelDeclaration,ReportFileName,FlagExt,SharedInfo.ResizeApproach); end elseif (TBFlagfound == 2) // #RNU_RES_B // We have a non-initialized global variable. // Set the non-initialized global variable. PrintStringInfo(' Found a non-initialized global variable.',ReportFileName,'file','y'); // #RNU_RES_E ST_Set(OutArg(counteroutput).Name,... OutArg(counteroutput).Type,... OutArg(counteroutput).Size,... OutArg(counteroutput).Value,... OutArg(counteroutput).FindLike,... OutArg(counteroutput).Dimension,... SymbTableFileName); IndentLevel = 0; //NUT: forced always to 1 FlagExt = 0; C_GenDeclarations(OutArg(counteroutput),CGblDeclarFileName,IndentLevel,ReportFileName,FlagExt,SharedInfo.ResizeApproach); IndentLevelMalloc = SharedInfo.NIndent; // #RNU_RES_B //RNU da verificare bene qui. Cio' che si verifica e' che se la size della globale e' simbolica //RNU allora si assume che essa sia da allocare come puntatore e poi realloc. // #RNU_RES_E C_MemAllocOutTempVars(OutArg(counteroutput),1,CPass1FileName,CPass1FreeFileName,IndentLevelMalloc,ReportFileName,SharedInfo.ResizeApproach); else if (OutArg(counteroutput).FindLike == 1) // #RNU_RES_B // In presence of find-like functions the size must be always symbolic. // Don't change here the value of OutArg.Size because the first time // I need them to declare the OutArg variable with the values assumed by OutArg.Size. // #RNU_RES_E TmpOutArgSize(1) = '__'+OutArg(counteroutput).Name+'Size[0]'; TmpOutArgSize(2) = '__'+OutArg(counteroutput).Name+'Size[1]'; else TmpOutArgSize(1) = OutArg(counteroutput).Size(1); TmpOutArgSize(2) = OutArg(counteroutput).Size(2); end // #RNU_RES_B // Set a new symbol. // #RNU_RES_E ST_Set(OutArg(counteroutput).Name,... OutArg(counteroutput).Type,... TmpOutArgSize,... OutArg(counteroutput).Value,... OutArg(counteroutput).FindLike,... OutArg(counteroutput).Dimension,... SymbTableFileName); IndentLevelDeclaration = 1; //NUT: per ora lo forzo sempre a 1 IndentLevelMalloc = SharedInfo.NIndent; FlagExt = 0; C_GenDeclarations(OutArg(counteroutput),CDeclarationFileName,IndentLevelDeclaration,ReportFileName,FlagExt,SharedInfo.ResizeApproach); // #RNU_RES_B //RNU aggiunta qui in modo che le malloc saranno fatte una sola volta: //RNU verifica che tutto funzioni e chi altro usa la C_MemAlloc per capire se si puo' ottimizzare per questo stadio. // #RNU_RES_E C_MemAllocOutTempVars(OutArg(counteroutput),1,CPass1FileName,CPass1FreeFileName,IndentLevelMalloc,ReportFileName,SharedInfo.ResizeApproach); end end endfunction