commit 4485bc672fd62f1f2244a72d9cc7cf39edbaf32f
parent 50339805dcb371328720c30c680dfe2c06070175
Author: Natasha Kerensikova <natacha@instinctive.eu>
Date:   Tue, 10 May 2016 21:10:54 +0000
Add dictionary tools from my other projects
Diffstat:
2 files changed, 132 insertions(+), 0 deletions(-)
diff --git a/src/dict_tools.c b/src/dict_tools.c
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2016, Natacha Porté
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <inttypes.h>
+
+#include "dict_tools.h"
+
+static bool
+check_length(Tuple *tuple, const char *context) {
+	if (tuple->length == 1 || tuple->length == 2 || tuple->length == 4) {
+		return true;
+	}
+
+	APP_LOG(APP_LOG_LEVEL_ERROR,
+	    "Unexpected length %" PRIu16 " in %s dictionary entry",
+	    tuple->length, context);
+	return false;
+}
+
+static int32_t
+raw_read_int(Tuple *tuple) {
+	switch (tuple->length) {
+	    case 1:
+		return tuple->value->int8;
+	    case 2:
+		return tuple->value->int16;
+	    case 4:
+		return tuple->value->int32;
+	    default:
+		return 0;
+	}
+}
+
+static uint32_t
+raw_read_uint(Tuple *tuple) {
+	switch (tuple->length) {
+	    case 1:
+		return tuple->value->uint8;
+	    case 2:
+		return tuple->value->uint16;
+	    case 4:
+		return tuple->value->uint32;
+	    default:
+		return 0;
+	}
+}
+
+int32_t
+tuple_int(Tuple *tuple) {
+	if (!tuple) return 0;
+	switch (tuple->type) {
+	    case TUPLE_INT:
+		if (!check_length(tuple, "integer")) return 0;
+		return raw_read_int(tuple);
+	    case TUPLE_UINT:
+		if (!check_length(tuple, "integer")) return 0;
+		uint32_t u = raw_read_uint(tuple);
+		if (u > 2147483647) {
+			APP_LOG(APP_LOG_LEVEL_ERROR,
+			    "Integer overflow in signed dictionary entry %"
+			    PRIu32, u);
+			return 0;
+		}
+		return u;
+	    default:
+		APP_LOG(APP_LOG_LEVEL_ERROR,
+		    "Unexpected type %d for integer dictionary entry",
+		    (int)tuple->type);
+		return 0;
+	}
+}
+
+uint32_t
+tuple_uint(Tuple *tuple) {
+	if (!tuple) return 0;
+	switch (tuple->type) {
+	    case TUPLE_UINT:
+		if (!check_length(tuple, "unsigned")) return 0;
+		return raw_read_uint(tuple);
+	    case TUPLE_INT:
+		if (!check_length(tuple, "unsigned")) return 0;
+		int32_t i = raw_read_int(tuple);
+		if (i < 0) {
+			APP_LOG(APP_LOG_LEVEL_ERROR,
+			    "Integer underflow in unsigned dictionary entry %"
+			    PRIi32, i);
+			return 0;
+		}
+		return i;
+	    default:
+		APP_LOG(APP_LOG_LEVEL_ERROR,
+		    "Unexpected type %d for unsigned dictionary entry",
+		    (int)tuple->type);
+		return 0;
+	}
+}
diff --git a/src/dict_tools.h b/src/dict_tools.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2016, Natacha Porté
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <pebble.h>
+
+int32_t
+tuple_int(Tuple *tuple);
+
+uint32_t
+tuple_uint(Tuple *tuple);