function SharedInfo = C_ForExpression(FileInfo,SharedInfo) // function SharedInfo = C_ForExpression(FileInfo,SharedInfo) // ----------------------------------------------------------------- // Get function for a generic SCI2C table. // // Input data: // //NUT: add description here // // Output data: // //NUT: add description here // // 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; CPass1ForProlFileName = FileInfo.Funct(nxtscifunnumber).CPass1ForProlFileName(SharedInfo.For.Level); CDeclarationFileName = FileInfo.Funct(nxtscifunnumber).CDeclarationFileName; CPass1ForEpilFileName = FileInfo.Funct(nxtscifunnumber).CPass1ForEpilFileName(SharedInfo.For.Level); // #RNU_RES_B PrintStringInfo(' ',ReportFileName,'file','y'); PrintStringInfo('***Generating C code***',ReportFileName,'file','y','n'); // #RNU_RES_E CCall =''; // --------------------------- // --- End Initialization. --- // --------------------------- // ---------------------------- // --- Generate the C call. --- // ---------------------------- // ------------------------- // --- Manage all cases. --- // ------------------------- if (SharedInfo.ForExpr.AssignmentFun == SharedInfo.CFunId.EqScalar) // #RNU_RES_B // --------------- // --- Case 1. --- // --------------- PrintStringInfo(' Handling For Expression with scalar equal.',ReportFileName,'file','y'); // for a = 10 or for a = sin(tan(b)) where b is scalar: // In this case non for loops are needed.--> Do nothing! // ------------------------------------------------------------------------------------- // --- Generate Prologue and Epilogue -> Copy the first N-1 lines of the for.c code. --- // ------------------------------------------------------------------------------------- // #RNU_RES_E [C_Strings,NumCStrings] = File2StringArray(FileInfo.Funct(nxtscifunnumber).CPass1ForProlFileName(SharedInfo.For.Level)); C_Strings = stripblanks(C_Strings); for cntstr = 1:NumCStrings // #RNU_RES_B // Prologue // #RNU_RES_E PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent)+C_Strings(cntstr),CPass1FileName,'file','y'); end // #RNU_RES_B // Epilogue // #RNU_RES_E PrintStringInfo(' ',CPass1ForEpilFileName ,'file','y'); elseif (SharedInfo.ForExpr.AssignmentFun == SharedInfo.CFunId.OpColon) // #RNU_RES_B // --------------- // --- Case 2. --- // --------------- // for a = 1:10 PrintStringInfo(' Handling For Expression with OpColon.',ReportFileName,'file','y'); // #RNU_RES_E // #RNU_RES_B // ------------------------------------------------------------------------------------- // --- Generate Prologue and Epilogue -> Copy the first N-1 lines of the for.c code. --- // ------------------------------------------------------------------------------------- // #RNU_RES_E [C_Strings,NumCStrings] = File2StringArray(FileInfo.Funct(nxtscifunnumber).CPass1ForProlFileName(SharedInfo.For.Level)); C_Strings = stripblanks(C_Strings); for cntstr = 1:NumCStrings // #RNU_RES_B // Prologue // #RNU_RES_E PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent)+C_Strings(cntstr),CPass1FileName,'file','y','n'); // #RNU_RES_B // Epilogue // #RNU_RES_E if (length(C_Strings(cntstr)) == 0) C_Strings(cntstr) = ' '; // RNU for Bruno: If I don't do that I get a PrintStringInfo error related to mputstr. // Function not defined for given argument type(s), // check arguments or define function %0_mputstr for overloading. end PrintStringInfo(string(C_Strings(cntstr)),CPass1ForEpilFileName ,'file','y','n'); end // #RNU_RES_B // ---------------------------------------- // --- Insert "}" in the epilogue file. --- // ---------------------------------------- // #RNU_RES_E PrintStringInfo('}',CPass1ForEpilFileName ,'file','y'); // #RNU_RES_B // ------------------------------ // --- Insert for expression. --- // ------------------------------ // #RNU_RES_E CCall = 'for('+SharedInfo.ForExpr.SclValCntArg.Name+' = '+SharedInfo.ForExpr.OpColonInfoIn1+'; '... +SharedInfo.ForExpr.SclValCntArg.Name+' <= '+SharedInfo.ForExpr.OpColonInfoIn3+'; '... +SharedInfo.ForExpr.SclValCntArg.Name+' += '+SharedInfo.ForExpr.OpColonInfoIn2+')'; PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent)+CCall,CPass1FileName,'file','y'); // #RNU_RES_B // ------------------- // --- Insert "{". --- // ------------------- // #RNU_RES_E CCall = '{'; PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent)+CCall,CPass1FileName,'file','y'); // --------------------------------- // --- Update Indentation Level. --- // --------------------------------- SharedInfo.NIndent = SharedInfo.NIndent + 1; elseif (SharedInfo.ForExpr.AssignmentFun == SharedInfo.CFunId.EqMatrix | ... SharedInfo.ForExpr.AssignmentFun == SharedInfo.CFunId.GenFunMtx) // #RNU_RES_B // --------------- // --- Case 3. --- // --------------- PrintStringInfo(' Handling For Expression with Matrix Equal/Function.',ReportFileName,'file','y'); // for cnt = TMP where TMP is a matrix // for cnt = fun(TMP) where TMP is a matrix // Conversion is performed as shown in the following example: // init code for temp vars --> copy all for.c code (up to last-1 line) into C pass1 code. // intSCI2C __forcnt1; --> declaration file. // replace in the last C line CntArg.Name with '__TmpVal'+CntArg.Name // for (__forcnt1 = 0; __forcnt1 < CntArg.Size(1)*CntArg.Size(2); __forcnt1++) // { // CntArg.Name = '__TmpVal'+CntArg.Name[__forcnt1]; // init code for temp vars // } // ------------------------------------------------------------------------------------- // --- Generate Prologue and Epilogue -> Copy the first N-1 lines of the for.c code. --- // ------------------------------------------------------------------------------------- // #RNU_RES_E [C_Strings,NumCStrings] = File2StringArray(FileInfo.Funct(nxtscifunnumber).CPass1ForProlFileName(SharedInfo.For.Level)); C_Strings = stripblanks(C_Strings); for cntstr = 1:NumCStrings // Prologue PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent)+C_Strings(cntstr),CPass1FileName,'file','y'); // Epilogue PrintStringInfo(C_Strings(cntstr),CPass1ForEpilFileName ,'file','y'); end // #RNU_RES_B // ---------------------------------------- // --- Insert "}" in the epilogue file. --- // ---------------------------------------- // #RNU_RES_E PrintStringInfo('}',CPass1ForEpilFileName ,'file','y'); // ------------------------------ // --- Insert for expression. --- // ------------------------------ CCall = 'for('+SharedInfo.ForExpr.IntCntArg.Name+' = 0'+'; '+... SharedInfo.ForExpr.IntCntArg.Name+' < '+SharedInfo.ForExpr.MtxValCntArg.Size(1)+'*'+SharedInfo.ForExpr.MtxValCntArg.Size(2)+'; '+... SharedInfo.ForExpr.IntCntArg.Name+'++)'; PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent)+CCall,CPass1FileName,'file','y'); // ------------------- // --- Insert "{". --- // ------------------- CCall = '{'; PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent)+CCall,CPass1FileName,'file','y'); // --------------------------------- // --- Update Indentation Level. --- // --------------------------------- SharedInfo.NIndent = SharedInfo.NIndent + 1; // #RNU_RES_B // ---------------------------------------------------- // --- Add code to read the element of CntArg.Name. --- // ---------------------------------------------------- // #RNU_RES_E CCall = SharedInfo.ForExpr.SclValCntArg.Name+' = '+SharedInfo.ForExpr.MtxValCntArg.Name+'['+SharedInfo.ForExpr.IntCntArg.Name+'];'; PrintStringInfo(C_IndentBlanks(SharedInfo.NIndent)+CCall,CPass1FileName,'file','y'); else // --------------- // --- Case 5. --- // --------------- SCI2Cerror('Could not manage the for expression.'); end endfunction