Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision de62360d1d2709386152807b3d18e159e241ab1f)
+++ src/CodeGen/CodeGenerator.cc	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun 23 16:16:57 2015
-// Update Count     : 133
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Jun 24 16:11:41 2015
+// Update Count     : 143
 //
 
@@ -44,13 +44,21 @@
 	}
 
-	CodeGenerator::CodeGenerator( std::ostream &os ) : cur_indent( 0 ), insideFunction( false ), output( os ) { }
-
-	CodeGenerator::CodeGenerator( std::ostream &os, std::string init, int indent, bool infunp )
-			: cur_indent( indent ), insideFunction( infunp ), output( os ) {
+	ostream & CodeGenerator::Indenter::operator()( ostream & output ) {
+	  return output << string( cg.cur_indent, ' ' );
+	}
+
+	ostream & operator<<( ostream & output, CodeGenerator::Indenter &indent ) {
+		return indent( output );
+	}
+
+	CodeGenerator::CodeGenerator( std::ostream &os ) : indent(*this), cur_indent( 0 ), insideFunction( false ), output( os ) { }
+
+	CodeGenerator::CodeGenerator( std::ostream &os, std::string init, int indentation, bool infunp )
+			: indent(*this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
 		//output << std::string( init );
 	}
 
-	CodeGenerator::CodeGenerator( std::ostream &os, char *init, int indent, bool infunp )
-			: cur_indent( indent ), insideFunction( infunp ), output( os ) {
+	CodeGenerator::CodeGenerator( std::ostream &os, char *init, int indentation, bool infunp )
+			: indent(*this), cur_indent( indentation ), insideFunction( infunp ), output( os ) {
 		//output << std::string( init );
 	}
@@ -63,5 +71,5 @@
 		} // if
 	}
-  
+
 	//*** Declarations
 	void CodeGenerator::visit( FunctionDecl *functionDecl ) {
@@ -108,9 +116,9 @@
 
 		if ( ! memb.empty() ) {
-			output << endl << string( cur_indent, ' ' ) << "{" << endl;
+			output << " {" << endl;
 
 			cur_indent += CodeGenerator::tabsize; 
 			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
-				output << string( cur_indent, ' ' ); 
+				output << indent; 
 				(*i)->accept(*this );
 				output << ";" << endl;
@@ -119,5 +127,5 @@
 			cur_indent -= CodeGenerator::tabsize; 
 
-			output << string( cur_indent, ' ' ) << "}";
+			output << indent << "}";
 		} // if
 	}
@@ -142,5 +150,5 @@
 
 		if ( ! memb.empty() ) {
-			output << endl << "{" << endl;
+			output << " {" << endl;
 
 			cur_indent += CodeGenerator::tabsize; 
@@ -148,5 +156,5 @@
 				ObjectDecl *obj = dynamic_cast< ObjectDecl* >( *i );
 				assert( obj );
-				output << string( cur_indent, ' ' ) << mangleName( obj ); 
+				output << indent << mangleName( obj ); 
 				if ( obj->get_init() ) {
 					output << " = ";
@@ -158,5 +166,5 @@
 			cur_indent -= CodeGenerator::tabsize; 
 
-			output << "}" << endl;
+			output << indent << "}";
 		} // if
 	}
@@ -449,5 +457,5 @@
 
 		for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end();  i++) {
-			output << string( cur_indent, ' ' ) << printLabels( (*i)->get_labels() );
+			output << indent << printLabels( (*i)->get_labels() );
 			(*i)->accept(*this );
 
@@ -459,5 +467,5 @@
 		cur_indent -= CodeGenerator::tabsize; 
 
-		output << string( cur_indent, ' ' ) << "}";
+		output << indent << "}";
 	}
 
@@ -499,9 +507,9 @@
 		cur_indent -= CodeGenerator::tabsize;
 
