• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* coap_encode.c -- encoding and decoding of CoAP data types
2  *
3  * Copyright (C) 2010,2011 Olaf Bergmann <bergmann@tzi.org>
4  *
5  * SPDX-License-Identifier: BSD-2-Clause
6  *
7  * This file is part of the CoAP library libcoap. Please see
8  * README for terms of use.
9  */
10 
11 /**
12  * @file coap_encode.c
13  * @brief Encoding and decoding Coap data types functions
14  */
15 
16 #include "coap3/coap_internal.h"
17 
18 /* Carsten suggested this when fls() is not available: */
19 #ifndef HAVE_FLS
20 int
coap_fls(unsigned int i)21 coap_fls(unsigned int i) {
22   return coap_flsll(i);
23 }
24 #endif
25 
26 #ifndef HAVE_FLSLL
27 int
coap_flsll(long long j)28 coap_flsll(long long j) {
29   unsigned long long i = (unsigned long long)j;
30   int n;
31   for (n = 0; i; n++)
32     i >>= 1;
33   return n;
34 }
35 #endif
36 
37 unsigned int
coap_decode_var_bytes(const uint8_t * buf,size_t len)38 coap_decode_var_bytes(const uint8_t *buf, size_t len) {
39   unsigned int i, n = 0;
40   for (i = 0; i < len; ++i)
41     n = (n << 8) + buf[i];
42 
43   return n;
44 }
45 
46 unsigned int
coap_encode_var_safe(uint8_t * buf,size_t length,unsigned int val)47 coap_encode_var_safe(uint8_t *buf, size_t length, unsigned int val) {
48   unsigned int n, i;
49 
50   for (n = 0, i = val; i && n < sizeof(val); ++n)
51     i >>= 8;
52 
53   if (n > length) {
54     assert(n <= length);
55     return 0;
56   }
57   i = n;
58   while (i--) {
59     buf[i] = val & 0xff;
60     val >>= 8;
61   }
62 
63   return n;
64 }
65 
66 uint64_t
coap_decode_var_bytes8(const uint8_t * buf,size_t len)67 coap_decode_var_bytes8(const uint8_t *buf, size_t len) {
68   unsigned int i;
69   uint64_t n = 0;
70   for (i = 0; i < len && i < sizeof(uint64_t); ++i)
71     n = (n << 8) + buf[i];
72 
73   return n;
74 }
75 
76 unsigned int
coap_encode_var_safe8(uint8_t * buf,size_t length,uint64_t val)77 coap_encode_var_safe8(uint8_t *buf, size_t length, uint64_t val) {
78   unsigned int n, i;
79   uint64_t tval = val;
80 
81   for (n = 0; tval && n < sizeof(val); ++n)
82     tval >>= 8;
83 
84   if (n > length) {
85     assert(n <= length);
86     return 0;
87   }
88   i = n;
89   while (i--) {
90     buf[i] = val & 0xff;
91     val >>= 8;
92   }
93 
94   return n;
95 }
96