[tomboy] Support integers separately from other number types.
- From: Sanford Armstrong <sharm src gnome org>
- To: svn-commits-list gnome org
- Subject: [tomboy] Support integers separately from other number types.
- Date: Mon, 18 May 2009 10:23:02 -0400 (EDT)
commit c4cdb271bd8b12ba14ad8b7247012d06e8a5d0a4
Author: Sandy Armstrong <sanfordarmstrong gmail com>
Date: Sun May 17 07:28:09 2009 -0700
Support integers separately from other number types.
Previously, all numbers were stored as doubles, forcing the library user to make the type determination.
---
.../Hyena.Json/Tests/TokenizerTests.cs | 31 ++++++++--------
Tomboy/Addins/WebSyncService/Hyena.Json/Token.cs | 5 +++
.../Addins/WebSyncService/Hyena.Json/TokenType.cs | 7 ++--
.../Addins/WebSyncService/Hyena.Json/Tokenizer.cs | 38 +++++++++++++-------
4 files changed, 50 insertions(+), 31 deletions(-)
diff --git a/Tomboy/Addins/WebSyncService/Hyena.Json/Tests/TokenizerTests.cs b/Tomboy/Addins/WebSyncService/Hyena.Json/Tests/TokenizerTests.cs
index 1ebf328..a7e3b06 100644
--- a/Tomboy/Addins/WebSyncService/Hyena.Json/Tests/TokenizerTests.cs
+++ b/Tomboy/Addins/WebSyncService/Hyena.Json/Tests/TokenizerTests.cs
@@ -68,17 +68,17 @@ namespace Hyena.Json.Tests
public void NumberInt ()
{
// Number tests
- AssertTokenStream ("0", Token.Number (0));
- AssertTokenStream ("-0", Token.Number (-0));
+ AssertTokenStream ("0", Token.Integer (0));
+ AssertTokenStream ("-0", Token.Integer (-0));
- AssertTokenStream ("9", Token.Number (9));
- AssertTokenStream ("-9", Token.Number (-9));
+ AssertTokenStream ("9", Token.Integer (9));
+ AssertTokenStream ("-9", Token.Integer (-9));
- AssertTokenStream ("14", Token.Number (14));
- AssertTokenStream ("-14", Token.Number (-14));
+ AssertTokenStream ("14", Token.Integer (14));
+ AssertTokenStream ("-14", Token.Integer (-14));
- AssertTokenStream ("15309", Token.Number (15309));
- AssertTokenStream ("-15309", Token.Number (-15309));
+ AssertTokenStream ("15309", Token.Integer (15309));
+ AssertTokenStream ("-15309", Token.Integer (-15309));
}
[Test]
@@ -148,14 +148,14 @@ namespace Hyena.Json.Tests
[Test]
public void Array ()
{
- AssertTokenStream ("[1]", Token.ArrayStart, Token.Number (1), Token.ArrayFinish);
- AssertTokenStream ("[1,0]", Token.ArrayStart, Token.Number (1), Token.Comma, Token.Number (0), Token.ArrayFinish);
+ AssertTokenStream ("[1]", Token.ArrayStart, Token.Integer (1), Token.ArrayFinish);
+ AssertTokenStream ("[1,0]", Token.ArrayStart, Token.Integer (1), Token.Comma, Token.Integer (0), Token.ArrayFinish);
AssertTokenStream ("[\"a\",true,null]", Token.ArrayStart, Token.String ("a"), Token.Comma,
Token.Bool (true), Token.Comma, Token.Null, Token.ArrayFinish);
- AssertTokenStream ("[0,1,[[2,[4]],5],6]", Token.ArrayStart, Token.Number (0), Token.Comma, Token.Number (1),
- Token.Comma, Token.ArrayStart, Token.ArrayStart, Token.Number (2), Token.Comma, Token.ArrayStart,
- Token.Number (4), Token.ArrayFinish, Token.ArrayFinish, Token.Comma, Token.Number (5), Token.ArrayFinish,
- Token.Comma, Token.Number (6), Token.ArrayFinish);
+ AssertTokenStream ("[0,1,[[2,[4]],5],6]", Token.ArrayStart, Token.Integer (0), Token.Comma, Token.Integer (1),
+ Token.Comma, Token.ArrayStart, Token.ArrayStart, Token.Integer (2), Token.Comma, Token.ArrayStart,
+ Token.Integer (4), Token.ArrayFinish, Token.ArrayFinish, Token.Comma, Token.Integer (5), Token.ArrayFinish,
+ Token.Comma, Token.Integer (6), Token.ArrayFinish);
}
[Test]
@@ -194,7 +194,8 @@ namespace Hyena.Json.Tests
continue;
}
- if ((compare.Type == TokenType.Number && (double)compare.Value != (double)token.Value) ||
+ if ((compare.Type == TokenType.Integer && (int)compare.Value != (int)token.Value) ||
+ (compare.Type == TokenType.Number && (double)compare.Value != (double)token.Value) ||
(compare.Type == TokenType.String && (string)compare.Value != (string)token.Value) ||
(compare.Type == TokenType.Boolean && (bool)compare.Value != (bool)token.Value)) {
throw new ApplicationException ("Token values do not match");
diff --git a/Tomboy/Addins/WebSyncService/Hyena.Json/Token.cs b/Tomboy/Addins/WebSyncService/Hyena.Json/Token.cs
index cce60c7..c1ef414 100644
--- a/Tomboy/Addins/WebSyncService/Hyena.Json/Token.cs
+++ b/Tomboy/Addins/WebSyncService/Hyena.Json/Token.cs
@@ -98,6 +98,11 @@ namespace Hyena.Json
return new Token (TokenType.Number, value);
}
+ internal static Token Integer (int value)
+ {
+ return new Token (TokenType.Integer, value);
+ }
+
internal static Token String (string value)
{
return new Token (TokenType.String, value);
diff --git a/Tomboy/Addins/WebSyncService/Hyena.Json/TokenType.cs b/Tomboy/Addins/WebSyncService/Hyena.Json/TokenType.cs
index b24a5ca..cd6ae93 100644
--- a/Tomboy/Addins/WebSyncService/Hyena.Json/TokenType.cs
+++ b/Tomboy/Addins/WebSyncService/Hyena.Json/TokenType.cs
@@ -42,10 +42,11 @@ namespace Hyena.Json
String = 1 << 5,
Null = 1 << 6,
Number = 1 << 7,
- Comma = 1 << 8,
- Colon = 1 << 9,
+ Integer = 1 << 8,
+ Comma = 1 << 9,
+ Colon = 1 << 10,
- Literal = String | Number | Boolean | Null,
+ Literal = String | Number | Boolean | Null | Integer,
Value = ObjectStart | ArrayStart | Literal
}
}
diff --git a/Tomboy/Addins/WebSyncService/Hyena.Json/Tokenizer.cs b/Tomboy/Addins/WebSyncService/Hyena.Json/Tokenizer.cs
index f866c0b..618ed3a 100644
--- a/Tomboy/Addins/WebSyncService/Hyena.Json/Tokenizer.cs
+++ b/Tomboy/Addins/WebSyncService/Hyena.Json/Tokenizer.cs
@@ -163,14 +163,14 @@ namespace Hyena.Json
return buffer.ToString ();
}
- private double LexInt ()
+ private int LexInt ()
{
return LexInt (false, 0);
}
- private double LexInt (bool hex, int maxDigits)
+ private int LexInt (bool hex, int maxDigits)
{
- double value = 0.0;
+ int value = 0;
int count = 0;
do {
@@ -212,34 +212,38 @@ namespace Hyena.Json
return fraction;
}
- private double LexNumber ()
+ private object LexNumber (out bool isDouble)
{
- double value = 0.0;
+ isDouble = false;
+ int intVal = 0;
+ double doubleVal = 0.0;
bool negate = peek == '-';
if (negate) {
ReadChar ();
}
if (peek != '0') {
- value = LexInt ();
+ doubleVal = intVal = LexInt ();
} else {
ReadChar ();
}
if (peek == '.') {
- value += LexFraction ();
+ isDouble = true;
+ doubleVal += LexFraction ();
}
if (peek == 'e' || peek == 'E') {
+ isDouble = true;
ReadChar ();
if (peek == '-') {
ReadChar ();
- value /= Math.Pow (10, LexInt ());
+ doubleVal /= Math.Pow (10, LexInt ());
} else if (peek == '+') {
ReadChar ();
- value *= Math.Pow (10, LexInt ());
+ doubleVal *= Math.Pow (10, LexInt ());
} else if (Char.IsDigit (peek)) {
- value *= Math.Pow (10, LexInt ());
+ doubleVal *= Math.Pow (10, LexInt ());
} else {
InvalidSyntax ("Malformed exponent");
}
@@ -249,8 +253,11 @@ namespace Hyena.Json
InvalidSyntax ("Numbers starting with 0 must be followed by a . or not " +
"followed by a digit (octal syntax not legal)");
}
-
- return negate ? -1.0 * value : value;
+
+ if (!isDouble)
+ return negate ? -1 * intVal : intVal;
+ else
+ return negate ? -1.0 * doubleVal : doubleVal;
}
public Token Scan ()
@@ -291,7 +298,12 @@ namespace Hyena.Json
case '"': return new Token (TokenType.String, LexString ());
default:
if (peek == '-' || Char.IsDigit (peek)) {
- return new Token (TokenType.Number, LexNumber ());
+ bool isDouble;
+ object num = LexNumber (out isDouble);
+ if (!isDouble)
+ return new Token (TokenType.Integer, num);
+ else
+ return new Token (TokenType.Number, num);
} else if (Char.IsLetter (peek)) {
string identifier = LexId ();
switch (identifier) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]