update string(macro) remove blank first and last line. Upadte tests 35/11335/2
Antoine ELIAS [Fri, 19 Apr 2013 09:42:59 +0000 (11:42 +0200)]
Change-Id: Idfd9057286cd5ea42fe35df51873e11e2a636de0

scilab/modules/ast/ast.vcxproj.filters
scilab/modules/ast/includes/runvisitor.hxx
scilab/modules/ast/src/cpp/printvisitor.cpp
scilab/modules/string/sci_gateway/cpp/sci_string.cpp
scilab/modules/string/sci_gateway/cpp/string_gw.vcxproj
scilab/modules/string/tests/nonreg_tests/bug_7249.dia.ref
scilab/modules/string/tests/nonreg_tests/bug_7249.tst
scilab/modules/string/tests/unit_tests/string.tst
scilab/modules/types/includes/macrofile.hxx

index 7abdf0f..ae88779 100644 (file)
     <ClInclude Include="src\cpp\libAst.hxx">
       <Filter>Header Files</Filter>
     </ClInclude>
-    <ClInclude Include="includes\stepvisitor.hxx" />
+    <ClInclude Include="includes\stepvisitor.hxx">
+      <Filter>Header Files</Filter>
+    </ClInclude>
   </ItemGroup>
   <ItemGroup>
     <Library Include="..\..\bin\blasplus.lib" />
index 5d1dbac..f12a7ad 100644 (file)
@@ -1674,8 +1674,10 @@ public :
 
         //            Location* newloc = const_cast<Location*>(&location_get())->clone();
         Exp* exp = const_cast<Exp*>(&e.body_get())->clone();
-        MuteVisitor mute;
-        exp->accept(mute);
+
+        //MuteVisitor mute;
+        //exp->accept(mute);
+
         //types::Macro macro(VarList, RetList, (SeqExp&)e.body_get());
         types::Macro *pMacro = new types::Macro(e.name_get().name_get(), *pVarList, *pRetList,
                                                 static_cast<SeqExp&>(*exp), L"script");
index b33bfb2..adbebac 100644 (file)
 
 #include "printvisitor.hxx"
 
