summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2017-03-10 14:57:27 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2018-08-10 14:46:25 +0200
commit6bd9064115cee5e40e498334ca99c761365b749c (patch)
treea3d6845cfb487f1c1ff157066518ccfd3b6a0c4b
parenta17ee486729aa20e515635b3f62fb11bd87ddea6 (diff)
downloadvala-6bd9064115cee5e40e498334ca99c761365b749c.tar.gz
glib-2.0: Add (u)long.parse/try_parse()
https://gitlab.gnome.org/GNOME/vala/issues/649
-rw-r--r--tests/basic-types/integers.vala13
-rw-r--r--vapi/glib-2.0.vapi43
2 files changed, 53 insertions, 3 deletions
diff --git a/tests/basic-types/integers.vala b/tests/basic-types/integers.vala
index 4e91071b0..4b097ae2e 100644
--- a/tests/basic-types/integers.vala
+++ b/tests/basic-types/integers.vala
@@ -71,12 +71,25 @@ void test_int () {
assert (s == "42");
unowned string unparsed;
+ long l;
+ long.try_parse ("%lim".printf (long.MIN), out l, out unparsed);
+ assert (l == long.MIN);
+ assert (unparsed == "m");
+ assert (!long.try_parse ("%lum".printf (ulong.MAX), out l));
+
+ ulong ul;
+ ulong.try_parse ("%lum".printf (ulong.MAX), out ul, out unparsed);
+ assert (ul == ulong.MAX);
+ assert (unparsed == "m");
+ assert (!ulong.try_parse ("%lim".printf (long.MIN), out ul));
+
int64 i64;
int64.try_parse ("-4711inch", out i64, out unparsed);
assert (i64 == -4711);
assert (unparsed == "inch");
int64.try_parse ("-31415km", out i64);
assert (i64 == -31415);
+
uint64 ui64;
uint64.try_parse ("4711yards", out ui64, out unparsed);
assert (ui64 == 4711);
diff --git a/vapi/glib-2.0.vapi b/vapi/glib-2.0.vapi
index 147a7148d..d3e38c544 100644
--- a/vapi/glib-2.0.vapi
+++ b/vapi/glib-2.0.vapi
@@ -263,8 +263,24 @@ public struct long {
[CCode (cname = "GLONG_FROM_LE")]
public static long from_little_endian (long val);
- [CCode (cname = "atol", cheader_filename = "stdlib.h")]
- public static long parse (string str);
+ [CCode (cname = "strtol", cheader_filename = "stdlib.h")]
+ static long strtol (string nptr, out char* endptr, uint _base);
+
+ public static long parse (string str) {
+ return strtol (str, null, 0);
+ }
+
+ public static bool try_parse (string str, out long result = null, out unowned string unparsed = null) {
+ char* endptr;
+ result = strtol (str, out endptr, 0);
+ if (endptr == (char*) str + str.length) {
+ unparsed = "";
+ return true;
+ } else {
+ unparsed = (string) endptr;
+ return false;
+ }
+ }
}
[SimpleType]
@@ -296,6 +312,25 @@ public struct ulong {
public static ulong from_big_endian (ulong val);
[CCode (cname = "GULONG_FROM_LE")]
public static ulong from_little_endian (ulong val);
+
+ [CCode (cname = "strtoul", cheader_filename = "stdlib.h")]
+ static ulong strtoul (string nptr, out char* endptr, uint _base);
+
+ public static ulong parse (string str) {
+ return strtoul (str, null, 0);
+ }
+
+ public static bool try_parse (string str, out ulong result = null, out unowned string unparsed = null) {
+ char* endptr;
+ result = strtoul (str, out endptr, 0);
+ if (endptr == (char*) str + str.length) {
+ unparsed = "";
+ return true;
+ } else {
+ unparsed = (string) endptr;
+ return false;
+ }
+ }
}
[SimpleType]
@@ -747,6 +782,7 @@ public struct uint64 {
public static uint64 parse (string str) {
return ascii_strtoull (str, null, 0);
}
+
public static bool try_parse (string str, out uint64 result = null, out unowned string unparsed = null) {
char* endptr;
result = ascii_strtoull (str, out endptr, 0);
@@ -889,6 +925,7 @@ public struct double {
public static double parse (string str) {
return ascii_strtod (str, null);
}
+
public static bool try_parse (string str, out double result = null, out unowned string unparsed = null) {
char* endptr;
result = ascii_strtod (str, out endptr);
@@ -1280,7 +1317,7 @@ public class string {
[Version (replacement = "double.parse")]
[CCode (cname = "g_ascii_strtod")]
public double to_double (out unowned string endptr = null);
- [Version (replacement = "uint64.parse")]
+ [Version (replacement = "ulong.parse")]
[CCode (cname = "strtoul")]
public ulong to_ulong (out unowned string endptr = null, int _base = 0);
[Version (replacement = "int64.parse")]