Fixed 64-bit integer truncation issues in shader translator.

This is an incompatible API change, but one which is necessary in
order to improve correctness of the code. The API version in
ShaderLang.h is updated and, unfortunately, the define renamed to
something less ambiguous due to conflicts on some Android buildbots.
Temporary patches in Chromium and WebKit will be landed separately to
support this upgrade.

BUG=403,404,405,406,407,408,409
Review URL: https://codereview.appspot.com/7300058


Conflicts:
	include/GLSLANG/ShaderLang.h

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@1960 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/preprocessor/Input.cpp b/src/compiler/preprocessor/Input.cpp
index 11868c1..b4d970a 100644
--- a/src/compiler/preprocessor/Input.cpp
+++ b/src/compiler/preprocessor/Input.cpp
@@ -17,25 +17,24 @@
 {
 }
 
-Input::Input(int count, const char* const string[], const int length[]) :
+Input::Input(size_t count, const char* const string[], const int length[]) :
     mCount(count),
     mString(string)
 {
-    assert(mCount >= 0);
     mLength.reserve(mCount);
-    for (int i = 0; i < mCount; ++i)
+    for (size_t i = 0; i < mCount; ++i)
     {
         int len = length ? length[i] : -1;
         mLength.push_back(len < 0 ? std::strlen(mString[i]) : len);
     }
 }
 
