• 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