-		output << string( cur_indent, ' ' ) << "}";
+		output << indent << "}";
 	}
 
 	void CodeGenerator::visit( CaseStmt *caseStmt ) {
-		output << string( cur_indent, ' ' );
+		output << indent;
 		if ( caseStmt->isDefault()) {
 			output << "default";
@@ -516,5 +524,5 @@
 		cur_indent += CodeGenerator::tabsize;
 		for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end();  i++) {
-			output << string( cur_indent, ' ' ) << printLabels( (*i)->get_labels() )  ;
+			output << indent << printLabels( (*i)->get_labels() )  ;
 			(*i)->accept(*this );
 			output << endl;
@@ -569,5 +577,5 @@
 		whileStmt->get_body()->accept( *this );
 
-		output << string( cur_indent, ' ' );
+		output << indent;
 
 		if ( whileStmt->get_isDoWhile() ) {
@@ -601,5 +609,5 @@
 
 	void CodeGenerator::visit( NullStmt *nullStmt ) {
-		//output << string( cur_indent, ' ' ) << CodeGenerator::printLabels( nullStmt->get_labels() );
+		//output << indent << CodeGenerator::printLabels( nullStmt->get_labels() );
 		output << "/* null statement */ ;";
 	}
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision de62360d1d2709386152807b3d18e159e241ab1f)
+++ src/CodeGen/CodeGenerator.h	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jun  8 14:34:43 2015
-// Update Count     : 15
+// Last Modified By : Rob Schluntz
+// Last Modified On : Thu Jun 11 13:24:23 2015
+// Update Count     : 23
 //
 
@@ -80,5 +80,13 @@
 
 		template< class Iterator > void genCommaList( Iterator begin, Iterator end );
+
+		struct Indenter {
+			Indenter(CodeGenerator &cg) : cg(cg) {}
+			CodeGenerator & cg;
+			std::ostream& operator()(std::ostream & os);
+		};
 	  private:
+
+		Indenter indent;
 		int cur_indent;
 		bool insideFunction;
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision de62360d1d2709386152807b3d18e159e241ab1f)
+++ src/Parser/ExpressionNode.cc	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:17:07 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun 23 17:46:23 2015
-// Update Count     : 152
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Jun 24 16:10:47 2015
+// Update Count     : 154
 // 
 
@@ -252,5 +252,5 @@
 										   new ConstantExpr(
 											   Constant( new BasicType( q, BasicType::UnsignedInt ),
-														 toString( value.size() + 1 ) ) ),  // account for '\0'
+														 toString( value.size()+1-2 ) ) ),  // +1 for '\0' and -2 for '"'
 										   false, false );
 			return new ConstantExpr( Constant( at, value ), maybeBuild< Expression >( get_argName() ) );
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision de62360d1d2709386152807b3d18e159e241ab1f)
+++ src/ResolvExpr/Resolver.cc	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 12:17:01 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jun 24 15:47:16 2015
-// Update Count     : 50
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Jun 24 16:08:49 2015
+// Update Count     : 155
 //
 
@@ -38,4 +38,6 @@
 		virtual void visit( TypeDecl *typeDecl );
 
+		virtual void visit( ArrayType * at );
+
 		virtual void visit( ExprStmt *exprStmt );
 		virtual void visit( IfStmt *ifStmt );
@@ -51,4 +53,9 @@
 		virtual void visit( ListInit *listInit );
 	  private:
+  	typedef std::list< Initializer * >::iterator InitIterator;
+
+	  void resolveAggrInit( AggregateDecl *, InitIterator &, InitIterator & );
+	  void resolveSingleAggrInit( Declaration *, InitIterator &, InitIterator & );
+
 		std::list< Type * > functionReturn;
 		Type *initContext;
@@ -158,16 +165,17 @@
 		initContext = new_type;
 		SymTab::Indexer::visit( objectDecl );
-
-		if ( ArrayType * at = dynamic_cast< ArrayType * >( new_type ) ){
-			if ( at->get_dimension() ) {
-				BasicType arrayLenType = BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
-				CastExpr *castExpr = new CastExpr( at->get_dimension(), arrayLenType.clone() );
-				Expression *newExpr = findSingleExpression( castExpr, *this );
-				delete at->get_dimension();
-				at->set_dimension( newExpr );
-			}
-		}
-	}
-  
+	}
+
+	void Resolver::visit( ArrayType * at ) {
+		if ( at->get_dimension() ) {
+			BasicType arrayLenType = BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt );
+			CastExpr *castExpr = new CastExpr( at->get_dimension(), arrayLenType.clone() );
+			Expression *newExpr = findSingleExpression( castExpr, *this );
+			delete at->get_dimension();
+			at->set_dimension( newExpr );
+		}
+		Visitor::visit( at );
+	}
+
 	void Resolver::visit( TypeDecl *typeDecl ) {
 		if ( typeDecl->get_base() ) {
@@ -177,5 +185,5 @@
 		SymTab::Indexer::visit( typeDecl );
 	}
-  
+
 	void Resolver::visit( FunctionDecl *functionDecl ) {
 #if 0
@@ -284,4 +292,13 @@
 			returnStmt->set_expr( newExpr );
 		} // if
+	}
+
+	template< typename T >
+	bool isCharType( T t ) {
+		if ( BasicType * bt = dynamic_cast< BasicType * >( t ) ) {
+			return bt->get_kind() == BasicType::Char || bt->get_kind() == BasicType::SignedChar || 
+				bt->get_kind() == BasicType::UnsignedChar;
+		}
+		return false;
 	}
 
