Add SwiftShader source to repo
Oct 6 code drop from Transgaming
Review URL: https://chromereviews.googleplex.com/3846015
diff --git a/src/Common/Configurator.cpp b/src/Common/Configurator.cpp
new file mode 100644
index 0000000..d547f57
--- /dev/null
+++ b/src/Common/Configurator.cpp
@@ -0,0 +1,236 @@
+// SwiftShader Software Renderer
+//
+// Copyright(c) 2005-2011 TransGaming Inc.
+//
+// All rights reserved. No part of this software may be copied, distributed, transmitted,
+// transcribed, stored in a retrieval system, translated into any human or computer
+// language by any means, or disclosed to third parties without the explicit written
+// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
+// or implied, including but not limited to any patent rights, are granted to you.
+//
+
+#include "Configurator.hpp"
+
+#include <iostream>
+#include <fstream>
+#include <strstream>
+
+using namespace std;
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <ctype.h>
+
+namespace sw
+{
+ Configurator::Configurator(string iniPath)
+ {
+ path = iniPath;
+
+ readFile();
+ }
+
+ Configurator::~Configurator()
+ {
+ }
+
+ bool Configurator::readFile()
+ {
+ fstream file(path.c_str(), ios::in);
+ if(file.fail()) return false;
+
+ string line;
+ string keyName;
+
+ while(getline(file, line))
+ {
+ if(line.length())
+ {
+ if(line[line.length() - 1] == '\r')
+ {
+ line = line.substr(0, line.length() - 1);
+ }
+
+ if(!isprint(line[0]))
+ {
+ printf("Failing on char %d\n", line[0]);
+ file.close();
+ return false;
+ }
+
+ string::size_type pLeft = line.find_first_of(";#[=");
+
+ if(pLeft != string::npos)
+ {
+ switch(line[pLeft])
+ {
+ case '[':
+ {
+ string::size_type pRight = line.find_last_of("]");
+
+ if(pRight != string::npos && pRight > pLeft)
+ {
+ keyName = line.substr(pLeft + 1, pRight - pLeft - 1);
+ addKeyName(keyName);
+ }
+ }
+ break;
+ case '=':
+ {
+ string valueName = line.substr(0, pLeft);
+ string value = line.substr(pLeft + 1);
+ addValue(keyName, valueName, value);
+ }
+ break;
+ case ';':
+ case '#':
+ // Ignore comments
+ break;
+ }
+ }
+ }
+ }
+
+ file.close();
+
+ if(names.size())
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ void Configurator::writeFile(std::string title)
+ {
+ fstream file(path.c_str(), ios::out);
+ if(file.fail()) return;
+
+ file << "; " << title << endl << endl;
+
+ for(unsigned int keyID = 0; keyID < sections.size(); keyID++)
+ {
+ file << "[" << names[keyID] << "]" << endl;
+
+ for(unsigned int valueID = 0; valueID < sections[keyID].names.size(); valueID++)
+ {
+ file << sections[keyID].names[valueID] << "=" << sections[keyID].values[valueID] << endl;
+ }
+
+ file << endl;
+ }
+
+ file.close();
+ }
+
+ int Configurator::findKey(string keyName) const
+ {
+ for(unsigned int keyID = 0; keyID < names.size(); keyID++)
+ {
+ if(names[keyID] == keyName)
+ {
+ return keyID;
+ }
+ }
+
+ return -1;
+ }
+
+ int Configurator::findValue(unsigned int keyID, string valueName) const
+ {
+ if(!sections.size() || keyID >= sections.size())
+ {
+ return -1;
+ }
+
+ for(unsigned int valueID = 0; valueID < sections[keyID].names.size(); ++valueID)
+ {
+ if(sections[keyID].names[valueID] == valueName)
+ {
+ return valueID;
+ }
+ }
+
+ return -1;
+ }
+
+ unsigned int Configurator::addKeyName(string keyName)
+ {
+ names.resize(names.size() + 1, keyName);
+ sections.resize(sections.size() + 1);
+ return (unsigned int)names.size() - 1;
+ }
+
+ void Configurator::addValue(string const keyName, string const valueName, string const value)
+ {
+ int keyID = findKey(keyName);
+ bool create = true;
+
+ if(keyID == -1)
+ {
+ keyID = addKeyName(keyName);
+ }
+
+ int valueID = findValue(keyID, valueName);
+
+ if(valueID == -1)
+ {
+ sections[keyID].names.resize(sections[keyID].names.size() + 1, valueName);
+ sections[keyID].values.resize(sections[keyID].values.size() + 1, value);
+ }
+ else
+ {
+ sections[keyID].values[valueID] = value;
+ }
+ }
+
+ string Configurator::getValue(string keyName, string valueName, string defaultValue) const
+ {
+ int keyID = findKey(keyName);
+ if(keyID == -1) return defaultValue;
+ int valueID = findValue(unsigned int(keyID), valueName);
+ if(valueID == -1) return defaultValue;
+
+ return sections[keyID].values[valueID];
+ }
+
+ int Configurator::getInteger(string keyName, string valueName, int defaultValue) const
+ {
+ char svalue[256];
+
+ sprintf(svalue, "%d", defaultValue);
+
+ return atoi(getValue(keyName, valueName, svalue).c_str());
+ }
+
+ bool Configurator::getBoolean(string keyName, string valueName, bool defaultValue) const
+ {
+ return getInteger(keyName, valueName, (int)defaultValue) != 0;
+ }
+
+ double Configurator::getFloat(string keyName, string valueName, double defaultValue) const
+ {
+ char svalue[256];
+
+ sprintf(svalue, "%f", defaultValue);
+
+ return atof(getValue(keyName, valueName, svalue).c_str());
+ }
+
+ unsigned int Configurator::getFormatted(string keyName, string valueName, char *format,
+ void *v1, void *v2, void *v3, void *v4,
+ void *v5, void *v6, void *v7, void *v8,
+ void *v9, void *v10, void *v11, void *v12,
+ void *v13, void *v14, void *v15, void *v16)
+ {
+ string value = getValue(keyName, valueName);
+
+ if(!value.length()) return false;
+
+ unsigned int nVals = sscanf(value.c_str(), format,
+ v1, v2, v3, v4, v5, v6, v7, v8,
+ v9, v10, v11, v12, v13, v14, v15, v16);
+
+ return nVals;
+ }
+}