Changeset 5f6c42c


Ignore:
Timestamp:
Dec 15, 2015, 5:33:25 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
aaron-thesis, arm-eh, cleanup-dtors, ctor, deferred_resn, demangler, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, resolv-new, string, with_gc
Children:
35304009, 8360977
Parents:
ffad73a (diff), 4389966 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge changes from Peter

Files:
14 edited

Legend:

Unmodified
Added
Removed
  • doc/refrat/refrat.tex

    rffad73a r5f6c42c  
    112112\lstset{
    113113language=CFA,
    114 columns=fullflexible,
     114columns=flexible,
    115115basicstyle=\sf\small,
    116116tabsize=4,
    117117xleftmargin=\parindent,
    118118escapechar=@,
    119 %fancyvrb=true,
     119keepspaces=true,
    120120%showtabs=true,
    121 keepspaces=true,
    122 showtabs=true,
    123 tab=,
     121%tab=\rightarrowfill,
    124122}%
    125123
  • src/GenPoly/Box.cc

    rffad73a r5f6c42c  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Thu Nov 26 17:01:55 2015
    13 // Update Count     : 191
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Tue Dec 15 15:30:31 2015
     13// Update Count     : 215
    1414//
    1515
     
    6262                        virtual Expression *mutate( CommaExpr *commaExpr );
    6363                        virtual Expression *mutate( ConditionalExpr *condExpr );
    64                         virtual Statement *mutate(ReturnStmt *catchStmt);
     64                        virtual Statement * mutate( ReturnStmt *returnStmt );
    6565                        virtual Type *mutate( PointerType *pointerType );
    66                         virtual Type *mutate( FunctionType *pointerType );
     66                        virtual Type * mutate( FunctionType *functionType );
    6767 
    6868                        virtual void doBeginScope();
     
    192192                                                        if ( PointerType *pointer = dynamic_cast< PointerType *>( funType->get_parameters().front()->get_type() ) ) {
    193193                                                                if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( pointer->get_base() ) ) {
    194                                                                         name = typeInst->get_name();
    195                                                                         return true;
     194                                                                        if ( TypeInstType *typeInst2 = dynamic_cast< TypeInstType *>( funType->get_parameters().back()->get_type() ) ) {
     195                                                                                if ( typeInst->get_name() == typeInst2->get_name() ) {
     196                                                                                        name = typeInst->get_name();
     197                                                                                        return true;
     198                                                                                } // if
     199                                                                        } // if
    196200                                                                } // if
    197201                                                        } // if
     
    277281
    278282                TypeDecl *Pass1::mutate( TypeDecl *typeDecl ) {
    279 ///     std::cerr << "add " << typeDecl->get_name() << "\n";
    280283                        scopeTyVars[ typeDecl->get_name() ] = typeDecl->get_kind();
    281284                        return Mutator::mutate( typeDecl );
     
    327330
    328331                Expression *Pass1::addRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *retType, std::list< Expression *>::iterator &arg ) {
    329                         if ( useRetval ) {
    330                                 assert( retval );
    331                                 arg = appExpr->get_args().insert( arg, new VariableExpr( retval ) );
    332                                 arg++;
    333                         } else {
    334                                 ObjectDecl *newObj = makeTemporary( retType->clone() );
    335                                 Expression *paramExpr = new VariableExpr( newObj );
    336                                 if ( ! isPolyType( newObj->get_type(), scopeTyVars, env ) ) {
    337                                         paramExpr = new AddressExpr( paramExpr );
    338                                 } // if
    339                                 arg = appExpr->get_args().insert( arg, paramExpr );
    340                                 arg++;
    341 ///     stmtsToAdd.push_back( new ExprStmt( noLabels, appExpr ) );
    342                                 CommaExpr *commaExpr = new CommaExpr( appExpr, new VariableExpr( newObj ) );
    343                                 commaExpr->set_env( appExpr->get_env() );
    344                                 appExpr->set_env( 0 );
    345                                 return commaExpr;
    346                         } // if
    347                         return appExpr;
     332                        // ***** Code Removal ***** After introducing a temporary variable for all return expressions, the following code appears superfluous.
     333                        // if ( useRetval ) {
     334                        //      assert( retval );
     335                        //      arg = appExpr->get_args().insert( arg, new VariableExpr( retval ) );
     336                        //      arg++;
     337                        // } else {
     338
     339                        // Create temporary to hold return value of polymorphic function and produce that temporary as a result
     340                        // using a comma expression.  Possibly change comma expression into statement expression "{}" for multiple
     341                        // return values.
     342                        ObjectDecl *newObj = makeTemporary( retType->clone() );
     343                        Expression *paramExpr = new VariableExpr( newObj );
     344                        // If the type of the temporary is not polymorphic, box temporary by taking its address; otherwise the
     345                        // temporary is already boxed and can be used directly.
     346                        if ( ! isPolyType( newObj->get_type(), scopeTyVars, env ) ) {
     347                                paramExpr = new AddressExpr( paramExpr );
     348                        } // if
     349                        arg = appExpr->get_args().insert( arg, paramExpr ); // add argument to function call
     350                        arg++;
     351                        // Build a comma expression to call the function and emulate a normal return.
     352                        CommaExpr *commaExpr = new CommaExpr( appExpr, new VariableExpr( newObj ) );
     353                        commaExpr->set_env( appExpr->get_env() );
     354                        appExpr->set_env( 0 );
     355                        return commaExpr;
     356                        // } // if
     357                        // return appExpr;
    348358                }
    349359
     
    411421
    412422                void Pass1::boxParams( ApplicationExpr *appExpr, FunctionType *function, std::list< Expression *>::iterator &arg, const TyVarMap &exprTyVars ) {
    413 ///   std::cout << "function is ";
    414 ///   function->print( std::cout );
    415423                        for ( std::list< DeclarationWithType *>::const_iterator param = function->get_parameters().begin(); param != function->get_parameters().end(); ++param, ++arg ) {
    416 ///     std::cout << "parameter is ";
    417 ///     (*param)->print( std::fcout );
    418 ///     std::cout << std::endl << "argument is ";
    419 ///     (*arg)->print( std::cout );
    420424                                assert( arg != appExpr->get_args().end() );
    421425                                addCast( *arg, (*param)->get_type(), exprTyVars );
     
    807811                Expression *Pass1::mutate( AddressExpr *addrExpr ) {
    808812                        assert( ! addrExpr->get_arg()->get_results().empty() );
     813
     814                        bool needs = false;
     815                        if ( UntypedExpr *expr = dynamic_cast< UntypedExpr *>( addrExpr->get_arg() ) ) {
     816                                if ( ! expr->get_results().empty() && isPolyType( expr->get_results().front(), scopeTyVars, env ) ) {
     817                                        if ( NameExpr *name = dynamic_cast< NameExpr *>( expr->get_function() ) ) {
     818                                                if ( name->get_name() == "*?" ) {
     819                                                        if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr->get_args().front() ) ) {
     820                                                                assert( ! appExpr->get_function()->get_results().empty() );
     821                                                                PointerType *pointer = dynamic_cast< PointerType *>( appExpr->get_function()->get_results().front() );
     822                                                                assert( pointer );
     823                                                                FunctionType *function = dynamic_cast< FunctionType *>( pointer->get_base() );
     824                                                                assert( function );
     825                                                                needs = needsAdapter( function, scopeTyVars );
     826                                                        } // if
     827                                                } // if
     828                                        } // if
     829                                } // if
     830                        } // if
    809831                        addrExpr->set_arg( mutateExpression( addrExpr->get_arg() ) );
    810                         if ( isPolyType( addrExpr->get_arg()->get_results().front(), scopeTyVars, env ) ) {
     832                        if ( isPolyType( addrExpr->get_arg()->get_results().front(), scopeTyVars, env ) || needs ) {
    811833                                Expression *ret = addrExpr->get_arg();
    812834                                delete ret->get_results().front();
     
    820842                }
    821843
    822                 Statement * Pass1::mutate(ReturnStmt *retStmt) {
    823                         // a cast expr on a polymorphic return value is either redundant or invalid
    824                         while ( CastExpr *castExpr = dynamic_cast< CastExpr *>( retStmt->get_expr() ) ) {
    825                                 retStmt->set_expr( castExpr->get_arg() );
    826                                 retStmt->get_expr()->set_env( castExpr->get_env() );
    827                                 castExpr->set_env( 0 );
    828                                 castExpr->set_arg( 0 );
    829                                 delete castExpr;
    830                         }
    831                         if ( retval && retStmt->get_expr() ) {
    832                                 assert( ! retStmt->get_expr()->get_results().empty() );
    833                                 if ( retStmt->get_expr()->get_results().front()->get_isLvalue() ) {
    834 ///       retStmt->set_expr( mutateExpression( retStmt->get_expr() ) );
    835                                         TypeInstType *typeInst = dynamic_cast< TypeInstType *>( retval->get_type() );
    836                                         assert( typeInst );
    837                                         std::map< std::string, DeclarationWithType *>::const_iterator assignIter = assignOps.find( typeInst->get_name() );
    838                                         if ( assignIter == assignOps.end() ) {
    839                                                 throw SemanticError( "Attempt to return dtype or ftype object in ", retStmt->get_expr() );
    840                                         } // if
    841                                         ApplicationExpr *assignExpr = new ApplicationExpr( new VariableExpr( assignIter->second ) );
    842                                         Expression *retParm = new NameExpr( retval->get_name() );
    843                                         retParm->get_results().push_back( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) );
    844                                         assignExpr->get_args().push_back( retParm );
    845                                         assignExpr->get_args().push_back( retStmt->get_expr() );
    846                                         stmtsToAdd.push_back( new ExprStmt( noLabels, mutateExpression( assignExpr ) ) );
    847                                 } else {
    848                                         useRetval = true;
    849                                         stmtsToAdd.push_back( new ExprStmt( noLabels, mutateExpression( retStmt->get_expr() ) ) );
    850                                         useRetval = false;
     844                Statement * Pass1::mutate( ReturnStmt *returnStmt ) {
     845                        if ( retval && returnStmt->get_expr() ) {
     846                                assert( ! returnStmt->get_expr()->get_results().empty() );
     847                                // ***** Code Removal ***** After introducing a temporary variable for all return expressions, the following code appears superfluous.
     848                                // if ( returnStmt->get_expr()->get_results().front()->get_isLvalue() ) {
     849                                // a cast expr on a polymorphic return value is either redundant or invalid
     850                                while ( CastExpr *castExpr = dynamic_cast< CastExpr *>( returnStmt->get_expr() ) ) {
     851                                        returnStmt->set_expr( castExpr->get_arg() );
     852                                        returnStmt->get_expr()->set_env( castExpr->get_env() );
     853                                        castExpr->set_env( 0 );
     854                                        castExpr->set_arg( 0 );
     855                                        delete castExpr;
     856                                } //while
     857                                TypeInstType *typeInst = dynamic_cast< TypeInstType *>( retval->get_type() );
     858                                assert( typeInst );
     859                                std::map< std::string, DeclarationWithType *>::const_iterator assignIter = assignOps.find( typeInst->get_name() );
     860                                if ( assignIter == assignOps.end() ) {
     861                                        throw SemanticError( "Attempt to return dtype or ftype object in ", returnStmt->get_expr() );
    851862                                } // if
    852                                 retStmt->set_expr( 0 );
     863                                ApplicationExpr *assignExpr = new ApplicationExpr( new VariableExpr( assignIter->second ) );
     864                                Expression *retParm = new NameExpr( retval->get_name() );
     865                                retParm->get_results().push_back( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) );
     866                                assignExpr->get_args().push_back( retParm );
     867                                assignExpr->get_args().push_back( returnStmt->get_expr() );
     868                                stmtsToAdd.push_back( new ExprStmt( noLabels, mutateExpression( assignExpr ) ) );
     869                                // } else {
     870                                //      useRetval = true;
     871                                //      stmtsToAdd.push_back( new ExprStmt( noLabels, mutateExpression( returnStmt->get_expr() ) ) );
     872                                //      useRetval = false;
     873                                // } // if
     874                                returnStmt->set_expr( 0 );
    853875                        } else {
    854                                 retStmt->set_expr( mutateExpression( retStmt->get_expr() ) );
    855                         } // if
    856                         return retStmt;
     876                                returnStmt->set_expr( mutateExpression( returnStmt->get_expr() ) );
     877                        } // if
     878                        return returnStmt;
    857879                }
    858880
     
    905927                                }
    906928                        }
    907 ///  deleteAll( functions );
     929//  deleteAll( functions );
    908930                }
    909931
  • src/GenPoly/GenPoly.cc

    rffad73a r5f6c42c  
    99// Author           : Richard C. Bilson
    1010// Created On       : Mon May 18 07:44:20 2015
    11 // Last Modified By : Rob Schluntz
    12 // Last Modified On : Tue Nov 24 15:23:08 2015
    13 // Update Count     : 11
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Tue Dec 15 16:11:18 2015
     13// Update Count     : 13
    1414//
    1515
     
    8080       
    8181        Type *isPolyType( Type *type, const TyVarMap &tyVars, const TypeSubstitution *env ) {
    82                 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType* >( type ) ) {
     82                if ( TypeInstType *typeInst = dynamic_cast< TypeInstType * >( type ) ) {
    8383                        if ( env ) {
    8484                                if ( Type *newType = env->lookup( typeInst->get_name() ) ) {
    8585                                        return isPolyType( newType, tyVars, env );
    86                                 } // if
    8786                        } // if
     87                } // if
    8888                        if ( tyVars.find( typeInst->get_name() ) != tyVars.end() ) {
    8989                                return type;
    90                         }
     90        }
    9191                } else if ( StructInstType *structType = dynamic_cast< StructInstType* >( type ) ) {
    9292                        if ( hasPolyParams( structType->get_parameters(), tyVars, env ) ) return type;
  • src/GenPoly/Lvalue.cc

    rffad73a r5f6c42c  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 07:41:33 2015
    13 // Update Count     : 1
     12// Last Modified On : Tue Dec 15 15:33:13 2015
     13// Update Count     : 3
    1414//
    1515
     
    122122                        if ( retval && retStmt->get_expr() ) {
    123123                                assert( ! retStmt->get_expr()->get_results().empty() );
    124                                 while ( CastExpr *castExpr = dynamic_cast< CastExpr* >( retStmt->get_expr() ) ) {
    125                                         retStmt->set_expr( castExpr->get_arg() );
    126                                         retStmt->get_expr()->set_env( castExpr->get_env() );
    127                                         castExpr->set_env( 0 );
    128                                         castExpr->set_arg( 0 );
    129                                         delete castExpr;
    130                                 } // while
    131124                                if ( retStmt->get_expr()->get_results().front()->get_isLvalue() ) {
     125                                        // ***** Code Removal ***** because casts may be stripped already
     126
     127                                        // strip casts because not allowed to take address of cast
     128                                        // while ( CastExpr *castExpr = dynamic_cast< CastExpr* >( retStmt->get_expr() ) ) {
     129                                        //      retStmt->set_expr( castExpr->get_arg() );
     130                                        //      retStmt->get_expr()->set_env( castExpr->get_env() );
     131                                        //      castExpr->set_env( 0 );
     132                                        //      castExpr->set_arg( 0 );
     133                                        //      delete castExpr;
     134                                        // } // while
    132135                                        retStmt->set_expr( new AddressExpr( retStmt->get_expr()->acceptMutator( *this ) ) );
    133136                                } else {
  • src/InitTweak/RemoveInit.cc

    rffad73a r5f6c42c  
    77// RemoveInit.cc --
    88//
    9 // Author           : Rodolfo G. Esteves
     9// Author           : Rob Schluntz
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 16:39:32 2015
    13 // Update Count     : 1
     12// Last Modified On : Tue Dec 15 15:37:26 2015
     13// Update Count     : 15
    1414//
    1515
     
    2626                const std::list<Label> noLabels;
    2727        }
     28       
     29        class RemoveInit : public Mutator {
     30          public:
     31                RemoveInit();
     32                virtual ObjectDecl * mutate(ObjectDecl *objDecl);
     33                virtual DeclarationWithType * mutate( FunctionDecl *functionDecl );
     34
     35                virtual Statement * mutate( ReturnStmt * returnStmt );
     36               
     37                virtual CompoundStmt * mutate(CompoundStmt * compoundStmt);
     38               
     39          protected:
     40                std::list< Statement* > stmtsToAddBefore;
     41                std::list< Statement* > stmtsToAddAfter;
     42                void mutateStatementList( std::list< Statement* > &statements );
     43
     44                std::list<DeclarationWithType*> returnVals;
     45                UniqueName tempNamer;
     46                std::string funcName;
     47        };
    2848
    2949        void tweak( std::list< Declaration * > translationUnit ) {
     
    3252        }
    3353
     54        RemoveInit::RemoveInit() : tempNamer( "_retVal" ) {}
     55       
    3456        void RemoveInit::mutateStatementList( std::list< Statement* > &statements ) {
    3557                for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) {
     
    3860                        } // if
    3961                        *i = (*i)->acceptMutator( *this );
     62                        if ( ! stmtsToAddBefore.empty() ) {
     63                                statements.splice( i, stmtsToAddBefore );
     64                        } // if
    4065                } // for
    4166                if ( ! stmtsToAddAfter.empty() ) {
     
    4974        }
    5075
    51 // in the case where an object has an initializer and a polymorphic type, insert an assignment
    52 // immediately after the declaration. This will (seemingly) cause the later phases to do the right
    53 // thing with the assignment
     76        // in the case where an object has an initializer and a polymorphic type, insert an assignment immediately after the
     77        // declaration. This will (seemingly) cause the later phases to do the right thing with the assignment
    5478        ObjectDecl *RemoveInit::mutate( ObjectDecl *objDecl ) {
    5579                if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) {
     
    6387                return objDecl;
    6488        }
     89
     90        Statement *RemoveInit::mutate( ReturnStmt *returnStmt ) {
     91                // update for multiple return values
     92                assert( returnVals.size() == 0 || returnVals.size() == 1 );
     93                // hands off if the function returns an lvalue - we don't want to allocate a temporary if a variable's address
     94                // is being returned
     95                if ( returnStmt->get_expr() && returnVals.size() == 1 && funcName != "?=?" && ! returnVals.front()->get_type()->get_isLvalue()  ) {
     96                        ObjectDecl *newObj = new ObjectDecl( tempNamer.newName(), DeclarationNode::NoStorageClass, LinkageSpec::C, 0, returnVals.front()->get_type()->clone(), 0 );
     97                        stmtsToAddBefore.push_back( new DeclStmt( noLabels, newObj ) );
     98                       
     99                        UntypedExpr *assign = new UntypedExpr( new NameExpr( "?=?" ) );
     100                        assign->get_args().push_back( new AddressExpr (new NameExpr( newObj->get_name() ) ) );
     101                        assign->get_args().push_back( returnStmt->get_expr() );
     102                        stmtsToAddBefore.push_back(new ExprStmt(noLabels, assign));
     103
     104                        returnStmt->set_expr( new VariableExpr( newObj ) );
     105                } // if
     106                return returnStmt;
     107        }
     108
     109        DeclarationWithType* RemoveInit::mutate( FunctionDecl *functionDecl ) {
     110                std::list<DeclarationWithType*> oldReturnVals = returnVals;
     111                std::string oldFuncName = funcName;
     112               
     113                FunctionType * type = functionDecl->get_functionType();
     114                returnVals = type->get_returnVals();
     115                funcName = functionDecl->get_name();
     116                DeclarationWithType * decl = Mutator::mutate( functionDecl );
     117                returnVals = oldReturnVals;
     118                funcName = oldFuncName;
     119                return decl;
     120        }
    65121} // namespace InitTweak
    66122
  • src/InitTweak/RemoveInit.h

    rffad73a r5f6c42c  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 19 16:40:11 2015
    13 // Update Count     : 1
     12// Last Modified On : Fri Nov 27 17:00:47 2015
     13// Update Count     : 2
    1414//
    1515
     
    2727        /// Adds assignment statements for polymorphic type initializers
    2828        void tweak( std::list< Declaration * > translationUnit );
    29 
    30         class RemoveInit : public Mutator {
    31           public:
    32                 // RemoveInit();
    33                 virtual ObjectDecl *mutate(ObjectDecl *objDecl);
    34                 virtual CompoundStmt *mutate(CompoundStmt *compoundStmt);
    35           protected:
    36                 std::list< Statement* > stmtsToAddAfter;
    37                 void mutateStatementList( std::list< Statement* > &statements );
    38         };
    3929} // namespace
    4030
  • src/SynTree/PointerType.cc

    rffad73a r5f6c42c  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon May 18 10:15:16 2015
    13 // Update Count     : 2
     12// Last Modified On : Tue Dec 15 15:39:10 2015
     13// Update Count     : 5
    1414//
    1515
     
    2020PointerType::PointerType( const Type::Qualifiers &tq, Type *base )
    2121        : Type( tq ), base( base ), dimension( 0 ), isVarLen( false ), isStatic( false ) {
    22         base->set_isLvalue( false );
    2322}
    2423
    2524PointerType::PointerType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic )
    2625        : Type( tq ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) {
    27         base->set_isLvalue( false );
    2826}
    2927
  • src/SynTree/Type.h

    rffad73a r5f6c42c  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Nov 20 12:54:09 2015
    13 // Update Count     : 15
     12// Last Modified On : Fri Nov 27 17:54:31 2015
     13// Update Count     : 16
    1414//
    1515
     
    188188        virtual ~FunctionType();
    189189
    190         std::list<DeclarationWithType*>& get_returnVals() { return returnVals; }
    191         std::list<DeclarationWithType*>& get_parameters() { return parameters; }
     190        std::list<DeclarationWithType*> & get_returnVals() { return returnVals; }
     191        std::list<DeclarationWithType*> & get_parameters() { return parameters; }
    192192        bool get_isVarArgs() { return isVarArgs; }
    193193        void set_isVarArgs( bool newValue ) { isVarArgs = newValue; }
  • src/examples/fstream_test.c

    rffad73a r5f6c42c  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed May 27 18:13:43 2015
    13 // Update Count     : 2
     12// Last Modified On : Mon Nov 23 14:43:32 2015
     13// Update Count     : 40
    1414//
    1515
     
    2020        ifstream *sin = ifstream_stdin();
    2121        int nombre;
    22         sout << "Appuyez un nombre, s'il vous plâit:\n";
    23         sin >> &nombre;
    24         sout << "Vous avez appuyé: " << nombre << "\n";
     22        sout | "Entrez un nombre, s'il vous plaît:\n";
     23        sin  | &nombre;
     24        sout | "Vous avez entré " | nombre | " stocké à l'adresse " | &nombre | endl;
     25        sout | "nombre " | nombre | " est "
     26                 | (nombre > 0 ? "plus grand que" :
     27                   nombre == 0 ? "égal à" : "moins de")
     28                 | " zéro" | endl;
     29
     30        sout | "Entrez trois nombres, s'il vous plaît:\n";
     31        int i, j, k;
     32        sin  | &i | &j | &k;
     33        sout | "Vous avez entré " | "i:" | i | " j:" | j | " k:" | k | endl;
     34
     35        sout | 3 | ' ' | 3.5 | ' ' | 'a' | ' ' | "abc" | endl;
    2536}
    2637
  • src/examples/hello.c

    rffad73a r5f6c42c  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Nov 20 16:02:50 2015
    13 // Update Count     : 3
     12// Last Modified On : Sun Nov 22 17:40:37 2015
     13// Update Count     : 5
    1414//
    1515
     
    1919        ofstream *sout = ofstream_stdout();
    2020        ifstream *sin = ifstream_stdin();
    21         sout << "Bonjour au monde!\n";
    22         sout << 3 << " " << 3.5 << " " << 'a' << " " << "abc" << "\n";
    23         int i, j, k;
    24         sin >> &i >> &j >> &k;
    25         sout << "i:" << i << " j:" << j << " k:" << k << "\n";
     21        sout | "Bonjour au monde!\n";
    2622}
    2723
  • src/examples/iostream.c

    rffad73a r5f6c42c  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Nov 20 13:19:19 2015
    13 // Update Count     : 9
     12// Last Modified On : Mon Dec  7 23:08:02 2015
     13// Update Count     : 24
    1414//
    1515
     
    2121
    2222forall( dtype ostype | ostream( ostype ) )
    23 ostype * ?<<?( ostype *os, char c ) {
     23ostype * ?|?( ostype *os, char c ) {
    2424        return write( os, &c, 1 );
    25 } // ?<<?
     25} // ?|?
    2626
    2727forall( dtype ostype | ostream( ostype ) )
    28 ostype * ?<<?( ostype *os, int i ) {
     28ostype * ?|?( ostype *os, int i ) {
    2929        char buffer[32];                                                                        // larger than the largest integer
    3030        sprintf( buffer, "%d", i );
    3131        return write( os, buffer, strlen( buffer ) );
    32 } // ?<<?
     32} // ?|?
    3333
    3434forall( dtype ostype | ostream( ostype ) )
    35 ostype * ?<<?( ostype *os, double d ) {
     35ostype * ?|?( ostype *os, double d ) {
    3636        char buffer[32];                                                                        // larger than the largest double
    3737        sprintf( buffer, "%g", d );
    3838        return write( os, buffer, strlen( buffer ) );
    39 } // ?<<?
     39} // ?|?
    4040
    4141forall( dtype ostype | ostream( ostype ) )
    42 ostype * ?<<?( ostype *os, const char *cp ) {
     42ostype * ?|?( ostype *os, const char *cp ) {
    4343        return write( os, cp, strlen( cp ) );
    44 } // ?<<?
     44} // ?|?
    4545
    4646forall( dtype ostype | ostream( ostype ) )
    47 ostype * ?<<?( ostype *os, const void *p ) {
     47ostype * ?|?( ostype *os, const void *p ) {
    4848        char buffer[32];                                                                        // larger than the largest pointer
    4949        sprintf( buffer, "%p", p );
    5050        return write( os, buffer, strlen( buffer ) );
    51 } // ?<<?
     51} // ?|?
     52
     53
     54forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) )
     55retostype * ?|?( ostype *os, retostype * (*manip)(ostype*) ) {
     56  return manip(os);
     57}
     58
     59forall( dtype ostype | ostream( ostype ) )
     60ostype * endl( ostype * os ) {
     61  os | "\n";
     62  // flush
     63  return os;
     64} // endl
    5265
    5366forall( type elt_type | writeable( elt_type ),
     
    5669void write( iterator_type begin, iterator_type end, os_type *os ) {
    5770        void print( elt_type i ) {
    58                 os << i << ' ';
     71                os | i | ' ';
    5972        }
    6073        for_each( begin, end, print );
    61 } // ?<<?
     74} // ?|?
    6275
    6376forall( type elt_type | writeable( elt_type ),
     
    6578                dtype os_type | ostream( os_type ) )
    6679void write_reverse( iterator_type begin, iterator_type end, os_type *os ) {
    67         void print( elt_type i ) {
    68                 os << i << ' ';
    69         }
     80        void print( elt_type i ) { os | i | ' '; }
    7081        for_each_reverse( begin, end, print );
    71 } // ?<<?
     82} // ?|?
    7283
    7384
    7485forall( dtype istype | istream( istype ) )
    75 istype * ?>>?( istype *is, char *cp ) {
     86istype * ?|?( istype *is, char *cp ) {
    7687        return read( is, cp, 1 );
    77 } // ?>>?
     88} // ?|?
    7889
    7990forall( dtype istype | istream( istype ) )
    80 istype * ?>>?( istype *is, int *ip ) {
     91istype * ?|?( istype *is, int *ip ) {
    8192        char cur;
    8293 
    8394        // skip some whitespace
    8495        do {
    85                 is >> &cur;
     96                is | &cur;
    8697                if ( fail( is ) || eof( is ) ) return is;
    8798        } while ( !( cur >= '0' && cur <= '9' ) );
     
    91102        while ( cur >= '0' && cur <= '9' ) {
    92103                *ip = *ip * 10 + ( cur - '0' );
    93                 is >> &cur;
     104                is | &cur;
    94105                if ( fail( is ) || eof( is ) ) return is;
    95106        }
     
    97108        unread( is, cur );
    98109        return is;
    99 } // ?>>?
     110} // ?|?
    100111
    101112// Local Variables: //
  • src/examples/iostream.h

    rffad73a r5f6c42c  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Nov 19 17:56:51 2015
    13 // Update Count     : 5
     12// Last Modified On : Mon Nov 23 14:15:25 2015
     13// Update Count     : 17
    1414//
    1515
     
    2727
    2828context writeable( type T ) {
    29         forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, T );
     29        forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T );
    3030};
    3131
    3232// implement writable for some intrinsic types
    3333
    34 forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, char );
    35 forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, int );
    36 forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, double );
    37 forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, const char * );
    38 forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, void * );
     34forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, char );
     35forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, int );
     36forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, double );
     37forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const char * );
     38forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, const void * );
     39
     40forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) ) retostype * ?|?( ostype *os, retostype * (* manip)(ostype*) );
     41forall( dtype ostype | ostream( ostype ) ) ostype * endl( ostype * );
    3942
    4043// writes the range [begin, end) to the given stream
     
    4952void write_reverse( iterator_type begin, iterator_type end, os_type *os );
    5053
     54//******************************************************************************
    5155
    5256context istream( dtype istype ) {
     
    5862
    5963context readable( type T ) {
    60         forall( dtype istype | istream( istype ) ) istype * ?<<?( istype *, T );
     64        forall( dtype istype | istream( istype ) ) istype * ?|?( istype *, T );
    6165};
    6266
    6367forall( dtype istype | istream( istype ) )
    64 istype * ?>>?( istype *, char * );
     68istype * ?|?( istype *, char * );
    6569
    6670forall( dtype istype | istream( istype ) )
    67 istype * ?>>?( istype *, int * );
     71istype * ?|?( istype *, int * );
    6872
    6973#endif // IOSTREAM_H
  • src/examples/sum.c

    rffad73a r5f6c42c  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Sep 28 15:09:55 2015
    13 // Update Count     : 118
     12// Last Modified On : Sat Nov 21 18:08:18 2015
     13// Update Count     : 119
    1414//
    1515
     
    5353        }
    5454        sout << "sum from " << low << " to " << High << " is "
    55                  << (int)sum( size, a ) << ", check " << (int)s << "\n";
     55                 << (int)sum( size, a ) << ", check " << (int)s << endl;
    5656
    5757        int s = 0, a[size];
     
    6262        }
    6363        sout << "sum from " << low << " to " << High << " is "
    64                  << sum( size, (int *)a ) << ", check " << (int)s << "\n";
     64                 << sum( size, (int *)a ) << ", check " << (int)s << endl;
    6565
    6666        double s = 0.0, a[size];
     
    7272        printf( "%g\n", sum( size, (double *)a ) );
    7373//      sout << "sum from " << low / 10.0 << " to " << High / 10.0 << " is "
    74 //               << sum( size, (double *)a ) << ", check " << (double)s << "\n";
     74//               << sum( size, (double *)a ) << ", check " << (double)s << endl;
    7575
    7676        float s = 0.0, a[size];
     
    8282        printf( "%g\n", sum( size, (float *)a ) );
    8383//      sout << "sum from " << low / 10.0 << " to " << High / 10.0 << " is "
    84 //               << sum( size, (float *)a ) << ", check " << (float)s << "\n";
     84//               << sum( size, (float *)a ) << ", check " << (float)s << endl;
    8585}
    8686
  • src/examples/vector_test.c

    rffad73a r5f6c42c  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Nov 19 17:54:34 2015
    13 // Update Count     : 9
     12// Last Modified On : Tue Dec 15 16:02:56 2015
     13// Update Count     : 13
    1414//
    1515
     
    2727        int num;
    2828
    29         sout << "enter N elements and C-d on a separate line:\n";
     29        sout | "enter N elements and C-d on a separate line:" | endl;
    3030        for ( ;; ) {
    31                 sin >> &num;
     31                sin | &num;
    3232          if ( fail( sin ) || eof( sin ) ) break;
    3333                append( &vec, num );
     
    3535        // write out the numbers
    3636
    37         sout << "Array elements:\n";
     37        sout | "Array elements:" | endl;
    3838        write( begin( vec ), end( vec ), sout );
    39         sout << "\n";
     39        sout | endl;
    4040
    41         sout << "Array elements reversed:\n";
     41        sout | "Array elements reversed:" | endl;
    4242        write_reverse( begin( vec ), end( vec ), sout );
    43         sout << "\n";
     43        sout | endl;
    4444}
    4545
Note: See TracChangeset for help on using the changeset viewer.