Changes in / [4389966:78dd0da]
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/refrat/refrat.tex
r4389966 r78dd0da 112 112 \lstset{ 113 113 language=CFA, 114 columns=f lexible,114 columns=fullflexible, 115 115 basicstyle=\sf\small, 116 116 tabsize=4, 117 117 xleftmargin=\parindent, 118 118 escapechar=@, 119 %fancyvrb=true, 120 %showtabs=true, 119 121 keepspaces=true, 120 %showtabs=true,121 %tab=\rightarrowfill,122 showtabs=true, 123 tab=, 122 124 }% 123 125 -
src/GenPoly/Box.cc
r4389966 r78dd0da 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : T ue Dec 15 15:30:31201513 // Update Count : 21511 // Last Modified By : Rob Schluntz 12 // Last Modified On : Thu Nov 26 17:01:55 2015 13 // Update Count : 191 14 14 // 15 15 … … 55 55 public: 56 56 Pass1(); 57 virtual Expression * 58 virtual Expression * 59 virtual Expression * 60 virtual DeclarationWithType 61 virtual TypeDecl * 62 virtual Expression * 63 virtual Expression * 64 virtual Statement * mutate( ReturnStmt *returnStmt);65 virtual Type * 66 virtual Type * mutate( FunctionType *functionType );57 virtual Expression *mutate( ApplicationExpr *appExpr ); 58 virtual Expression *mutate( AddressExpr *addrExpr ); 59 virtual Expression *mutate( UntypedExpr *expr ); 60 virtual DeclarationWithType* mutate( FunctionDecl *functionDecl ); 61 virtual TypeDecl *mutate( TypeDecl *typeDecl ); 62 virtual Expression *mutate( CommaExpr *commaExpr ); 63 virtual Expression *mutate( ConditionalExpr *condExpr ); 64 virtual Statement *mutate(ReturnStmt *catchStmt); 65 virtual Type *mutate( PointerType *pointerType ); 66 virtual Type *mutate( FunctionType *pointerType ); 67 67 68 68 virtual void doBeginScope(); … … 192 192 if ( PointerType *pointer = dynamic_cast< PointerType *>( funType->get_parameters().front()->get_type() ) ) { 193 193 if ( TypeInstType *typeInst = dynamic_cast< TypeInstType *>( pointer->get_base() ) ) { 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 194 name = typeInst->get_name(); 195 return true; 200 196 } // if 201 197 } // if … … 348 344 349 345 Expression *Pass1::addRetParam( ApplicationExpr *appExpr, FunctionType *function, Type *retType, std::list< Expression *>::iterator &arg ) { 350 // ***** Code Removal ***** After introducing a temporary variable for all return expressions, the following code appears superfluous. 351 // if ( useRetval ) { 352 // assert( retval ); 353 // arg = appExpr->get_args().insert( arg, new VariableExpr( retval ) ); 354 // arg++; 355 // } else { 356 357 // Create temporary to hold return value of polymorphic function and produce that temporary as a result 358 // using a comma expression. Possibly change comma expression into statement expression "{}" for multiple 359 // return values. 360 ObjectDecl *newObj = makeTemporary( retType->clone() ); 361 Expression *paramExpr = new VariableExpr( newObj ); 362 // If the type of the temporary is not polymorphic, box temporary by taking its address; otherwise the 363 // temporary is already boxed and can be used directly. 364 if ( ! isPolyType( newObj->get_type(), env, scopeTyVars ) ) { 365 paramExpr = new AddressExpr( paramExpr ); 366 } // if 367 arg = appExpr->get_args().insert( arg, paramExpr ); // add argument to function call 368 arg++; 369 // Build a comma expression to call the function and emulate a normal return. 370 CommaExpr *commaExpr = new CommaExpr( appExpr, new VariableExpr( newObj ) ); 371 commaExpr->set_env( appExpr->get_env() ); 372 appExpr->set_env( 0 ); 373 return commaExpr; 374 // } // if 375 // return appExpr; 346 if ( useRetval ) { 347 assert( retval ); 348 arg = appExpr->get_args().insert( arg, new VariableExpr( retval ) ); 349 arg++; 350 } else { 351 ObjectDecl *newObj = makeTemporary( retType->clone() ); 352 Expression *paramExpr = new VariableExpr( newObj ); 353 if ( ! isPolyType( newObj->get_type(), env, scopeTyVars ) ) { 354 paramExpr = new AddressExpr( paramExpr ); 355 } // if 356 arg = appExpr->get_args().insert( arg, paramExpr ); 357 arg++; 358 /// stmtsToAdd.push_back( new ExprStmt( noLabels, appExpr ) ); 359 CommaExpr *commaExpr = new CommaExpr( appExpr, new VariableExpr( newObj ) ); 360 commaExpr->set_env( appExpr->get_env() ); 361 appExpr->set_env( 0 ); 362 return commaExpr; 363 } // if 364 return appExpr; 376 365 } 377 366 … … 428 417 Type *newType = formal->clone(); 429 418 std::list< FunctionType *> functions; 430 // instead of functions needing adapters, this really ought to look for any function mentioning a431 // polymorphic type419 // instead of functions needing adapters, this really ought to look for 420 // any function mentioning a polymorphic type 432 421 findAndReplaceFunction( newType, functions, tyVars, needsAdapter ); 433 422 if ( ! functions.empty() ) { … … 867 856 Expression *Pass1::mutate( AddressExpr *addrExpr ) { 868 857 assert( ! addrExpr->get_arg()->get_results().empty() ); 869 870 bool needs = false;871 if ( UntypedExpr *expr = dynamic_cast< UntypedExpr *>( addrExpr->get_arg() ) ) {872 if ( ! expr->get_results().empty() && isPolyType( expr->get_results().front(), env, scopeTyVars ) ) {873 if ( NameExpr *name = dynamic_cast< NameExpr *>( expr->get_function() ) ) {874 if ( name->get_name() == "*?" ) {875 if ( ApplicationExpr * appExpr = dynamic_cast< ApplicationExpr * >( expr->get_args().front() ) ) {876 assert( ! appExpr->get_function()->get_results().empty() );877 PointerType *pointer = dynamic_cast< PointerType *>( appExpr->get_function()->get_results().front() );878 assert( pointer );879 FunctionType *function = dynamic_cast< FunctionType *>( pointer->get_base() );880 assert( function );881 needs = needsAdapter( function, scopeTyVars );882 } // if883 } // if884 } // if885 } // if886 } // if887 858 addrExpr->set_arg( mutateExpression( addrExpr->get_arg() ) ); 888 if ( isPolyType( addrExpr->get_arg()->get_results().front(), env, scopeTyVars ) || needs) {859 if ( isPolyType( addrExpr->get_arg()->get_results().front(), env, scopeTyVars ) ) { 889 860 Expression *ret = addrExpr->get_arg(); 890 861 delete ret->get_results().front(); … … 898 869 } 899 870 900 Statement * Pass1::mutate( ReturnStmt *returnStmt ) { 901 if ( retval && returnStmt->get_expr() ) { 902 assert( ! returnStmt->get_expr()->get_results().empty() ); 903 // ***** Code Removal ***** After introducing a temporary variable for all return expressions, the following code appears superfluous. 904 // if ( returnStmt->get_expr()->get_results().front()->get_isLvalue() ) { 905 // a cast expr on a polymorphic return value is either redundant or invalid 906 while ( CastExpr *castExpr = dynamic_cast< CastExpr *>( returnStmt->get_expr() ) ) { 907 returnStmt->set_expr( castExpr->get_arg() ); 908 returnStmt->get_expr()->set_env( castExpr->get_env() ); 909 castExpr->set_env( 0 ); 910 castExpr->set_arg( 0 ); 911 delete castExpr; 912 } // while 913 TypeInstType *typeInst = dynamic_cast< TypeInstType *>( retval->get_type() ); 914 assert( typeInst ); 915 std::map< std::string, DeclarationWithType *>::const_iterator assignIter = assignOps.find( typeInst->get_name() ); 916 if ( assignIter == assignOps.end() ) { 917 throw SemanticError( "Attempt to return dtype or ftype object in ", returnStmt->get_expr() ); 918 } // if 919 ApplicationExpr *assignExpr = new ApplicationExpr( new VariableExpr( assignIter->second ) ); 920 Expression *retParm = new NameExpr( retval->get_name() ); 921 retParm->get_results().push_back( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) ); 922 assignExpr->get_args().push_back( retParm ); 923 assignExpr->get_args().push_back( returnStmt->get_expr() ); 924 stmtsToAdd.push_back( new ExprStmt( noLabels, mutateExpression( assignExpr ) ) ); 925 // } else { 926 // std::cerr << "THOMAS " << std::endl; 927 // useRetval = true; 928 // stmtsToAdd.push_back( new ExprStmt( noLabels, mutateExpression( returnStmt->get_expr() ) ) ); 929 // useRetval = false; 930 // } // if 931 returnStmt->set_expr( 0 ); 871 Statement * Pass1::mutate(ReturnStmt *retStmt) { 872 // a cast expr on a polymorphic return value is either redundant or invalid 873 while ( CastExpr *castExpr = dynamic_cast< CastExpr *>( retStmt->get_expr() ) ) { 874 retStmt->set_expr( castExpr->get_arg() ); 875 retStmt->get_expr()->set_env( castExpr->get_env() ); 876 castExpr->set_env( 0 ); 877 castExpr->set_arg( 0 ); 878 delete castExpr; 879 } 880 if ( retval && retStmt->get_expr() ) { 881 assert( ! retStmt->get_expr()->get_results().empty() ); 882 if ( retStmt->get_expr()->get_results().front()->get_isLvalue() ) { 883 /// retStmt->set_expr( mutateExpression( retStmt->get_expr() ) ); 884 TypeInstType *typeInst = dynamic_cast< TypeInstType *>( retval->get_type() ); 885 assert( typeInst ); 886 std::map< std::string, DeclarationWithType *>::const_iterator assignIter = assignOps.find( typeInst->get_name() ); 887 if ( assignIter == assignOps.end() ) { 888 throw SemanticError( "Attempt to return dtype or ftype object in ", retStmt->get_expr() ); 889 } // if 890 ApplicationExpr *assignExpr = new ApplicationExpr( new VariableExpr( assignIter->second ) ); 891 Expression *retParm = new NameExpr( retval->get_name() ); 892 retParm->get_results().push_back( new PointerType( Type::Qualifiers(), retval->get_type()->clone() ) ); 893 assignExpr->get_args().push_back( retParm ); 894 assignExpr->get_args().push_back( retStmt->get_expr() ); 895 stmtsToAdd.push_back( new ExprStmt( noLabels, mutateExpression( assignExpr ) ) ); 896 } else { 897 useRetval = true; 898 stmtsToAdd.push_back( new ExprStmt( noLabels, mutateExpression( retStmt->get_expr() ) ) ); 899 useRetval = false; 900 } // if 901 retStmt->set_expr( 0 ); 932 902 } else { 933 ret urnStmt->set_expr( mutateExpression( returnStmt->get_expr() ) );934 } // if 935 return ret urnStmt;903 retStmt->set_expr( mutateExpression( retStmt->get_expr() ) ); 904 } // if 905 return retStmt; 936 906 } 937 907 … … 1135 1105 if ( ObjectDecl *objectDecl = dynamic_cast< ObjectDecl *>( declStmt->get_decl() ) ) { 1136 1106 if ( isPolyVal( objectDecl->get_type(), scopeTyVars ) ) { 1137 // change initialization of a polymorphic value object to allocate storage with alloca 1107 // change initialization of a polymorphic value object 1108 // to allocate storage with alloca 1138 1109 TypeInstType *typeInst = dynamic_cast< TypeInstType *>( objectDecl->get_type() ); 1139 1110 assert( typeInst ); -
src/GenPoly/GenPoly.cc
r4389966 r78dd0da 9 9 // Author : Richard C. Bilson 10 10 // Created On : Mon May 18 07:44:20 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Tue Dec 15 16:11:18 201513 // Update Count : 1 311 // Last Modified By : Rob Schluntz 12 // Last Modified On : Tue Nov 24 15:23:08 2015 13 // Update Count : 11 14 14 // 15 15 … … 21 21 22 22 namespace GenPoly { 23 /// A function needs an adapter if it returns a polymorphic value or if any of its parameters have polymorphic type 23 /// A function needs an adapter if it returns a polymorphic value or if any of its 24 /// parameters have polymorphic type 24 25 bool needsAdapter( FunctionType *adaptee, const TyVarMap &tyVars ) { 25 26 if ( ! adaptee->get_returnVals().empty() && isPolyVal( adaptee->get_returnVals().front()->get_type(), tyVars ) ) { -
src/GenPoly/Lvalue.cc
r4389966 r78dd0da 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 15 15:33:13 201513 // Update Count : 312 // Last Modified On : Tue May 19 07:41:33 2015 13 // Update Count : 1 14 14 // 15 15 … … 122 122 if ( retval && retStmt->get_expr() ) { 123 123 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 124 131 if ( retStmt->get_expr()->get_results().front()->get_isLvalue() ) { 125 // ***** Code Removal ***** because casts may be stripped already126 127 // strip casts because not allowed to take address of cast128 // 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 // } // while135 132 retStmt->set_expr( new AddressExpr( retStmt->get_expr()->acceptMutator( *this ) ) ); 136 133 } else { -
src/InitTweak/RemoveInit.cc
r4389966 r78dd0da 7 7 // RemoveInit.cc -- 8 8 // 9 // Author : Ro b Schluntz9 // Author : Rodolfo G. Esteves 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 15 15:37:26201513 // Update Count : 1 512 // Last Modified On : Tue May 19 16:39:32 2015 13 // Update Count : 1 14 14 // 15 15 … … 26 26 const std::list<Label> noLabels; 27 27 } 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 };48 28 49 29 void tweak( std::list< Declaration * > translationUnit ) { … … 52 32 } 53 33 54 RemoveInit::RemoveInit() : tempNamer( "_retVal" ) {}55 56 34 void RemoveInit::mutateStatementList( std::list< Statement* > &statements ) { 57 35 for ( std::list< Statement* >::iterator i = statements.begin(); i != statements.end(); ++i ) { … … 60 38 } // if 61 39 *i = (*i)->acceptMutator( *this ); 62 if ( ! stmtsToAddBefore.empty() ) {63 statements.splice( i, stmtsToAddBefore );64 } // if65 40 } // for 66 41 if ( ! stmtsToAddAfter.empty() ) { … … 74 49 } 75 50 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 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 78 54 ObjectDecl *RemoveInit::mutate( ObjectDecl *objDecl ) { 79 55 if (objDecl->get_init() && dynamic_cast<TypeInstType*>(objDecl->get_type())) { … … 87 63 return objDecl; 88 64 } 89 90 Statement *RemoveInit::mutate( ReturnStmt *returnStmt ) {91 // update for multiple return values92 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 address94 // is being returned95 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 } // if106 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 }121 65 } // namespace InitTweak 122 66 -
src/InitTweak/RemoveInit.h
r4389966 r78dd0da 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 27 17:00:47201513 // Update Count : 212 // Last Modified On : Tue May 19 16:40:11 2015 13 // Update Count : 1 14 14 // 15 15 … … 27 27 /// Adds assignment statements for polymorphic type initializers 28 28 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 }; 29 39 } // namespace 30 40 -
src/SynTree/PointerType.cc
r4389966 r78dd0da 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Dec 15 15:39:10201513 // Update Count : 512 // Last Modified On : Mon May 18 10:15:16 2015 13 // Update Count : 2 14 14 // 15 15 … … 20 20 PointerType::PointerType( const Type::Qualifiers &tq, Type *base ) 21 21 : Type( tq ), base( base ), dimension( 0 ), isVarLen( false ), isStatic( false ) { 22 base->set_isLvalue( false ); 22 23 } 23 24 24 25 PointerType::PointerType( const Type::Qualifiers &tq, Type *base, Expression *dimension, bool isVarLen, bool isStatic ) 25 26 : Type( tq ), base( base ), dimension( dimension ), isVarLen( isVarLen ), isStatic( isStatic ) { 27 base->set_isLvalue( false ); 26 28 } 27 29 -
src/SynTree/Type.h
r4389966 r78dd0da 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 2 7 17:54:31201513 // Update Count : 1 612 // Last Modified On : Fri Nov 20 12:54:09 2015 13 // Update Count : 15 14 14 // 15 15 … … 188 188 virtual ~FunctionType(); 189 189 190 std::list<DeclarationWithType*> 191 std::list<DeclarationWithType*> 190 std::list<DeclarationWithType*>& get_returnVals() { return returnVals; } 191 std::list<DeclarationWithType*>& get_parameters() { return parameters; } 192 192 bool get_isVarArgs() { return isVarArgs; } 193 193 void set_isVarArgs( bool newValue ) { isVarArgs = newValue; } -
src/examples/fstream_test.c
r4389966 r78dd0da 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Nov 23 14:43:32201513 // Update Count : 4012 // Last Modified On : Wed May 27 18:13:43 2015 13 // Update Count : 2 14 14 // 15 15 … … 20 20 ifstream *sin = ifstream_stdin(); 21 21 int nombre; 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; 22 sout << "Appuyez un nombre, s'il vous plâit:\n"; 23 sin >> &nombre; 24 sout << "Vous avez appuyé: " << nombre << "\n"; 36 25 } 37 26 -
src/examples/hello.c
r4389966 r78dd0da 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Nov 22 17:40:37201513 // Update Count : 512 // Last Modified On : Fri Nov 20 16:02:50 2015 13 // Update Count : 3 14 14 // 15 15 … … 19 19 ofstream *sout = ofstream_stdout(); 20 20 ifstream *sin = ifstream_stdin(); 21 sout | "Bonjour au monde!\n"; 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"; 22 26 } 23 27 -
src/examples/iostream.c
r4389966 r78dd0da 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Dec 7 23:08:02201513 // Update Count : 2412 // Last Modified On : Fri Nov 20 13:19:19 2015 13 // Update Count : 9 14 14 // 15 15 … … 21 21 22 22 forall( dtype ostype | ostream( ostype ) ) 23 ostype * ? |?( ostype *os, char c ) {23 ostype * ?<<?( ostype *os, char c ) { 24 24 return write( os, &c, 1 ); 25 } // ? |?25 } // ?<<? 26 26 27 27 forall( dtype ostype | ostream( ostype ) ) 28 ostype * ? |?( ostype *os, int i ) {28 ostype * ?<<?( ostype *os, int i ) { 29 29 char buffer[32]; // larger than the largest integer 30 30 sprintf( buffer, "%d", i ); 31 31 return write( os, buffer, strlen( buffer ) ); 32 } // ? |?32 } // ?<<? 33 33 34 34 forall( dtype ostype | ostream( ostype ) ) 35 ostype * ? |?( ostype *os, double d ) {35 ostype * ?<<?( ostype *os, double d ) { 36 36 char buffer[32]; // larger than the largest double 37 37 sprintf( buffer, "%g", d ); 38 38 return write( os, buffer, strlen( buffer ) ); 39 } // ? |?39 } // ?<<? 40 40 41 41 forall( dtype ostype | ostream( ostype ) ) 42 ostype * ? |?( ostype *os, const char *cp ) {42 ostype * ?<<?( ostype *os, const char *cp ) { 43 43 return write( os, cp, strlen( cp ) ); 44 } // ? |?44 } // ?<<? 45 45 46 46 forall( dtype ostype | ostream( ostype ) ) 47 ostype * ? |?( ostype *os, const void *p ) {47 ostype * ?<<?( ostype *os, const void *p ) { 48 48 char buffer[32]; // larger than the largest pointer 49 49 sprintf( buffer, "%p", p ); 50 50 return write( os, buffer, strlen( buffer ) ); 51 } // ?|? 52 53 54 forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) ) 55 retostype * ?|?( ostype *os, retostype * (*manip)(ostype*) ) { 56 return manip(os); 57 } 58 59 forall( dtype ostype | ostream( ostype ) ) 60 ostype * endl( ostype * os ) { 61 os | "\n"; 62 // flush 63 return os; 64 } // endl 51 } // ?<<? 65 52 66 53 forall( type elt_type | writeable( elt_type ), … … 69 56 void write( iterator_type begin, iterator_type end, os_type *os ) { 70 57 void print( elt_type i ) { 71 os | i |' ';58 os << i << ' '; 72 59 } 73 60 for_each( begin, end, print ); 74 } // ? |?61 } // ?<<? 75 62 76 63 forall( type elt_type | writeable( elt_type ), … … 78 65 dtype os_type | ostream( os_type ) ) 79 66 void write_reverse( iterator_type begin, iterator_type end, os_type *os ) { 80 void print( elt_type i ) { os | i | ' '; } 67 void print( elt_type i ) { 68 os << i << ' '; 69 } 81 70 for_each_reverse( begin, end, print ); 82 } // ? |?71 } // ?<<? 83 72 84 73 85 74 forall( dtype istype | istream( istype ) ) 86 istype * ? |?( istype *is, char *cp ) {75 istype * ?>>?( istype *is, char *cp ) { 87 76 return read( is, cp, 1 ); 88 } // ? |?77 } // ?>>? 89 78 90 79 forall( dtype istype | istream( istype ) ) 91 istype * ? |?( istype *is, int *ip ) {80 istype * ?>>?( istype *is, int *ip ) { 92 81 char cur; 93 82 94 83 // skip some whitespace 95 84 do { 96 is |&cur;85 is >> &cur; 97 86 if ( fail( is ) || eof( is ) ) return is; 98 87 } while ( !( cur >= '0' && cur <= '9' ) ); … … 102 91 while ( cur >= '0' && cur <= '9' ) { 103 92 *ip = *ip * 10 + ( cur - '0' ); 104 is |&cur;93 is >> &cur; 105 94 if ( fail( is ) || eof( is ) ) return is; 106 95 } … … 108 97 unread( is, cur ); 109 98 return is; 110 } // ? |?99 } // ?>>? 111 100 112 101 // Local Variables: // -
src/examples/iostream.h
r4389966 r78dd0da 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Nov 23 14:15:25201513 // Update Count : 1712 // Last Modified On : Thu Nov 19 17:56:51 2015 13 // Update Count : 5 14 14 // 15 15 … … 27 27 28 28 context writeable( type T ) { 29 forall( dtype ostype | ostream( ostype ) ) ostype * ? |?( ostype *, T );29 forall( dtype ostype | ostream( ostype ) ) ostype * ?<<?( ostype *, T ); 30 30 }; 31 31 32 32 // implement writable for some intrinsic types 33 33 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 *, const void * ); 39 40 forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) ) retostype * ?|?( ostype *os, retostype * (* manip)(ostype*) ); 41 forall( dtype ostype | ostream( ostype ) ) ostype * endl( ostype * ); 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 * ); 42 39 43 40 // writes the range [begin, end) to the given stream … … 52 49 void write_reverse( iterator_type begin, iterator_type end, os_type *os ); 53 50 54 //******************************************************************************55 51 56 52 context istream( dtype istype ) { … … 62 58 63 59 context readable( type T ) { 64 forall( dtype istype | istream( istype ) ) istype * ? |?( istype *, T );60 forall( dtype istype | istream( istype ) ) istype * ?<<?( istype *, T ); 65 61 }; 66 62 67 63 forall( dtype istype | istream( istype ) ) 68 istype * ? |?( istype *, char * );64 istype * ?>>?( istype *, char * ); 69 65 70 66 forall( dtype istype | istream( istype ) ) 71 istype * ? |?( istype *, int * );67 istype * ?>>?( istype *, int * ); 72 68 73 69 #endif // IOSTREAM_H -
src/examples/sum.c
r4389966 r78dd0da 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sat Nov 21 18:08:18201513 // Update Count : 11 912 // Last Modified On : Mon Sep 28 15:09:55 2015 13 // Update Count : 118 14 14 // 15 15 … … 53 53 } 54 54 sout << "sum from " << low << " to " << High << " is " 55 << (int)sum( size, a ) << ", check " << (int)s << endl;55 << (int)sum( size, a ) << ", check " << (int)s << "\n"; 56 56 57 57 int s = 0, a[size]; … … 62 62 } 63 63 sout << "sum from " << low << " to " << High << " is " 64 << sum( size, (int *)a ) << ", check " << (int)s << endl;64 << sum( size, (int *)a ) << ", check " << (int)s << "\n"; 65 65 66 66 double s = 0.0, a[size]; … … 72 72 printf( "%g\n", sum( size, (double *)a ) ); 73 73 // sout << "sum from " << low / 10.0 << " to " << High / 10.0 << " is " 74 // << sum( size, (double *)a ) << ", check " << (double)s << endl;74 // << sum( size, (double *)a ) << ", check " << (double)s << "\n"; 75 75 76 76 float s = 0.0, a[size]; … … 82 82 printf( "%g\n", sum( size, (float *)a ) ); 83 83 // sout << "sum from " << low / 10.0 << " to " << High / 10.0 << " is " 84 // << sum( size, (float *)a ) << ", check " << (float)s << endl;84 // << sum( size, (float *)a ) << ", check " << (float)s << "\n"; 85 85 } 86 86 -
src/examples/vector_test.c
r4389966 r78dd0da 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Dec 15 16:02:56201513 // Update Count : 1312 // Last Modified On : Thu Nov 19 17:54:34 2015 13 // Update Count : 9 14 14 // 15 15 … … 27 27 int num; 28 28 29 sout | "enter N elements and C-d on a separate line:" | endl;29 sout << "enter N elements and C-d on a separate line:\n"; 30 30 for ( ;; ) { 31 sin |#31 sin >> # 32 32 if ( fail( sin ) || eof( sin ) ) break; 33 33 append( &vec, num ); … … 35 35 // write out the numbers 36 36 37 sout | "Array elements:" | endl;37 sout << "Array elements:\n"; 38 38 write( begin( vec ), end( vec ), sout ); 39 sout | endl;39 sout << "\n"; 40 40 41 sout | "Array elements reversed:" | endl;41 sout << "Array elements reversed:\n"; 42 42 write_reverse( begin( vec ), end( vec ), sout ); 43 sout | endl;43 sout << "\n"; 44 44 } 45 45
Note:
See TracChangeset
for help on using the changeset viewer.