-int Input::read(char* buf, int maxSize)
+size_t Input::read(char* buf, size_t maxSize)
 {
-    int nRead = 0;
+    size_t nRead = 0;
     while ((nRead < maxSize) && (mReadLoc.sIndex < mCount))
     {
-        int size = mLength[mReadLoc.sIndex] - mReadLoc.cIndex;
+        size_t size = mLength[mReadLoc.sIndex] - mReadLoc.cIndex;
         size = std::min(size, maxSize);
         std::memcpy(buf + nRead, mString[mReadLoc.sIndex] + mReadLoc.cIndex, size);
         nRead += size;
diff --git a/src/compiler/preprocessor/Input.h b/src/compiler/preprocessor/Input.h
index dac734b..14b7597 100644
--- a/src/compiler/preprocessor/Input.h
+++ b/src/compiler/preprocessor/Input.h
@@ -7,6 +7,7 @@
 #ifndef COMPILER_PREPROCESSOR_INPUT_H_
 #define COMPILER_PREPROCESSOR_INPUT_H_
 
+#include <stddef.h>
 #include <vector>
 
 namespace pp
@@ -17,18 +18,18 @@
 {
   public:
     Input();
-    Input(int count, const char* const string[], const int length[]);
+    Input(size_t count, const char* const string[], const int length[]);
 
-    int count() const { return mCount; }
-    const char* string(int index) const { return mString[index]; }
-    int length(int index) const { return mLength[index]; }
+    size_t count() const { return mCount; }
+    const char* string(size_t index) const { return mString[index]; }
+    size_t length(size_t index) const { return mLength[index]; }
 
-    int read(char* buf, int maxSize);
+    size_t read(char* buf, size_t maxSize);
 
     struct Location
     {
-        int sIndex;  // String index;
-        int cIndex;  // Char index.
+        size_t sIndex;  // String index;
+        size_t cIndex;  // Char index.
 
         Location() : sIndex(0), cIndex(0) { }
     };
@@ -36,9 +37,9 @@
 
   private:
     // Input.
-    int mCount;
+    size_t mCount;
     const char* const* mString;
-    std::vector<int> mLength;
+    std::vector<size_t> mLength;
 
     Location mReadLoc;
 };
diff --git a/src/compiler/preprocessor/Preprocessor.cpp b/src/compiler/preprocessor/Preprocessor.cpp
index de024fe..5ffc642 100644
--- a/src/compiler/preprocessor/Preprocessor.cpp
+++ b/src/compiler/preprocessor/Preprocessor.cpp
@@ -48,7 +48,7 @@
     delete mImpl;
 }
 
-bool Preprocessor::init(int count,
+bool Preprocessor::init(size_t count,
                         const char* const string[],
                         const int length[])
 {
diff --git a/src/compiler/preprocessor/Preprocessor.h b/src/compiler/preprocessor/Preprocessor.h
index 5fe35b2..7b70180 100644
--- a/src/compiler/preprocessor/Preprocessor.h
+++ b/src/compiler/preprocessor/Preprocessor.h
@@ -7,6 +7,8 @@
 #ifndef COMPILER_PREPROCESSOR_PREPROCESSOR_H_
 #define COMPILER_PREPROCESSOR_PREPROCESSOR_H_
 
+#include <stddef.h>
+
 #include "pp_utils.h"
 
 namespace pp
@@ -32,7 +34,7 @@
     // Each element in the length array may contain the length of the
     // corresponding string or a value less than 0 to indicate that the string
     // is null terminated.
-    bool init(int count, const char* const string[], const int length[]);
+    bool init(size_t count, const char* const string[], const int length[]);
     // Adds a pre-defined macro.
     void predefineMacro(const char* name, int value);
 
diff --git a/src/compiler/preprocessor/Tokenizer.cpp b/src/compiler/preprocessor/Tokenizer.cpp
index 4a57647..66e0f3c 100644
--- a/src/compiler/preprocessor/Tokenizer.cpp
+++ b/src/compiler/preprocessor/Tokenizer.cpp
@@ -1119,13 +1119,14 @@
     // Set the location for EOF token manually.
     pp::Input* input = &yyextra->input;
     pp::Input::Location* scanLoc = &yyextra->scanLoc;
-    int sIndexMax = std::max(0, input->count() - 1);
+    yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0;
     if (scanLoc->sIndex != sIndexMax)
     {
         // We can only reach here if there are empty strings at the
         // end of the input.
         scanLoc->sIndex = sIndexMax; scanLoc->cIndex = 0;
-        yyfileno = sIndexMax; yylineno = 1;
+        // FIXME: this is not 64-bit clean.
+        yyfileno = static_cast<int>(sIndexMax); yylineno = 1;
     }
     yylloc->file = yyfileno;
     yylloc->line = yylineno;
@@ -2294,9 +2295,8 @@
     destroyScanner();
 }
 
-bool Tokenizer::init(int count, const char* const string[], const int length[])
+bool Tokenizer::init(size_t count, const char* const string[], const int length[])
 {
-    if (count < 0) return false;
     if ((count > 0) && (string == 0)) return false;
 
     mContext.input = Input(count, string, length);
diff --git a/src/compiler/preprocessor/Tokenizer.h b/src/compiler/preprocessor/Tokenizer.h
index c603135..7a6fa87 100644
--- a/src/compiler/preprocessor/Tokenizer.h
+++ b/src/compiler/preprocessor/Tokenizer.h
@@ -37,7 +37,7 @@
     Tokenizer(Diagnostics* diagnostics);
     ~Tokenizer();
 
-    bool init(int count, const char* const string[], const int length[]);
+    bool init(size_t count, const char* const string[], const int length[]);
 
     void setFileNumber(int file);
     void setLineNumber(int line);
diff --git a/src/compiler/preprocessor/Tokenizer.l b/src/compiler/preprocessor/Tokenizer.l
index 689ae64..3fc8bb6 100644
--- a/src/compiler/preprocessor/Tokenizer.l
+++ b/src/compiler/preprocessor/Tokenizer.l
@@ -239,13 +239,14 @@
     // Set the location for EOF token manually.
     pp::Input* input = &yyextra->input;
     pp::Input::Location* scanLoc = &yyextra->scanLoc;
-    int sIndexMax = std::max(0, input->count() - 1);
+    yy_size_t sIndexMax = input->count() ? input->count() - 1 : 0;
     if (scanLoc->sIndex != sIndexMax)
     {
         // We can only reach here if there are empty strings at the
         // end of the input.
         scanLoc->sIndex = sIndexMax; scanLoc->cIndex = 0;
-        yyfileno = sIndexMax; yylineno = 1;
+        // FIXME: this is not 64-bit clean.
+        yyfileno = static_cast<int>(sIndexMax); yylineno = 1;
     }
     yylloc->file = yyfileno;
     yylloc->line = yylineno;