@@ -310,10 +327,79 @@
 			delete castExpr;
 			singleInit->set_value( newExpr );
+
+			// check if initializing type is char[]
+			if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) {
+				if ( isCharType( at->get_base() ) ) {
+					// check if the resolved type is char *
+					if ( PointerType * pt = dynamic_cast< PointerType *>( newExpr->get_results().front() ) ) {
+						if ( isCharType( pt->get_base() ) ) {
+							// strip cast if we're initializing a char[] with a char *, e.g.
+							// char x[] = "hello";
+							CastExpr *ce = dynamic_cast< CastExpr * >( newExpr );
+							singleInit->set_value( ce->get_arg() );
+							ce->set_arg( NULL );
+							delete ce;									
+						}
+					}
+				}
+			}
 		} // if
 //	singleInit->get_value()->accept( *this );
 	}
 
-	void Resolver::visit( ListInit *listInit ) {
-		Visitor::visit(listInit);
+	void Resolver::resolveSingleAggrInit( Declaration * dcl, InitIterator & init, InitIterator & initEnd ) {
+		DeclarationWithType * dt = dynamic_cast< DeclarationWithType * >( dcl );
+		assert( dt );
+		initContext = dt->get_type();
+		try {
+			if ( init == initEnd ) return; // stop when there are no more initializers
+			(*init)->accept( *this );
+			++init; // made it past an initializer
+		} catch( SemanticError & ) {
+			// need to delve deeper, if you can
+			if ( StructInstType * sit = dynamic_cast< StructInstType * >( dt->get_type() ) ) {
+				resolveAggrInit( sit->get_baseStruct(), init, initEnd );
+			} else if ( UnionInstType * uit = dynamic_cast< UnionInstType * >( dt->get_type() ) ) {
+				resolveAggrInit( uit->get_baseUnion(), init, initEnd );
+			} else {
+				// might need to rethink what is being thrown
+				throw;
+			} // if
+		}
+	}
+
+	void Resolver::resolveAggrInit( AggregateDecl * aggr, InitIterator & init, InitIterator & initEnd ) {
+		if ( StructDecl * st = dynamic_cast< StructDecl * >( aggr ) ) {
+			// want to resolve each initializer to the members of the struct,
+			// but if there are more initializers than members we should stop
+			list< Declaration * >::iterator it = st->get_members().begin();
+			for ( ; it != st->get_members().end(); ++it) {
+				resolveSingleAggrInit( *it, init, initEnd );
+			}
+		} else if ( UnionDecl * un = dynamic_cast< UnionDecl * >( aggr ) ) {
+			// only resolve to the first member of a union
+			resolveSingleAggrInit( *un->get_members().begin(), init, initEnd );
+		} // if
+	}
+
+	void Resolver::visit( ListInit * listInit ) {
+		InitIterator iter = listInit->begin_initializers();
+		InitIterator end = listInit->end_initializers();
+
+		if ( ArrayType * at = dynamic_cast< ArrayType * >( initContext ) ) {
+			// resolve each member to the base type of the array
+			for ( ; iter != end; ++iter ) {
+				initContext = at->get_base();
+				(*iter)->accept( *this );
+			} // for
+		} else if ( StructInstType * st = dynamic_cast< StructInstType * >( initContext ) ) {
+			resolveAggrInit( st->get_baseStruct(), iter, end );
+		} else if ( UnionInstType *st = dynamic_cast< UnionInstType * >( initContext ) ) {
+			resolveAggrInit( st->get_baseUnion(), iter, end );
+		} else {
+			// basic types are handled here
+			Visitor::visit( listInit );
+		}
+
 #if 0
 		if ( ArrayType *at = dynamic_cast<ArrayType*>(initContext) ) {
Index: src/SynTree/Constant.cc
===================================================================
--- src/SynTree/Constant.cc	(revision de62360d1d2709386152807b3d18e159e241ab1f)
+++ src/SynTree/Constant.cc	(revision 94e0864d381ec34e8e25850109ea127ff29efbca)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Jun  7 08:45:30 2015
-// Update Count     : 5
+// Last Modified By : Rob Schluntz
+// Last Modified On : Wed Jun 10 14:41:03 2015
+// Update Count     : 8
 //
 
@@ -27,9 +27,10 @@
 
 void Constant::print( std::ostream &os ) const {
-	os << value;
+	os << "(" << value;
 	if ( type ) {
-		os << " ";
+		os << ": ";
 		type->print( os );
 	} // if
+  os << ")";
 }
 