-namespace ast {
-
-    /** \name Visit Matrix Expressions nodes.
-     ** \{ */
-    void PrintVisitor::visit (const MatrixExp &e)
-    {
-        std::list<MatrixLineExp *>::const_iterator     i, j;
-        *ostr << SCI_OPEN_MATRIX;
-        ++indent;
-        this->is_last_matrix_line = false;
-        for (i = e.lines_get().begin() ; i != e.lines_get().end() ; )
+namespace ast
+{
+
+/** \name Visit Matrix Expressions nodes.
+ ** \{ */
+void PrintVisitor::visit (const MatrixExp &e)
+{
+    std::list<MatrixLineExp *>::const_iterator i, j;
+    *ostr << SCI_OPEN_MATRIX;
+    ++indent;
+    this->is_last_matrix_line = false;
+    for (i = e.lines_get().begin() ; i != e.lines_get().end() ; )
+    {
+        j = i;
+        if (++j == e.lines_get().end())
         {
-            j = i;
-            if (++j == e.lines_get().end())
-            {
-                this->is_last_matrix_line = true;
-            }
-            (*i)->accept (*this);
-            ++i;
+            this->is_last_matrix_line = true;
+        }
+        (*i)->accept (*this);
+        ++i;
 
-            if(e.lines_get().size() > 1)
-            {
-                *ostr << std::endl;
-                this->apply_indent();
-            }
+        if (e.lines_get().size() > 1)
+        {
+            *ostr << std::endl;
+            this->apply_indent();
         }
-        *ostr << SCI_CLOSE_MATRIX;
-        --indent;
     }
+    *ostr << SCI_CLOSE_MATRIX;
+    --indent;
+}
 
-    void PrintVisitor::visit (const MatrixLineExp &e)
-    {
-        std::list<Exp *>::const_iterator        i;
-        bool                                    last_column_is_comment = false;
+void PrintVisitor::visit (const MatrixLineExp &e)
+{
+    std::list<Exp *>::const_iterator        i;
+    bool                                    last_column_is_comment = false;
 
-        for (i = e.columns_get().begin() ; i != e.columns_get().end() ; )
+    for (i = e.columns_get().begin() ; i != e.columns_get().end() ; )
+    {
+        (*i)->accept (*this);
+        if (dynamic_cast<ast::CommentExp*>(*i) != NULL)
         {
-            (*i)->accept (*this);
-            if (dynamic_cast<ast::CommentExp*>(*i) != NULL)
-            {
-                last_column_is_comment = true;
-            }
-            if (++i != e.columns_get().end())
-            {
-                if (dynamic_cast<ast::CommentExp*>(*i) == NULL)
-                {
-                    *ostr << SCI_COLUMN_SEPARATOR;
-                }
-                *ostr << " ";
-            }
+            last_column_is_comment = true;
         }
-        if (!last_column_is_comment && this->is_last_matrix_line == false)
+        if (++i != e.columns_get().end())
         {
-            *ostr << SCI_LINE_SEPARATOR;
+            if (dynamic_cast<ast::CommentExp*>(*i) == NULL)
+            {
+                *ostr << SCI_COLUMN_SEPARATOR;
+            }
+            *ostr << " ";
         }
     }
-    /** \} */
-
-    /** \name Visit Cell Expressions nodes.
-     ** \{ */
-    void PrintVisitor::visit (const CellExp &e)
+    if (!last_column_is_comment && this->is_last_matrix_line == false)
     {
-        std::list<MatrixLineExp *>::const_iterator     i;
-        *ostr << SCI_OPEN_CELL;
-        ++indent;
-        for (i = e.lines_get().begin() ; i != e.lines_get().end() ; )
+        *ostr << SCI_LINE_SEPARATOR;
+    }
+}
+/** \} */
+
+/** \name Visit Cell Expressions nodes.
+ ** \{ */
+void PrintVisitor::visit (const CellExp &e)
+{
+    std::list<MatrixLineExp *>::const_iterator i;
+    *ostr << SCI_OPEN_CELL;
+    ++indent;
+    for (i = e.lines_get().begin() ; i != e.lines_get().end() ; )
+    {
+        (*i)->accept (*this);
+        if (++i != e.lines_get().end())
         {
-            (*i)->accept (*this);
-            if (++i != e.lines_get().end())
-            {
-                *ostr << SCI_LINE_SEPARATOR << std::endl;
-                this->apply_indent();
-            }
+            *ostr << SCI_LINE_SEPARATOR << std::endl;
+            this->apply_indent();
         }
-        *ostr << SCI_CLOSE_CELL;
-        --indent;
     }
-    /** \} */
+    *ostr << SCI_CLOSE_CELL;
+    --indent;
+}
+/** \} */
 
-    /** \name Visit Constant Expressions nodes.
-     ** \{ */
-    void PrintVisitor::visit (const StringExp &e)
-    {
-        std::wstring::const_iterator it;
+/** \name Visit Constant Expressions nodes.
+ ** \{ */
+void PrintVisitor::visit (const StringExp &e)
+{
+    std::wstring::const_iterator it;
 
-        *ostr << SCI_OPEN_STRING;
-        std::wstring value = e.value_get();
+    *ostr << SCI_OPEN_STRING;
+    std::wstring value = e.value_get();
 
-        for (it = value.begin() ; it != value.end() ; ++it)
+    for (it = value.begin() ; it != value.end() ; ++it)
+    {
+        if ( *it == '\'' || *it == '"')
         {
-            if ( *it == '\'' || *it == '"')
-            {
-                // ' -> '' and " -> "" in scilab strings
-                *ostr << *it;
-            }
+            // ' -> '' and " -> "" in scilab strings
             *ostr << *it;
         }
-        *ostr << SCI_CLOSE_STRING;
+        *ostr << *it;
     }
+    *ostr << SCI_CLOSE_STRING;
+}
 
-    void PrintVisitor::visit (const CommentExp &e)
-    {
-        *ostr << SCI_OPEN_COMMENT;
-        *ostr << e.comment_get();
-    }
+void PrintVisitor::visit (const CommentExp &e)
+{
+    *ostr << SCI_OPEN_COMMENT;
+    *ostr << e.comment_get();
+}
 
-    void PrintVisitor::visit (const IntExp  &e)
+void PrintVisitor::visit (const IntExp  &e)
+{
+    switch (e.prec_get())
     {
-        switch (e.prec_get())
-        {
         case IntExp::_8_:
-            *ostr << SCI_INT8; break;
+            *ostr << SCI_INT8;
+            break;
         case IntExp::_16_:
-            *ostr << SCI_INT16; break;
+            *ostr << SCI_INT16;
+            break;
         case IntExp::_32_:
-            *ostr << SCI_INT32; break;
+            *ostr << SCI_INT32;
+            break;
         case IntExp::_64_:
-            *ostr << SCI_INT64; break;
-        }
-        *ostr<< SCI_LPAREN << e.value_get() << SCI_RPAREN;
+            *ostr << SCI_INT64;
+            break;
     }
+    *ostr << SCI_LPAREN << e.value_get() << SCI_RPAREN;
+}
 
-    void PrintVisitor::visit (const FloatExp  &e)
-    {
-        *ostr << e.value_get();
-    }
+void PrintVisitor::visit (const FloatExp  &e)
+{
+    *ostr << e.value_get();
+}
 
-    void PrintVisitor::visit (const DoubleExp  &e)
-    {
-        *ostr << e.value_get();
-    }
+void PrintVisitor::visit (const DoubleExp  &e)
+{
+    *ostr << e.value_get();
+}
 
-    void PrintVisitor::visit (const BoolExp  &e)
+void PrintVisitor::visit (const BoolExp  &e)
+{
+    if (e.value_get() == true)
     {
-        if (e.value_get() == true) {
-            *ostr << SCI_TRUE;
-        }
-        else {
-            *ostr << SCI_FALSE;
-        }
+        *ostr << SCI_TRUE;
     }
-
-    void PrintVisitor::visit (const NilExp &e)
+    else
     {
-        /* Do Nothing */
+        *ostr << SCI_FALSE;
     }
-    /** \} */
+}
 
-    /** \name Visit Variable related nodes.
-     ** \{ */
-    void PrintVisitor::visit (const SimpleVar &e)
-    {
-        *ostr << e.name_get().name_get();
-    }
+void PrintVisitor::visit (const NilExp &e)
+{
+    /* Do Nothing */
+}
+/** \} */
 
-    void PrintVisitor::visit (const ColonVar &e)
-    {
-        *ostr << SCI_COLON;
-    }
+/** \name Visit Variable related nodes.
+ ** \{ */
+void PrintVisitor::visit (const SimpleVar &e)
+{
+    *ostr << e.name_get().name_get();
+}
 
-    void PrintVisitor::visit (const DollarVar &e)
-    {
-        *ostr << SCI_DOLLAR;
-    }
+void PrintVisitor::visit (const ColonVar &e)
+{
+    *ostr << SCI_COLON;
+}
+
+void PrintVisitor::visit (const DollarVar &e)
+{
+    *ostr << SCI_DOLLAR;
+}
 
-    void PrintVisitor::visit (const ArrayListVar &e)
+void PrintVisitor::visit (const ArrayListVar &e)
+{
+    std::list<Var *>::const_iterator   i;
+    for (i = e.vars_get().begin() ; i != e.vars_get().end() ; )
     {
-        std::list<Var *>::const_iterator       i;
-        for (i = e.vars_get().begin() ; i != e.vars_get().end() ; )
+        (*i)->accept (*this);
+        if (++i != e.vars_get().end())
         {
-            (*i)->accept (*this);
-            if (++i != e.vars_get().end())
-            {
-                *ostr << ", ";
-            }
+            *ostr << ", ";
         }
     }
-    /** \} */
+}
+/** \} */
+
+/** \name Visit Control Expressions or Instructions nodes.
+ ** \{ */
 
-    /** \name Visit Control Expressions or Instructions nodes.
-     ** \{ */
+void PrintVisitor::visit (const FieldExp &e)
+{
+    e.head_get()->accept(*this);
+    *ostr << SCI_FVAR_SEPARATOR;
+    e.tail_get()->accept(*this);
+}
+
+void PrintVisitor::visit(const OpExp &e)
+{
+    bool old_force_parenthesis = force_parenthesis;
 
-    void PrintVisitor::visit (const FieldExp &e)
+    if (force_parenthesis)
     {
-        e.head_get()->accept(*this);
-        *ostr << SCI_FVAR_SEPARATOR;
-        e.tail_get()->accept(*this);
+        *ostr << SCI_LPAREN;
     }
 
-    void PrintVisitor::visit(const OpExp &e)
+    if (e.oper_get() != OpExp::unaryMinus)
     {
-        bool old_force_parenthesis = force_parenthesis;
-
-        if (force_parenthesis)
-        {
-            *ostr << SCI_LPAREN;
-        }
-
-        if (e.oper_get() != OpExp::unaryMinus)
-        {
-            // Getting Left Operand
-            this->enable_force_parenthesis();
-            e.left_get().accept(*this);
-            this->set_force_parenthesis(old_force_parenthesis);
-            *ostr << " ";
-        }
+        // Getting Left Operand
+        this->enable_force_parenthesis();
+        e.left_get().accept(*this);
+        this->set_force_parenthesis(old_force_parenthesis);
+        *ostr << " ";
+    }
 
-        switch (e.oper_get())
-        {
+    switch (e.oper_get())
+    {
             // Arithmetics.
         case OpExp::plus:
-            *ostr << SCI_PLUS; break;
+            *ostr << SCI_PLUS;
+            break;
         case OpExp::unaryMinus:
         case OpExp::minus:
-            *ostr << SCI_MINUS; break;
+            *ostr << SCI_MINUS;
+            break;
         case OpExp::times:
-            *ostr << SCI_TIMES; break;
+            *ostr << SCI_TIMES;
+            break;
         case OpExp::rdivide:
-            *ostr << SCI_RDIVIDE; break;
+            *ostr << SCI_RDIVIDE;
+            break;
         case OpExp::ldivide:
-            *ostr << SCI_LDIVIDE; break;
+            *ostr << SCI_LDIVIDE;
+            break;
         case OpExp::power:
-            *ostr << SCI_POWER; break;
+            *ostr << SCI_POWER;
+            break;
             // Element Ways.
         case OpExp::dottimes:
-            *ostr << SCI_DOTTIMES; break;
+            *ostr << SCI_DOTTIMES;
+            break;
         case OpExp::dotrdivide:
-            *ostr << SCI_DOTRDIVIDE; break;
+            *ostr << SCI_DOTRDIVIDE;
+            break;
         case OpExp::dotldivide:
-            *ostr << SCI_DOTLDIVIDE; break;
+            *ostr << SCI_DOTLDIVIDE;
+            break;
         case OpExp::dotpower:
-            *ostr << SCI_DOTPOWER; break;
+            *ostr << SCI_DOTPOWER;
+            break;
             // Kroneckers
         case OpExp::krontimes:
-            *ostr << SCI_KRONTIMES; break;
+            *ostr << SCI_KRONTIMES;
+            break;
         case OpExp::kronrdivide:
-            *ostr << SCI_KRONRDIVIDE; break;
+            *ostr << SCI_KRONRDIVIDE;
+            break;
         case OpExp::kronldivide:
-            *ostr << SCI_KRONLDIVIDE; break;
+            *ostr << SCI_KRONLDIVIDE;
+            break;
             // Control
         case OpExp::controltimes:
-            *ostr << SCI_CONTROLTIMES; break;
+            *ostr << SCI_CONTROLTIMES;
+            break;
         case OpExp::controlrdivide:
-            *ostr << SCI_CONTROLRDIVIDE; break;
+            *ostr << SCI_CONTROLRDIVIDE;
+            break;
         case OpExp::controlldivide:
-            *ostr << SCI_CONTROLLDIVIDE; break;
+            *ostr << SCI_CONTROLLDIVIDE;
+            break;
             // Comparisons
         case OpExp::eq:
-            *ostr << SCI_EQ; break;
+            *ostr << SCI_EQ;
+            break;
         case OpExp::ne:
-            *ostr << SCI_NE; break;
+            *ostr << SCI_NE;
+            break;
         case OpExp::lt:
-            *ostr << SCI_LT; break;
+            *ostr << SCI_LT;
+            break;
         case OpExp::le:
-            *ostr << SCI_LE; break;
+            *ostr << SCI_LE;
+            break;
         case OpExp::gt:
-            *ostr << SCI_GT; break;
+            *ostr << SCI_GT;
+            break;
         case OpExp::ge:
-            *ostr << SCI_GE; break;
+            *ostr << SCI_GE;
+            break;
         default :
             // FIXME : This case should never happend.
             break;
-        }
-        *ostr << " ";
+    }
+    *ostr << " ";
 
-        // Now getting right operand
-        this->enable_force_parenthesis();
-        e.right_get().accept(*this);
-        this->set_force_parenthesis(old_force_parenthesis);
+    // Now getting right operand
+    this->enable_force_parenthesis();
+    e.right_get().accept(*this);
+    this->set_force_parenthesis(old_force_parenthesis);
 
-        if (force_parenthesis)
-        {
-            *ostr << SCI_RPAREN;
-        }
+    if (force_parenthesis)
+    {
+        *ostr << SCI_RPAREN;
     }
+}
 
-       void PrintVisitor::visit(const LogicalOpExp &e)
-    {
-        bool old_force_parenthesis = force_parenthesis;
+void PrintVisitor::visit(const LogicalOpExp &e)
+{
+    bool old_force_parenthesis = force_parenthesis;
 
-        if (force_parenthesis)
-        {
-            *ostr << SCI_LPAREN;
-        }
+    if (force_parenthesis)
+    {
+        *ostr << SCI_LPAREN;
+    }
 
-        // Getting Left Operand
-        this->enable_force_parenthesis();
-        e.left_get().accept(*this);
-        this->set_force_parenthesis(old_force_parenthesis);
+    // Getting Left Operand
+    this->enable_force_parenthesis();
+    e.left_get().accept(*this);
+    this->set_force_parenthesis(old_force_parenthesis);
 
-        *ostr << " ";
-        switch (e.oper_get())
-        {
+    *ostr << " ";
+    switch (e.oper_get())
+    {
             // Binary Operators
         case LogicalOpExp::logicalAnd:
-            *ostr << SCI_AND; break;
+            *ostr << SCI_AND;
+            break;
         case LogicalOpExp::logicalOr:
-            *ostr << SCI_OR; break;
+            *ostr << SCI_OR;
+            break;
         case LogicalOpExp::logicalShortCutAnd:
-            *ostr << SCI_ANDAND; break;
+            *ostr << SCI_ANDAND;
+            break;
         case LogicalOpExp::logicalShortCutOr:
-            *ostr << SCI_OROR; break;
+            *ostr << SCI_OROR;
+            break;
         default :
             // FIXME : This case should never happend.
             break;
-       }
-        *ostr << " ";
-
-        // Now getting right operand
-        this->enable_force_parenthesis();
-        e.right_get().accept(*this);
-        this->set_force_parenthesis(old_force_parenthesis);
-
-        if (force_parenthesis)
-        {
-            *ostr << SCI_RPAREN;
-        }
     }
+    *ostr << " ";
 
-       void PrintVisitor::visit (const AssignExp  &e)
+    // Now getting right operand
+    this->enable_force_parenthesis();
+    e.right_get().accept(*this);
+    this->set_force_parenthesis(old_force_parenthesis);
+
+    if (force_parenthesis)
     {
-        e.left_exp_get ().accept (*this);
-        *ostr << " " << SCI_ASSIGN << " ";
-        e.right_exp_get ().accept (*this);
+        *ostr << SCI_RPAREN;
     }
+}
 
-    void PrintVisitor::visit(const CellCallExp &e)
-    {
-        e.name_get().accept (*this);
-        *ostr << SCI_OPEN_CELL;
-        std::list<Exp *>::const_iterator       i;
+void PrintVisitor::visit (const AssignExp  &e)
+{
+    e.left_exp_get ().accept (*this);
+    *ostr << " " << SCI_ASSIGN << " ";
+    e.right_exp_get ().accept (*this);
+}
 
-        for (i = e.args_get().begin (); i != e.args_get().end ();)
-        {
-            (*i)->accept (*this);
-            if (++i != e.args_get().end ())
-                *ostr << SCI_COMMA << " ";
-        }
-        *ostr << SCI_CLOSE_CELL;
-    }
+void PrintVisitor::visit(const CellCallExp &e)
+{
+    e.name_get().accept (*this);
+    *ostr << SCI_OPEN_CELL;
+    std::list<Exp *>::const_iterator   i;
 
-    void PrintVisitor::visit(const CallExp &e)
+    for (i = e.args_get().begin (); i != e.args_get().end ();)
     {
-        e.name_get().accept (*this);
-        *ostr << SCI_OPEN_CALL;
-        std::list<Exp *>::const_iterator       i;
-
-        for (i = e.args_get().begin (); i != e.args_get().end ();)
+        (*i)->accept (*this);
+        if (++i != e.args_get().end ())
         {
-            (*i)->accept (*this);
-            if (++i != e.args_get().end ())
-                *ostr << SCI_COMMA << " ";
+            *ostr << SCI_COMMA << " ";
         }
-        *ostr << SCI_CLOSE_CALL;
     }
+    *ostr << SCI_CLOSE_CELL;
+}
+
+void PrintVisitor::visit(const CallExp &e)
+{
+    e.name_get().accept (*this);
+    *ostr << SCI_OPEN_CALL;
+    std::list<Exp *>::const_iterator   i;
 
-    void PrintVisitor::visit (const IfExp  &e)
+    for (i = e.args_get().begin (); i != e.args_get().end ();)
     {
-        *ostr << SCI_IF;
-        *ostr << " " << SCI_OPEN_TEST;
-        e.test_get ().accept(*this);
-        *ostr << SCI_CLOSE_TEST << " ";
-        *ostr << SCI_THEN << std::endl;
-        ++indent;
-        e.then_get ().accept(*this);
-        --indent;
-        if (e.has_else()) {
-            this->apply_indent();
-            *ostr << SCI_ELSE << std::endl;
-            ++indent;
-            e.else_get ().accept(*this);
-            --indent;
+        (*i)->accept (*this);
+        if (++i != e.args_get().end ())
+        {
+            *ostr << SCI_COMMA << " ";
         }
-        this->apply_indent();
-        *ostr << SCI_ENDIF;
     }
+    *ostr << SCI_CLOSE_CALL;
+}
 
-    void PrintVisitor::visit (const TryCatchExp  &e)
+void PrintVisitor::visit (const IfExp  &e)
+{
+    *ostr << SCI_IF;
+    *ostr << " " << SCI_OPEN_TEST;
+    e.test_get ().accept(*this);
+    *ostr << SCI_CLOSE_TEST << " ";
+    *ostr << SCI_THEN << std::endl;
+    ++indent;
+    e.then_get ().accept(*this);
+    --indent;
+    if (e.has_else())
     {
-        *ostr << SCI_TRY << std::endl;
-        ++indent;
-        e.try_get ().accept(*this);
-        --indent;
         this->apply_indent();
-        *ostr << SCI_CATCH << std::endl;
+        *ostr << SCI_ELSE << std::endl;
         ++indent;
-        e.catch_get ().accept(*this);
+        e.else_get ().accept(*this);
         --indent;
-        this->apply_indent();
-        *ostr << SCI_ENDTRY;
     }
+    this->apply_indent();
+    *ostr << SCI_ENDIF;
+}
 
-    void PrintVisitor::visit (const WhileExp  &e)
-    {
-        *ostr << SCI_WHILE;
-        *ostr << " " << SCI_OPEN_TEST;
-        e.test_get().accept (*this);
-        *ostr << SCI_CLOSE_TEST << " " << SCI_DO << std::endl;
-        ++indent;
-        e.body_get().accept (*this);
-        --indent;
-        this->apply_indent();
-        *ostr << SCI_ENDWHILE;
-    }
+void PrintVisitor::visit (const TryCatchExp  &e)
+{
+    *ostr << SCI_TRY << std::endl;
+    ++indent;
+    e.try_get ().accept(*this);
+    --indent;
+    this->apply_indent();
+    *ostr << SCI_CATCH << std::endl;
+    ++indent;
+    e.catch_get ().accept(*this);
+    --indent;
+    this->apply_indent();
+    *ostr << SCI_ENDTRY;
+}
 
-    void PrintVisitor::visit (const ForExp  &e)
-    {
-        *ostr << SCI_FOR;
-        *ostr << " " << SCI_OPEN_TEST;
-        e.vardec_get().accept(*this);
-        *ostr << SCI_CLOSE_TEST << " ";
-        *ostr << SCI_DO << std::endl;
-        ++indent;
-        e.body_get().accept (*this);
-        --indent;
-        this->apply_indent();
-        *ostr << SCI_ENDFOR;
-    }
+void PrintVisitor::visit (const WhileExp  &e)
+{
+    *ostr << SCI_WHILE;
+    *ostr << " " << SCI_OPEN_TEST;
+    e.test_get().accept (*this);
+    *ostr << SCI_CLOSE_TEST << " " << SCI_DO << std::endl;
+    ++indent;
+    e.body_get().accept (*this);
+    --indent;
+    this->apply_indent();
+    *ostr << SCI_ENDWHILE;
+}
 
-    void PrintVisitor::visit (const BreakExp &e)
-    {
-        *ostr << SCI_BREAK;
-    }
+void PrintVisitor::visit (const ForExp  &e)
+{
+    *ostr << SCI_FOR;
+    *ostr << " " << SCI_OPEN_TEST;
+    e.vardec_get().accept(*this);
+    *ostr << SCI_CLOSE_TEST << " ";
+    *ostr << SCI_DO << std::endl;
+    ++indent;
+    e.body_get().accept (*this);
+    --indent;
+    this->apply_indent();
+    *ostr << SCI_ENDFOR;
+}
+
+void PrintVisitor::visit (const BreakExp &e)
+{
+    *ostr << SCI_BREAK;
+}
 
-    void PrintVisitor::visit (const ContinueExp &e)
+void PrintVisitor::visit (const ContinueExp &e)
+{
+    *ostr << SCI_CONTINUE;
+}
+
+void PrintVisitor::visit (const ReturnExp &e)
+{
+    *ostr << SCI_RETURN;
+    if (!e.is_global())
     {
-        *ostr << SCI_CONTINUE;
+        *ostr << " " ;
+        e.exp_get().accept(*this);
     }
+}
 
-    void PrintVisitor::visit (const ReturnExp &e)
+void PrintVisitor::visit (const SelectExp &e)
+{
+    *ostr << SCI_SELECT;
+    *ostr << " " << SCI_OPEN_TEST;
+    e.select_get()->accept(*this);
+    *ostr << SCI_CLOSE_TEST << std::endl;
+    ++indent;
+    cases_t::const_iterator it;
+    for (it = e.cases_get()->begin() ; it != e.cases_get()->end() ; ++it)
     {
-        *ostr << SCI_RETURN;
-        if (!e.is_global())
-        {
-            *ostr << " " ;
-            e.exp_get().accept(*this);
-        }
+        (*it)->accept (*this);
     }
-
-    void PrintVisitor::visit (const SelectExp &e)
+    if (e.default_case_get() != NULL)
     {
-        *ostr << SCI_SELECT;
-        *ostr << " " << SCI_OPEN_TEST;
-        e.select_get()->accept(*this);
-        *ostr << SCI_CLOSE_TEST << std::endl;
+        this->apply_indent();
+        *ostr << SCI_DEFAULT_CASE << std::endl;
         ++indent;
-        cases_t::const_iterator it;
-        for (it = e.cases_get()->begin() ; it != e.cases_get()->end() ; ++it)
-        {
-            (*it)->accept (*this);
-        }
-        if (e.default_case_get() != NULL)
-        {
-            this->apply_indent();
-            *ostr << SCI_DEFAULT_CASE << std::endl;
-            ++indent;
-            e.default_case_get()->accept(*this);
-            --indent;
-        }
+        e.default_case_get()->accept(*this);
         --indent;
-        this->apply_indent();
-        *ostr << SCI_ENDSELECT;
     }
+    --indent;
+    this->apply_indent();
+    *ostr << SCI_ENDSELECT;
+}
 
-    void PrintVisitor::visit (const CaseExp &e)
-    {
-        this->apply_indent();
-        *ostr << SCI_CASE;
-        *ostr << " " << SCI_OPEN_TEST;
-        e.test_get()->accept(*this);
-        *ostr << SCI_CLOSE_TEST << std::endl;
-        indent++;
-        e.body_get()->accept(*this);
-        indent--;
-    }
+void PrintVisitor::visit (const CaseExp &e)
+{
+    this->apply_indent();
+    *ostr << SCI_CASE;
+    *ostr << " " << SCI_OPEN_TEST;
+    e.test_get()->accept(*this);
+    *ostr << SCI_CLOSE_TEST << std::endl;
+    indent++;
+    e.body_get()->accept(*this);
+    indent--;
+}
 
-    void PrintVisitor::visit (const SeqExp  &e)
+void PrintVisitor::visit (const SeqExp  &e)
+{
+    std::list<Exp *>::const_iterator   i;
+    for (i = e.exps_get().begin (); i != e.exps_get().end (); ++i)
     {
-        std::list<Exp *>::const_iterator       i;
-        for (i = e.exps_get().begin (); i != e.exps_get().end (); ++i)
+        this->apply_indent();
+        (*i)->accept (*this);
+        if (!(*i)->is_verbose())
         {
-            this->apply_indent();
-            (*i)->accept (*this);
-            if(!(*i)->is_verbose())
-            {
-                *ostr << ";";
-            }
-            *ostr << std::endl;
+            *ostr << ";";
         }
+        *ostr << std::endl;
     }
+}
 
-    void PrintVisitor::visit (const ArrayListExp  &e)
+void PrintVisitor::visit (const ArrayListExp  &e)
+{
+    std::list<Exp *>::const_iterator   i;
+    *ostr << SCI_LPAREN;
+    for (i = e.exps_get().begin (); i != e.exps_get().end ();)
     {
-        std::list<Exp *>::const_iterator       i;
-        *ostr << SCI_LPAREN;
-        for (i = e.exps_get().begin (); i != e.exps_get().end ();)
+        (*i)->accept (*this);
+        if (++i != e.exps_get().end ())
         {
-            (*i)->accept (*this);
-            if (++i != e.exps_get().end ())
-            {
-                *ostr << SCI_COMMA << " ";
-            }
+            *ostr << SCI_COMMA << " ";
         }
-        *ostr << SCI_RPAREN;
     }
+    *ostr << SCI_RPAREN;
+}
 
-    void PrintVisitor::visit (const AssignListExp  &e)
+void PrintVisitor::visit (const AssignListExp  &e)
+{
+    std::list<Exp *>::const_iterator   i;
+    *ostr << SCI_LBRACK;
+    for (i = e.exps_get().begin (); i != e.exps_get().end ();)
     {
-        std::list<Exp *>::const_iterator       i;
-        *ostr << SCI_LBRACK;
-        for (i = e.exps_get().begin (); i != e.exps_get().end ();)
+        (*i)->accept (*this);
+        if (++i != e.exps_get().end ())
         {
-            (*i)->accept (*this);
-            if (++i != e.exps_get().end ())
-            {
-                *ostr << SCI_COMMA << " ";
-            }
+            *ostr << SCI_COMMA << " ";
         }
-        *ostr << SCI_RBRACK;
     }
-    /** \} */
+    *ostr << SCI_RBRACK;
+}
+/** \} */
+
+/** \name Visit Single Operation nodes.
+ ** \{ */
+void PrintVisitor::visit (const NotExp &e)
+{
+    *ostr << SCI_NOT;
+    *ostr << SCI_LPAREN;
+    e.exp_get().accept (*this);
+    *ostr << SCI_RPAREN;
+}
 
-    /** \name Visit Single Operation nodes.
-     ** \{ */
-    void PrintVisitor::visit (const NotExp &e)
+void PrintVisitor::visit (const TransposeExp &e)
+{
+    *ostr << SCI_LPAREN;
+    e.exp_get().accept (*this);
+    *ostr << SCI_RPAREN;
+    if (e.conjugate_get() == TransposeExp::_Conjugate_)
     {
-        *ostr << SCI_NOT;
-        *ostr << SCI_LPAREN;
-        e.exp_get().accept (*this);
-        *ostr << SCI_RPAREN;
+        *ostr << SCI_CONJUGATE_TRANSPOSE;
     }
-
-    void PrintVisitor::visit (const TransposeExp &e)
+    if (e.conjugate_get() == TransposeExp::_NonConjugate_)
     {
-        *ostr << SCI_LPAREN;
-        e.exp_get().accept (*this);
-        *ostr << SCI_RPAREN;
-        if (e.conjugate_get() == TransposeExp::_Conjugate_)
-        {
-            *ostr << SCI_CONJUGATE_TRANSPOSE;
-        }
-        if (e.conjugate_get() == TransposeExp::_NonConjugate_)
-        {
-            *ostr << SCI_TRANSPOSE;
-        }
+        *ostr << SCI_TRANSPOSE;
     }
-    /** \} */
+}
+/** \} */
+
+/** \name Visit Declaration nodes.
+ ** \{ */
+/** \brief Visit Var declarations. */
+void PrintVisitor::visit (const VarDec  &e)
+{
+    *ostr << e.name_get().name_get();
+    *ostr << SCI_ASSIGN;
+    e.init_get ().accept (*this);
+}
+
+void PrintVisitor::visit (const FunctionDec  &e)
+{
+    *ostr << SCI_FUNCTION << " ";
 
-    /** \name Visit Declaration nodes.
-     ** \{ */
-    /** \brief Visit Var declarations. */
-    void PrintVisitor::visit (const VarDec  &e)
+    // First ask if there are some return values.
+    if (e.returns_get().vars_get().size() > 1)
     {
-        *ostr << e.name_get().name_get();
-        *ostr << SCI_ASSIGN;
-        e.init_get ().accept (*this);
+        *ostr << SCI_OPEN_RETURNS;
     }
 
-    void PrintVisitor::visit (const FunctionDec  &e)
+    visit(e.returns_get());
+
+    if (e.returns_get().vars_get().size() > 1)
     {
-        *ostr << SCI_FUNCTION << " ";
+        *ostr << SCI_CLOSE_RETURNS;
+    }
 
-        // First ask if there are some return values.
-        *ostr << SCI_OPEN_RETURNS;
-        visit(e.returns_get());
-        *ostr << SCI_CLOSE_RETURNS << " ";
+    *ostr << " ";
+    if (e.returns_get().vars_get().size() > 0)
+    {
         *ostr << SCI_ASSIGN << " ";
+    }
 
-        // Then get the function name
-        *ostr << e.name_get().name_get();
+    // Then get the function name
+    *ostr << e.name_get().name_get();
 
-        // Then get function args
-        *ostr << SCI_OPEN_ARGS;
-        visit(e.args_get());
-        *ostr << SCI_CLOSE_ARGS << std::endl;
+    // Then get function args
+    *ostr << SCI_OPEN_ARGS;
+    visit(e.args_get());
+    *ostr << SCI_CLOSE_ARGS << std::endl;
 
-        // Now print function body
-        ++indent;
-        e.body_get().accept(*this);
-        --indent;
-        this->apply_indent();
+    // Now print function body
+    ++indent;
+    e.body_get().accept(*this);
+    --indent;
+    this->apply_indent();
 
-        // Close function declaration
-        *ostr << SCI_ENDFUNCTION;
-    }
-    /** \} */
+    // Close function declaration
+    *ostr << SCI_ENDFUNCTION;
+}
+/** \} */
+
+/** \name Visit Type dedicated Expressions related node.
+ ** \{ */
+void PrintVisitor::visit(const ListExp &e)
+{
+    *ostr << SCI_LPAREN;
+    e.start_get().accept(*this);
+    *ostr << SCI_IMPLICIT_LIST;
+    e.step_get().accept(*this);
+    *ostr << SCI_IMPLICIT_LIST;
+    e.end_get().accept(*this);
+    *ostr << SCI_RPAREN;
+}
+/** \} */
 
-    /** \name Visit Type dedicated Expressions related node.
-     ** \{ */
-    void PrintVisitor::visit(const ListExp &e)
+void           PrintVisitor::apply_indent()
+{
+    int i;
+    for (i = 0; i < indent; ++i)
     {
-        *ostr << SCI_LPAREN;
-        e.start_get().accept(*this);
-        *ostr << SCI_IMPLICIT_LIST;
-        e.step_get().accept(*this);
-        *ostr << SCI_IMPLICIT_LIST;
-        e.end_get().accept(*this);
-        *ostr << SCI_RPAREN;
-    }
-    /** \} */
-
-    void               PrintVisitor::apply_indent() {
-        int i;
-        for (i = 0; i < indent; ++i)
-            *ostr << "    ";
+        *ostr << "    ";
     }
+}
 
-    void       PrintVisitor::enable_force_parenthesis() {
-        force_parenthesis = true;
-    }
+void   PrintVisitor::enable_force_parenthesis()
+{
+    force_parenthesis = true;
+}
 
-    void       PrintVisitor::set_force_parenthesis(bool new_state) {
-        force_parenthesis = new_state;
-    }
+void   PrintVisitor::set_force_parenthesis(bool new_state)
+{
+    force_parenthesis = new_state;
+}
 
 }
index 31687d3..67ab7ba 100644 (file)
@@ -33,7 +33,7 @@ extern "C"
 
 using namespace types;
 
-static void getMacroString(Macro* _pM, String** _pOut, String** _pIn, String** _pBody)
+static void getMacroString(Macro* _pM, InternalType** _pOut, InternalType** _pIn, InternalType** _pBody)
 {
     //get body
     Exp* exp = _pM->getBody();
@@ -56,12 +56,11 @@ static void getMacroString(Macro* _pM, String** _pOut, String** _pIn, String** _
         }
     }
 
-    *_pBody = new String(iLines + 2, 1);
-    (*_pBody)->set(0, L" ");
+    String* pBody = new String(iLines, 1);
 
     //second loop to assign lines to output data
     int iOffset = 0;
-    int iIndex = 1;
+    int iIndex = 0;
     for (int i = 0 ; i < (int)wcslen(pwstBody) ; i++)
     {
         if (pwstBody[i] == L'\n')
@@ -70,32 +69,51 @@ static void getMacroString(Macro* _pM, String** _pOut, String** _pIn, String** _
             wchar_t* pwst = new wchar_t[iLen + 1];
             wcsncpy(pwst, pwstBody + iOffset, iLen);
             pwst[iLen] = L'\0';
-            (*_pBody)->set(iIndex++, pwst);
+            pBody->set(iIndex++, pwst);
             delete[] pwst;
             iOffset = i + 1;
         }
     }
 
-    (*_pBody)->set(iIndex, L" ");
+    *_pBody = pBody;
 
     //get inputs
     list<symbol::Symbol>* pIn = _pM->inputs_get();
-    *_pIn = new String(1, (int)pIn->size());
 
-    list<symbol::Symbol>::iterator itIn = pIn->begin();
-    for (int i = 0 ; i < pIn->size() ; i++, itIn++)
+    if (pIn->size() == 0)
     {
-        (*_pIn)->set(i, (*itIn).name_get().c_str());
+        *_pIn = Double::Empty();
+    }
+    else
+    {
+        String *pSIn = new String(1, (int)pIn->size());
+
+        list<symbol::Symbol>::iterator itIn = pIn->begin();
+        for (int i = 0 ; i < pIn->size() ; i++, itIn++)
+        {
+            pSIn->set(i, (*itIn).name_get().c_str());
+        }
+
+        *_pIn = pSIn;
     }
 
     //get outputs
     list<symbol::Symbol>* pOut = _pM->outputs_get();
-    *_pOut = new String(1, (int)pOut->size());
-
-    list<symbol::Symbol>::iterator itOut = pOut->begin();
-    for (int i = 0 ; i < pOut->size() ; i++, itOut++)
+    if (pOut->size() == 0)
     {
-        (*_pOut)->set(i, (*itOut).name_get().c_str());
+        *_pOut = Double::Empty();
+    }
+    else
+    {
+        String* pSOut = new String(1, (int)pOut->size());
+
+        list<symbol::Symbol>::iterator itOut = pOut->begin();
+        for (int i = 0 ; i < pOut->size() ; i++, itOut++)
+        {
+            pSOut->set(i, (*itOut).name_get().c_str());
+        }
+
+        *_pOut = pSOut;
     }
 }
 
@@ -231,9 +249,9 @@ Function::ReturnValue sci_string(typed_list &in, int _iRetCount, typed_list &out
             }
 
             MacroFile* pMF = in[0]->getAs<MacroFile>();
-            String* pOut = NULL;
-            String* pIn = NULL;
-            String* pBody = NULL;
+            InternalType* pOut = NULL;
+            InternalType* pIn = NULL;
+            InternalType* pBody = NULL;
 
             getMacroString(pMF->getMacro(), &pOut, &pIn, &pBody);
 
@@ -251,9 +269,9 @@ Function::ReturnValue sci_string(typed_list &in, int _iRetCount, typed_list &out
             }
 
             Macro* pM = in[0]->getAs<Macro>();
-            String* pOut = NULL;
-            String* pIn = NULL;
-            String* pBody = NULL;
+            InternalType* pOut = NULL;
+            InternalType* pIn = NULL;
+            InternalType* pBody = NULL;
 
             getMacroString(pM, &pOut, &pIn, &pBody);
 
index e1bf990..fc741e4 100644 (file)
       <Project>{a5911cd7-f8e8-440c-a23e-4843a0636f3a}</Project>
       <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
     </ProjectReference>
+    <ProjectReference Include="..\..\..\parse\parse.vcxproj">
+      <Project>{74d43792-dbfc-47f0-adbc-4d7a20cdada2}</Project>
+    </ProjectReference>
     <ProjectReference Include="..\..\..\symbol\symbol.vcxproj">
       <Project>{2c60033b-0dbd-4ca4-80d3-176c9be9ce2f}</Project>
       <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
index 26e72aa..dffcddb 100644 (file)
@@ -18,9 +18,7 @@
 function myFunc
   disp('myFunc called');
 endfunction
-ref_txt = [' '; ..
-           'disp(''myFunc called'');'; ..
-           ' '];
+ref_txt = ['disp(""myFunc called"");'];
 [in, out, txt] = string(myFunc);
 assert_checkequal(out, []);
 assert_checkequal(in, []);
@@ -41,15 +39,13 @@ function [x, y, z] = myFunc1(a,b,c,d)
   endfunction
   y = myFunc2(a);
 endfunction
-ref_text = [" "; ..
-            "x = [];"; ..
+ref_text = ["x = [];"; ..
             "y = [];"; ..
             "z = [];"; ..
             "function k = myFunc2(x)"; ..
-            "   k = x + 1;"; ..
+            "    k = x + 1;"; ..
             "endfunction"; ..
-            "y = myFunc2(a);"; ..
-            " "];
+            "y = myFunc2(a);";];
 [in, out, txt] = string(myFunc1);
 assert_checkequal(out, ['a','b','c','d']);
 assert_checkequal(in, ['x','y','z']);
@@ -59,13 +55,13 @@ deff('y = mymacro(x)', 'y = x + 1');
 [out, in, text] = string(mymacro);
 assert_checkequal(out, 'y');
 assert_checkequal(in, 'x');
-assert_checkequal(text, [' '; 'y = x + 1'; ' ']);
+assert_checkequal(text, ['y = x + 1']);
 // =============================================================================
 deff('y = mymacrob(x)', 'y = x + 1', 'n');
 [out, in, text] = string(mymacrob);
 assert_checkequal(out, 'y');
 assert_checkequal(in, 'x');
-assert_checkequal(text, [' '; 'y = x + 1'; ' ']);
+assert_checkequal(text, ['y = x + 1';]);
 // =============================================================================
 [out, in, text] = string(sinc);
 assert_checkequal(out, 'y');
@@ -82,5 +78,5 @@ deff('[y,z] = mymacroc(x,i)', 'y = x + 1;z = y;', 'n');
 [out, in, text] = string(mymacroc);
 assert_checkequal(out, ['y', 'z']);
 assert_checkequal(in, ['x', 'i']);
-assert_checkequal(text, [' '; 'y = x + 1;z = y;'; ' ']);
+assert_checkequal(text, ['y = x + 1;';'z = y;']);
 // =============================================================================
index 3620204..b6efb7b 100644 (file)
@@ -19,9 +19,7 @@ function myFunc
   disp('myFunc called');
 endfunction
 
-ref_txt = [' '; ..
-           'disp(''myFunc called'');'; ..
-           ' '];
+ref_txt = ['disp(""myFunc called"");'];
 
 [in, out, txt] = string(myFunc);
 assert_checkequal(out, []);
@@ -44,15 +42,13 @@ function [x, y, z] = myFunc1(a,b,c,d)
   y = myFunc2(a);
 endfunction
 
-ref_text = [" "; ..
-            "x = [];"; ..
+ref_text = ["x = [];"; ..
             "y = [];"; ..
             "z = [];"; ..
             "function k = myFunc2(x)"; ..
-            "   k = x + 1;"; ..
+            "    k = x + 1;"; ..
             "endfunction"; ..
-            "y = myFunc2(a);"; ..
-            " "];
+            "y = myFunc2(a);";];
 
 [in, out, txt] = string(myFunc1);
 assert_checkequal(out, ['a','b','c','d']);
@@ -63,13 +59,13 @@ deff('y = mymacro(x)', 'y = x + 1');
 [out, in, text] = string(mymacro);
 assert_checkequal(out, 'y');
 assert_checkequal(in, 'x');
-assert_checkequal(text, [' '; 'y = x + 1'; ' ']);
+assert_checkequal(text, ['y = x + 1']);
 // =============================================================================
 deff('y = mymacrob(x)', 'y = x + 1', 'n');
 [out, in, text] = string(mymacrob);
 assert_checkequal(out, 'y');
 assert_checkequal(in, 'x');
-assert_checkequal(text, [' '; 'y = x + 1'; ' ']);
+assert_checkequal(text, ['y = x + 1';]);
 // =============================================================================
 [out, in, text] = string(sinc);
 assert_checkequal(out, 'y');
@@ -86,6 +82,6 @@ deff('[y,z] = mymacroc(x,i)', 'y = x + 1;z = y;', 'n');
 [out, in, text] = string(mymacroc);
 assert_checkequal(out, ['y', 'z']);
 assert_checkequal(in, ['x', 'i']);
-assert_checkequal(text, [' '; 'y = x + 1;z = y;'; ' ']);
+assert_checkequal(text, ['y = x + 1;';'z = y;']);
 // =============================================================================
 
index 292b9df..f04f493 100644 (file)
@@ -44,14 +44,14 @@ deff('y = mymacro(x)', 'y = x + 1');
 [out, in, text] = string(mymacro);
 assert_checkequal(out, 'y');
 assert_checkequal(in, 'x');
-assert_checkequal(text, [' '; 'y = x + 1;'; ' ']);
+assert_checkequal(text, ['y = x + 1']);
 //===============================
 mymacro = null();
 deff('y = mymacro(x)', 'y = x + 1', 'n');
 [out, in, text]=string(mymacro);
 assert_checkequal(out, 'y');
 assert_checkequal(in, 'x');
-assert_checkequal(text, [' '; 'y = x + 1;'; ' ']);
+assert_checkequal(text, ['y = x + 1']);
 //===============================
 A = floor(abs(2^8  * rand(10,10)));
 B = floor(abs(2^16 * rand(10,10)));
index 54c62d3..a3e5e2b 100644 (file)
@@ -44,6 +44,7 @@ public :
 
     Macro*                  getMacro(void)
     {
+        parse();
         return m_pMacro;
     }