Contiki 3.x
rest-util.c
1 #include <stddef.h> /*for size_t*/
2 #include <ctype.h> /*for isxdigit*/
3 #include <string.h>
4 
5 #include "contiki-net.h"
6 
7 /*Copied from mangoose http server*/
8 size_t
9 decode(const char *src, size_t srclen, char *dst, size_t dstlen, int is_form)
10 {
11  size_t i, j;
12  int a, b;
13 #define HEXTOI(x) (isdigit(x) ? x - '0' : x - 'W')
14 
15  for (i = j = 0; i < srclen && j < dstlen - 1; i++, j++) {
16  if (src[i] == '%' &&
17  isxdigit(* (unsigned char *) (src + i + 1)) &&
18  isxdigit(* (unsigned char *) (src + i + 2))) {
19  a = tolower(* (unsigned char *) (src + i + 1));
20  b = tolower(* (unsigned char *) (src + i + 2));
21  dst[j] = ((HEXTOI(a) << 4) | HEXTOI(b)) & 0xff;
22  i += 2;
23  } else if (is_form && src[i] == '+') {
24  dst[j] = ' ';
25  } else {
26  dst[j] = src[i];
27  }
28  }
29 
30  dst[j] = '\0'; /* Null-terminate the destination */
31 
32  return ( i == srclen );
33 }
34 
35 /*Copied from mangoose http server*/
36 int
37 get_variable(const char *name, const char *buffer, size_t buflen, char* output, size_t output_len, int decode_type)
38 {
39  const char *start = NULL, *end = NULL, *end_of_value;
40  size_t var_len = 0;
41 
42  /*initialize the output buffer first*/
43  *output = 0;
44 
45  var_len = strlen(name);
46  end = buffer + buflen;
47 
48  for (start = buffer; start + var_len < end; start++){
49  if ((start == buffer || start[-1] == '&') && start[var_len] == '=' &&
50  ! strncmp(name, start, var_len)) {
51  /* Point p to variable value */
52  start += var_len + 1;
53 
54  /* Point s to the end of the value */
55  end_of_value = (const char *) memchr(start, '&', end - start);
56  if (end_of_value == NULL) {
57  end_of_value = end;
58  }
59 
60  return decode(start, end_of_value - start, output, output_len, decode_type);
61  }
62  }
63 
64  return 0;
65 }
66 
67 uint32_t
68 read_int(uint8_t *buf, uint8_t size)
69 {
70  uint32_t data = 0;
71 
72  if (size >= 1 && size <= 4) {
73  uint8_t *p = (uint8_t *)&data;
74  memcpy(p + 4 - size, buf, size);
75  }
76 
77  return uip_ntohl(data);
78 }
79 
80 
81 int
82 write_int(uint8_t *buf, uint32_t data, uint8_t size)
83 {
84  int success = 0;
85 
86  if (size >= 1 && size <= 4) {
87  data = uip_htonl(data);
88  memcpy(buf, ((char*)(&data)) + 4 - size, size);
89  success = size;
90  }
91 
92  return success;
93 }
94 
95 int
96 write_variable_int(uint8_t *buf, uint32_t data)
97 {
98  uint8_t size = 4;
99  if (data <= 0xFF) {
100  size = 1;
101  } else if (data <= 0xFFFF) {
102  size = 2;
103  } else if (data <= 0xFFFFFF) {
104  size = 3;
105  }
106  return write_int(buf, data, size);
107 }
108 
109 uint16_t log_2(uint16_t value)
110 {
111  uint16_t result = 0;
112  do {
113  value = value >> 1;
114  result++;
115  } while (value);
116 
117  return result ? result - 1 : result;
118 }
#define NULL
The null pointer.