diff --git a/src/compiler/SymbolTable.cpp b/src/compiler/SymbolTable.cpp
index 5ac6e66..483204c 100644
--- a/src/compiler/SymbolTable.cpp
+++ b/src/compiler/SymbolTable.cpp
@@ -20,53 +20,53 @@
 //
 void TType::buildMangledName(TString& mangledName)
 {
-	if (isMatrix())
-		mangledName += 'm';
-	else if (isVector())
-		mangledName += 'v';
+    if (isMatrix())
+        mangledName += 'm';
+    else if (isVector())
+        mangledName += 'v';
 
-	switch (type) {
-	case EbtFloat:              mangledName += 'f';      break;
-	case EbtInt:                mangledName += 'i';      break;
-	case EbtBool:               mangledName += 'b';      break;
-	case EbtSampler2D:          mangledName += "s2";     break;
-	case EbtSamplerCube:        mangledName += "sC";     break;
-	case EbtStruct:
-		mangledName += "struct-";
-		if (typeName)
-			mangledName += *typeName;
-		{// support MSVC++6.0
-			for (unsigned int i = 0; i < structure->size(); ++i) {
-				mangledName += '-';
-				(*structure)[i].type->buildMangledName(mangledName);
-			}
-		}
-	default:
-		break;
-	}
+    switch (type) {
+    case EbtFloat:              mangledName += 'f';      break;
+    case EbtInt:                mangledName += 'i';      break;
+    case EbtBool:               mangledName += 'b';      break;
+    case EbtSampler2D:          mangledName += "s2";     break;
+    case EbtSamplerCube:        mangledName += "sC";     break;
+    case EbtStruct:
+        mangledName += "struct-";
+        if (typeName)
+            mangledName += *typeName;
+        {// support MSVC++6.0
+            for (unsigned int i = 0; i < structure->size(); ++i) {
+                mangledName += '-';
+                (*structure)[i].type->buildMangledName(mangledName);
+            }
+        }
+    default:
+        break;
+    }
 
-	mangledName += static_cast<char>('0' + getNominalSize());
-	if (isArray()) {
-		char buf[20];
-		sprintf(buf, "%d", arraySize);
-		mangledName += '[';
-		mangledName += buf;
-		mangledName += ']';
-	}
+    mangledName += static_cast<char>('0' + getNominalSize());
+    if (isArray()) {
+        char buf[20];
+        sprintf(buf, "%d", arraySize);
+        mangledName += '[';
+        mangledName += buf;
+        mangledName += ']';
+    }
 }
 
 int TType::getStructSize() const
 {
-	if (!getStruct()) {
-		assert(false && "Not a struct");
-		return 0;
-	}
+    if (!getStruct()) {
+        assert(false && "Not a struct");
+        return 0;
+    }
 
-	if (structureSize == 0)
-		for (TTypeList::iterator tl = getStruct()->begin(); tl != getStruct()->end(); tl++)
-			structureSize += ((*tl).type)->getObjectSize();
+    if (structureSize == 0)
+        for (TTypeList::iterator tl = getStruct()->begin(); tl != getStruct()->end(); tl++)
+            structureSize += ((*tl).type)->getObjectSize();
 
-	return structureSize;
+    return structureSize;
 }
 
 //
@@ -75,31 +75,31 @@
 
 void TVariable::dump(TInfoSink& infoSink) const
 {
-	infoSink.debug << getName().c_str() << ": " << type.getQualifierString() << " " << type.getBasicString();
-	if (type.isArray()) {
-		infoSink.debug << "[0]";
-	}
-	infoSink.debug << "\n";
+    infoSink.debug << getName().c_str() << ": " << type.getQualifierString() << " " << type.getBasicString();
+    if (type.isArray()) {
+        infoSink.debug << "[0]";
+    }
+    infoSink.debug << "\n";
 }
 
 void TFunction::dump(TInfoSink &infoSink) const
 {
-	infoSink.debug << getName().c_str() << ": " <<  returnType.getBasicString() << " " << getMangledName().c_str() << "\n";
+    infoSink.debug << getName().c_str() << ": " <<  returnType.getBasicString() << " " << getMangledName().c_str() << "\n";
 }
 
 void TSymbolTableLevel::dump(TInfoSink &infoSink) const
 {
-	tLevel::const_iterator it;
-	for (it = level.begin(); it != level.end(); ++it)
-		(*it).second->dump(infoSink);
+    tLevel::const_iterator it;
+    for (it = level.begin(); it != level.end(); ++it)
+        (*it).second->dump(infoSink);
 }
 
 void TSymbolTable::dump(TInfoSink &infoSink) const
 {
-	for (int level = currentLevel(); level >= 0; --level) {
-		infoSink.debug << "LEVEL " << level << "\n";
-		table[level]->dump(infoSink);
-	}
+    for (int level = currentLevel(); level >= 0; --level) {
+        infoSink.debug << "LEVEL " << level << "\n";
+        table[level]->dump(infoSink);
+    }
 }
 
 //
@@ -107,8 +107,8 @@
 //
 TFunction::~TFunction()
 {
-	for (TParamList::iterator i = parameters.begin(); i != parameters.end(); ++i)
-		delete (*i).type;
+    for (TParamList::iterator i = parameters.begin(); i != parameters.end(); ++i)
+        delete (*i).type;
 }
 
 //
