Browse Source

JSON: Add atoi external dependency

Lukas M 5 years ago
parent
commit
a542af9e95
4 changed files with 239 additions and 0 deletions
  1. 79 0
      deps/atoi.c
  2. 17 0
      deps/atoi.h
  3. 104 0
      deps/itoa.c
  4. 39 0
      deps/itoa.h

+ 79 - 0
deps/atoi.c

@@ -0,0 +1,79 @@
+/* Originally released by the musl project (http://www.musl-libc.org/) under the
+ * MIT license. Taken and adapted from the file src/stdlib/atoi.c 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+ */
+
+#include "atoi.h"
+
+UA_StatusCode atoiUnsigned(const char *s, size_t size, UA_UInt64 *result){
+    if(size < 1){   
+        return UA_STATUSCODE_BADDECODINGERROR;
+    }
+    
+    size_t i = 0; 
+    UA_UInt64 n = 0;
+    
+    while ( i < size) {
+        /*isDigit*/
+        if ( s[i] >= '0' && s[i] <= '9' )
+        {
+          n *= 10;
+          n = (n + (UA_UInt64)(s[i] - '0'));
+          i++;
+        }else{
+            return UA_STATUSCODE_BADDECODINGERROR;
+        }
+    }
+    
+    *result = n;
+    return UA_STATUSCODE_GOOD;
+   }
+
+UA_StatusCode atoiSigned(const char *s, size_t size, UA_Int64 *result){
+    if(size < 1){   
+        return UA_STATUSCODE_BADDECODINGERROR;
+    }
+    
+    size_t i = 0; 
+    UA_Int64 n = 0;
+    UA_Boolean neg = 0; 
+    
+    if(*s == '-'){
+        neg = 1;
+        i++;
+    }
+    while ( i < size) {
+        if ( s[i] >= '0' && s[i] <= '9' )
+        {
+          n *= 10;
+          n = (n + (s[i] - '0'));
+          i++;
+        }else{
+            return UA_STATUSCODE_BADDECODINGERROR;
+        }
+    }
+    
+    if (neg){
+       n *= -1;
+    }
+    
+    *result = n;
+    return UA_STATUSCODE_GOOD;
+   }

+ 17 - 0
deps/atoi.h

@@ -0,0 +1,17 @@
+#ifndef ATOI_H
+#define ATOI_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "ua_types.h"
+UA_StatusCode atoiUnsigned(const char *s, size_t size, UA_UInt64 *result);
+UA_StatusCode atoiSigned(const char *s, size_t size, UA_Int64 *result);
+    
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ATOI_H */
+

+ 104 - 0
deps/itoa.c

@@ -0,0 +1,104 @@
+/*
+ * Copyright 2017 Techie Delight
+ * Permission is hereby granted, free of charge, to any person obtaining a copy 
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights 
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
+ * copies of the Software, and to permit persons to whom the Software is 
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included 
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/* Originally released by techiedelight.com 
+ * (http://www.techiedelight.com/implement-itoa-function-in-c/) under the
+ * MIT license. */
+
+#include "itoa.h"
+
+static void swap(char *x, char *y) {
+    char t = *x;
+    *x = *y;
+    *y = t;
+}
+
+/* function to reverse buffer */
+static char* reverse(char *buffer, UA_UInt16 i, UA_UInt16 j) {
+    while (i < j)
+        swap(&buffer[i++], &buffer[j--]);
+
+    return buffer;
+}
+
+/* adapted from http://www.techiedelight.com/implement-itoa-function-in-c/ to use UA_... types */
+UA_UInt16 itoaUnsigned(UA_UInt64 value, char* buffer, UA_Byte base) {
+    /* consider absolute value of number */
+    UA_UInt64 n = value;
+
+    UA_UInt16 i = 0;
+    while (n) {
+        UA_UInt64 r = n % base;
+
+        if (r >= 10)
+            buffer[i++] = (char)(65 + (r - 10));
+        else
+            buffer[i++] = (char)(48 + r);
+
+        n = n / base;
+    }
+    /* if number is 0 */
+    if (i == 0)
+        buffer[i++] = '0';
+
+    buffer[i] = '\0'; /* null terminate string */
+    i--;
+    /* reverse the string */
+    reverse(buffer, 0, i);
+    i++;
+    return i;
+}
+
+/* adapted from http://www.techiedelight.com/implement-itoa-function-in-c/ to use UA_... types */
+UA_UInt16 itoaSigned(UA_Int64 value, char* buffer) {
+    /* consider absolute value of number */
+    UA_UInt64 n = (UA_UInt64)value;
+
+    if(value < 0){
+        n = (UA_UInt64)-value;
+    }
+    
+    UA_UInt16 i = 0;
+    while (n) {
+        UA_UInt64 r = n % 10;
+
+        if (r >= 10)
+            buffer[i++] = (char)(65 + (r - 10));
+        else
+            buffer[i++] = (char)(48 + r);
+
+        n = n / 10;
+    }
+
+    /* if number is 0 */
+    if (i == 0)
+        buffer[i++] = '0';
+
+    if (value < 0)
+        buffer[i++] = '-';
+
+    buffer[i] = '\0'; /* null terminate string */
+    i--;
+    /* reverse the string and return it */
+    reverse(buffer, 0, i);
+    i++;
+    return i;
+}
+

+ 39 - 0
deps/itoa.h

@@ -0,0 +1,39 @@
+/*
+ * Copyright 2017 Techie Delight
+ * Permission is hereby granted, free of charge, to any person obtaining a copy 
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights 
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 
+ * copies of the Software, and to permit persons to whom the Software is 
+ * furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included 
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef ITOA_H
+#define ITOA_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+    
+#include "ua_types.h"
+    
+UA_UInt16 itoaUnsigned(UA_UInt64 value, char* buffer, UA_Byte base);
+UA_UInt16 itoaSigned(UA_Int64 value, char* buffer);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ITOA_H */
+