@@ -116,8 +116,8 @@
 //
 TSymbolTableLevel::~TSymbolTableLevel()
 {
-	for (tLevel::iterator it = level.begin(); it != level.end(); ++it)
-		delete (*it).second;
+    for (tLevel::iterator it = level.begin(); it != level.end(); ++it)
+        delete (*it).second;
 }
 
 //
@@ -128,84 +128,84 @@
 //
 void TSymbolTableLevel::relateToOperator(const char* name, TOperator op)
 {
-	tLevel::iterator it;
-	for (it = level.begin(); it != level.end(); ++it) {
-		if ((*it).second->isFunction()) {
-			TFunction* function = static_cast<TFunction*>((*it).second);
-			if (function->getName() == name)
-				function->relateToOperator(op);
-		}
-	}
+    tLevel::iterator it;
+    for (it = level.begin(); it != level.end(); ++it) {
+        if ((*it).second->isFunction()) {
+            TFunction* function = static_cast<TFunction*>((*it).second);
+            if (function->getName() == name)
+                function->relateToOperator(op);
+        }
+    }
 }
 
 
 TSymbol::TSymbol(const TSymbol& copyOf)
 {
-	name = NewPoolTString(copyOf.name->c_str());
-	uniqueId = copyOf.uniqueId;
+    name = NewPoolTString(copyOf.name->c_str());
+    uniqueId = copyOf.uniqueId;
 }
 
 TVariable::TVariable(const TVariable& copyOf, TStructureMap& remapper) : TSymbol(copyOf)
 {
-	type.copyType(copyOf.type, remapper);
-	userType = copyOf.userType;
-	// for builtIn symbol table level, unionArray and arrayInformation pointers should be NULL
-	assert(copyOf.arrayInformationType == 0);
-	arrayInformationType = 0;
+    type.copyType(copyOf.type, remapper);
+    userType = copyOf.userType;
+    // for builtIn symbol table level, unionArray and arrayInformation pointers should be NULL
+    assert(copyOf.arrayInformationType == 0);
+    arrayInformationType = 0;
 
-	if (copyOf.unionArray) {
-		assert(!copyOf.type.getStruct());
-		assert(copyOf.type.getObjectSize() == 1);
-		unionArray = new ConstantUnion[1];
-		unionArray[0] = copyOf.unionArray[0];
-	} else
-		unionArray = 0;
+    if (copyOf.unionArray) {
+        assert(!copyOf.type.getStruct());
+        assert(copyOf.type.getObjectSize() == 1);
+        unionArray = new ConstantUnion[1];
+        unionArray[0] = copyOf.unionArray[0];
+    } else
+        unionArray = 0;
 }
 
 TVariable* TVariable::clone(TStructureMap& remapper)
 {
-	TVariable *variable = new TVariable(*this, remapper);
+    TVariable *variable = new TVariable(*this, remapper);
 
-	return variable;
+    return variable;
 }
 
 TFunction::TFunction(const TFunction& copyOf, TStructureMap& remapper) : TSymbol(copyOf)
 {
-	for (unsigned int i = 0; i < copyOf.parameters.size(); ++i) {
-		TParameter param;
-		parameters.push_back(param);
-		parameters.back().copyParam(copyOf.parameters[i], remapper);
-	}
+    for (unsigned int i = 0; i < copyOf.parameters.size(); ++i) {
+        TParameter param;
+        parameters.push_back(param);
+        parameters.back().copyParam(copyOf.parameters[i], remapper);
+    }
 
-	returnType.copyType(copyOf.returnType, remapper);
-	mangledName = copyOf.mangledName;
-	op = copyOf.op;
-	defined = copyOf.defined;
+    returnType.copyType(copyOf.returnType, remapper);
+    mangledName = copyOf.mangledName;
+    op = copyOf.op;
+    defined = copyOf.defined;
 }
 
 TFunction* TFunction::clone(TStructureMap& remapper)
 {
-	TFunction *function = new TFunction(*this, remapper);
+    TFunction *function = new TFunction(*this, remapper);
 
-	return function;
+    return function;
 }
 
 TSymbolTableLevel* TSymbolTableLevel::clone(TStructureMap& remapper)
 {
-	TSymbolTableLevel *symTableLevel = new TSymbolTableLevel();
-	tLevel::iterator iter;
-	for (iter = level.begin(); iter != level.end(); ++iter) {
-		symTableLevel->insert(*iter->second->clone(remapper));
-	}
+    TSymbolTableLevel *symTableLevel = new TSymbolTableLevel();
+    tLevel::iterator iter;
+    for (iter = level.begin(); iter != level.end(); ++iter) {
+        symTableLevel->insert(*iter->second->clone(remapper));
+    }
 
-	return symTableLevel;
+    return symTableLevel;
 }
 
 void TSymbolTable::copyTable(const TSymbolTable& copyOf)
 {
-	TStructureMap remapper;
-	uniqueId = copyOf.uniqueId;
-	for (unsigned int i = 0; i < copyOf.table.size(); ++i) {
-		table.push_back(copyOf.table[i]->clone(remapper));
-	}
+    TStructureMap remapper;
+    uniqueId = copyOf.uniqueId;
+    for (unsigned int i = 0; i < copyOf.table.size(); ++i) {
+        table.push_back(copyOf.table[i]->clone(remapper));
+    }
 }
