GNUnet  0.11.x
Data Structures | Macros | Functions | Variables
strings.c File Reference

string functions More...

#include "platform.h"
#include "gnunet_crypto_lib.h"
#include "gnunet_buffer_lib.h"
#include "gnunet_strings_lib.h"
#include <unicase.h>
#include <unistr.h>
#include <uniconv.h>
Include dependency graph for strings.c:

Go to the source code of this file.

Data Structures

struct  ConversionTable
 Unit conversion table entry for 'convert_with_table'. More...
 

Macros

#define LOG(kind, ...)   GNUNET_log_from (kind, "util-strings", __VA_ARGS__)
 
#define LOG_STRERROR(kind, syscall)   GNUNET_log_from_strerror (kind, "util-strings", syscall)
 
#define FILLCHAR   '='
 ******************** Base64 encoding More...
 
#define cvtfind(a)
 
#define CHECK_CRLF
 

Functions

size_t GNUNET_STRINGS_buffer_fill (char *buffer, size_t size, unsigned int count,...)
 Fill a buffer of the given size with count 0-terminated strings (given as varargs). More...
 
char * GNUNET_STRINGS_pp2s (const struct GNUNET_PeerIdentity *pids, unsigned int num_pids)
 Convert a peer path to a human-readable string. More...
 
unsigned int GNUNET_STRINGS_buffer_tokenize (const char *buffer, size_t size, unsigned int count,...)
 Given a buffer of a given size, find "count" 0-terminated strings in the buffer and assign the count (varargs) of type "const char**" to the locations of the respective strings in the buffer. More...
 
char * GNUNET_STRINGS_byte_size_fancy (unsigned long long size)
 Convert a given filesize into a fancy human-readable format. More...
 
size_t GNUNET_strlcpy (char *dst, const char *src, size_t n)
 Like strlcpy but portable. More...
 
static int convert_with_table (const char *input, const struct ConversionTable *table, unsigned long long *output)
 Convert a string of the form "4 X 5 Y" into a numeric value by interpreting "X" and "Y" as units and then multiplying the numbers with the values associated with the respective unit from the conversion table. More...
 
int GNUNET_STRINGS_fancy_size_to_bytes (const char *fancy_size, unsigned long long *size)
 Convert a given fancy human-readable size to bytes. More...
 
int GNUNET_STRINGS_fancy_time_to_relative (const char *fancy_time, struct GNUNET_TIME_Relative *rtime)
 Convert a given fancy human-readable time to our internal representation. More...
 
int GNUNET_STRINGS_fancy_time_to_absolute (const char *fancy_time, struct GNUNET_TIME_Absolute *atime)
 Convert a given fancy human-readable time to our internal representation. More...
 
char * GNUNET_STRINGS_conv (const char *input, size_t len, const char *input_charset, const char *output_charset)
 Convert the len characters long character sequence given in input that is in the given input charset to a string in given output charset. More...
 
char * GNUNET_STRINGS_to_utf8 (const char *input, size_t len, const char *charset)
 Convert the len characters long character sequence given in input that is in the given charset to UTF-8. More...
 
char * GNUNET_STRINGS_from_utf8 (const char *input, size_t len, const char *charset)
 Convert the len bytes-long UTF-8 string given in input to the given charset. More...
 
void GNUNET_STRINGS_utf8_tolower (const char *input, char *output)
 Convert the utf-8 input string to lowercase. More...
 
void GNUNET_STRINGS_utf8_toupper (const char *input, char *output)
 Convert the utf-8 input string to uppercase. More...
 
char * GNUNET_STRINGS_filename_expand (const char *fil)
 Complete filename (a la shell) from abbrevition. More...
 
const char * GNUNET_STRINGS_relative_time_to_string (struct GNUNET_TIME_Relative delta, int do_round)
 Give relative time in human-readable fancy format. More...
 
const char * GNUNET_STRINGS_absolute_time_to_string (struct GNUNET_TIME_Absolute t)
 "asctime", except for GNUnet time. More...
 
const char * GNUNET_STRINGS_get_short_name (const char *filename)
 "man basename" Returns a pointer to a part of filename (allocates nothing)! More...
 
static unsigned int getValue__ (unsigned char a)
 Get the decoded value corresponding to a character according to Crockford Base32 encoding. More...
 
char * GNUNET_STRINGS_data_to_string (const void *data, size_t size, char *out, size_t out_size)
 Convert binary data to ASCII encoding using Crockford Base32 encoding. More...
 
char * GNUNET_STRINGS_data_to_string_alloc (const void *buf, size_t size)
 Return the base32crockford encoding of the given buffer. More...
 
int GNUNET_STRINGS_string_to_data (const char *enc, size_t enclen, void *out, size_t out_size)
 Convert Crockford Base32hex encoding back to data. More...
 
int GNUNET_STRINGS_parse_uri (const char *path, char **scheme_part, const char **path_part)
 Parse a path that might be an URI. More...
 
int GNUNET_STRINGS_path_is_absolute (const char *filename, int can_be_uri, int *r_is_uri, char **r_uri_scheme)
 Check whether filename is absolute or not, and if it's an URI. More...
 
int GNUNET_STRINGS_check_filename (const char *filename, enum GNUNET_STRINGS_FilenameCheck checks)
 Perform checks on filename. More...
 
int GNUNET_STRINGS_to_address_ipv6 (const char *zt_addr, uint16_t addrlen, struct sockaddr_in6 *r_buf)
 Tries to convert zt_addr string to an IPv6 address. More...
 
int GNUNET_STRINGS_to_address_ipv4 (const char *zt_addr, uint16_t addrlen, struct sockaddr_in *r_buf)
 Tries to convert 'zt_addr' string to an IPv4 address. More...
 
int GNUNET_STRINGS_to_address_ip (const char *addr, uint16_t addrlen, struct sockaddr_storage *r_buf)
 Tries to convert addr string to an IP (v4 or v6) address. More...
 
size_t GNUNET_STRINGS_parse_socket_addr (const char *addr, uint8_t *af, struct sockaddr **sa)
 Parse an address given as a string into a struct sockaddr. More...
 
static char *const * _make_continuous_arg_copy (int argc, char *const *argv)
 Makes a copy of argv that consists of a single memory chunk that can be freed with a single call to GNUNET_free();. More...
 
int GNUNET_STRINGS_get_utf8_args (int argc, char *const *argv, int *u8argc, char *const **u8argv)
 Returns utf-8 encoded arguments. More...
 
static int parse_port_policy (const char *port_policy, struct GNUNET_STRINGS_PortPolicy *pp)
 Parse the given port policy. More...
 
struct GNUNET_STRINGS_IPv4NetworkPolicyGNUNET_STRINGS_parse_ipv4_policy (const char *routeListX)
 Parse an IPv4 network policy. More...
 
struct GNUNET_STRINGS_IPv6NetworkPolicyGNUNET_STRINGS_parse_ipv6_policy (const char *routeListX)
 Parse an IPv6 network policy. More...
 
size_t GNUNET_STRINGS_base64_encode (const void *in, size_t len, char **output)
 Encode into Base64. More...
 
size_t GNUNET_STRINGS_base64url_encode (const void *in, size_t len, char **output)
 Encode into Base64url. More...
 
size_t GNUNET_STRINGS_base64_decode (const char *data, size_t len, void **out)
 Decode from Base64. More...
 
size_t GNUNET_STRINGS_base64url_decode (const char *data, size_t len, void **out)
 Decode from Base64url. More...
 
size_t GNUNET_STRINGS_urldecode (const char *data, size_t len, char **out)
 url/percent encode (RFC3986). More...
 
size_t GNUNET_STRINGS_urlencode (const char *data, size_t len, char **out)
 url/percent encode (RFC3986). More...
 

Variables

static char * cvt
 

Detailed Description

string functions

Author
Nils Durner
Christian Grothoff

Definition in file strings.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)    GNUNET_log_from (kind, "util-strings", __VA_ARGS__)

◆ LOG_STRERROR

#define LOG_STRERROR (   kind,
  syscall 
)    GNUNET_log_from_strerror (kind, "util-strings", syscall)

◆ FILLCHAR

#define FILLCHAR   '='

******************** Base64 encoding

Definition at line 1860 of file strings.c.

Referenced by GNUNET_STRINGS_base64_decode(), and GNUNET_STRINGS_base64_encode().

◆ cvtfind

#define cvtfind (   a)
Value:
((((a) >= 'A') && ((a) <= 'Z')) \
? (a) - 'A' \
: (((a) >= 'a') && ((a) <= 'z')) \
? (a) - 'a' + 26 \
: (((a) >= '0') && ((a) <= '9')) \
? (a) - '0' + 52 \
: ((a) == '+') ? 62 : ((a) == '/') ? 63 : -1)

Definition at line 1958 of file strings.c.

Referenced by GNUNET_STRINGS_base64_decode().

◆ CHECK_CRLF

#define CHECK_CRLF
Value:
while (data[i] == '\r' || data[i] == '\n') \
{ \
"ignoring CR/LF\n"); \
i++; \
if (i >= len) \
goto END; \
}
We&#39;re done processing.
uint32_t data
The data value.
uint16_t len
length of data (which is always a uint32_t, but presumably this can be used to specify that fewer byt...

Referenced by GNUNET_STRINGS_base64_decode().

Function Documentation

◆ convert_with_table()

static int convert_with_table ( const char *  input,
const struct ConversionTable table,
unsigned long long *  output 
)
static

Convert a string of the form "4 X 5 Y" into a numeric value by interpreting "X" and "Y" as units and then multiplying the numbers with the values associated with the respective unit from the conversion table.

Parameters
inputinput string to parse
tabletable with the conversion of unit names to numbers
outputwhere to store the result
Returns
GNUNET_OK on success, GNUNET_SYSERR on error

Definition at line 262 of file strings.c.

References GNUNET_free, GNUNET_OK, GNUNET_strdup, GNUNET_SYSERR, GNUNET_YES, ConversionTable::name, ret, and ConversionTable::value.

Referenced by GNUNET_STRINGS_fancy_size_to_bytes(), and GNUNET_STRINGS_fancy_time_to_relative().

265 {
266  unsigned long long ret;
267  char *in;
268  const char *tok;
269  unsigned long long last;
270  unsigned int i;
271  char *sptr;
272 
273  ret = 0;
274  last = 0;
275  in = GNUNET_strdup (input);
276  for (tok = strtok_r (in, " ", &sptr);
277  tok != NULL;
278  tok = strtok_r (NULL, " ", &sptr))
279  {
280  do
281  {
282  i = 0;
283  while ((table[i].name != NULL) && (0 != strcasecmp (table[i].name, tok)))
284  i++;
285  if (table[i].name != NULL)
286  {
287  last *= table[i].value;
288  break; /* next tok */
289  }
290  else
291  {
292  char *endptr;
293  ret += last;
294  errno = 0;
295  last = strtoull (tok, &endptr, 10);
296  if ((0 != errno) || (endptr == tok))
297  {
298  GNUNET_free (in);
299  return GNUNET_SYSERR; /* expected number */
300  }
301  if ('\0' == endptr[0])
302  break; /* next tok */
303  else
304  tok = endptr; /* and re-check (handles times like "10s") */
305  }
306  }
307  while (GNUNET_YES);
308  }
309  ret += last;
310  *output = ret;
311  GNUNET_free (in);
312  return GNUNET_OK;
313 }
unsigned long long value
Factor to apply for this unit.
Definition: strings.c:246
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
#define GNUNET_strdup(a)
Wrapper around GNUNET_xstrdup_.
const char * name
#define GNUNET_free(ptr)
Wrapper around free.
Here is the caller graph for this function:

◆ getValue__()

static unsigned int getValue__ ( unsigned char  a)
static

Get the decoded value corresponding to a character according to Crockford Base32 encoding.

Parameters
aa character
Returns
corresponding numeric value

Definition at line 810 of file strings.c.

References dec.

Referenced by GNUNET_STRINGS_string_to_data().

811 {
812  unsigned int dec;
813 
814  switch (a)
815  {
816  case 'O':
817  case 'o':
818  a = '0';
819  break;
820 
821  case 'i':
822  case 'I':
823  case 'l':
824  case 'L':
825  a = '1';
826  break;
827 
828  /* also consider U to be V */
829  case 'u':
830  case 'U':
831  a = 'V';
832  break;
833 
834  default:
835  break;
836  }
837  if ((a >= '0') && (a <= '9'))
838  return a - '0';
839  if ((a >= 'a') && (a <= 'z'))
840  a = toupper (a);
841  /* return (a - 'a' + 10); */
842  dec = 0;
843  if ((a >= 'A') && (a <= 'Z'))
844  {
845  if ('I' < a)
846  dec++;
847  if ('L' < a)
848  dec++;
849  if ('O' < a)
850  dec++;
851  if ('U' < a)
852  dec++;
853  return(a - 'A' + 10 - dec);
854  }
855  return -1;
856 }
static OpusDecoder * dec
OPUS decoder.
Here is the caller graph for this function:

◆ _make_continuous_arg_copy()

static char* const* _make_continuous_arg_copy ( int  argc,
char *const *  argv 
)
static

Makes a copy of argv that consists of a single memory chunk that can be freed with a single call to GNUNET_free();.

Definition at line 1423 of file strings.c.

References GNUNET_malloc, and p.

Referenced by GNUNET_STRINGS_get_utf8_args().

1424 {
1425  size_t argvsize = 0;
1426  char **new_argv;
1427  char *p;
1428 
1429  for (int i = 0; i < argc; i++)
1430  argvsize += strlen (argv[i]) + 1 + sizeof(char *);
1431  new_argv = GNUNET_malloc (argvsize + sizeof(char *));
1432  p = (char *) &new_argv[argc + 1];
1433  for (int i = 0; i < argc; i++)
1434  {
1435  new_argv[i] = p;
1436  strcpy (p, argv[i]);
1437  p += strlen (argv[i]) + 1;
1438  }
1439  new_argv[argc] = NULL;
1440  return (char *const *) new_argv;
1441 }
static struct GNUNET_OS_Process * p
Helper process we started.
Definition: gnunet-qr.c:59
#define GNUNET_malloc(size)
Wrapper around malloc.
Here is the caller graph for this function:

◆ parse_port_policy()

static int parse_port_policy ( const char *  port_policy,
struct GNUNET_STRINGS_PortPolicy pp 
)
static

Parse the given port policy.

The format is "[!]SPORT[-DPORT]".

Parameters
port_policystring to parse
pppolicy to fill in
Returns
GNUNET_OK on success, GNUNET_SYSERR if the port_policy is malformed

Definition at line 1482 of file strings.c.

References _, e, GNUNET_STRINGS_PortPolicy::end_port, GNUNET_ERROR_TYPE_WARNING, GNUNET_log, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, GNUNET_STRINGS_PortPolicy::negate_portrange, and GNUNET_STRINGS_PortPolicy::start_port.

Referenced by GNUNET_STRINGS_parse_ipv4_policy(), and GNUNET_STRINGS_parse_ipv6_policy().

1484 {
1485  const char *pos;
1486  int s;
1487  int e;
1488  char eol[2];
1489 
1490  pos = port_policy;
1491  if ('!' == *pos)
1492  {
1494  pos++;
1495  }
1496  if (2 == sscanf (pos, "%u-%u%1s", &s, &e, eol))
1497  {
1498  if ((0 == s) || (s > 0xFFFF) || (e < s) || (e > 0xFFFF))
1499  {
1500  GNUNET_log (GNUNET_ERROR_TYPE_WARNING, _ ("Port not in range\n"));
1501  return GNUNET_SYSERR;
1502  }
1503  pp->start_port = (uint16_t) s;
1504  pp->end_port = (uint16_t) e;
1505  return GNUNET_OK;
1506  }
1507  if (1 == sscanf (pos, "%u%1s", &s, eol))
1508  {
1509  if ((0 == s) || (s > 0xFFFF))
1510  {
1511  GNUNET_log (GNUNET_ERROR_TYPE_WARNING, _ ("Port not in range\n"));
1512  return GNUNET_SYSERR;
1513  }
1514 
1515  pp->start_port = (uint16_t) s;
1516  pp->end_port = (uint16_t) s;
1517  return GNUNET_OK;
1518  }
1520  _ ("Malformed port policy `%s'\n"),
1521  port_policy);
1522  return GNUNET_SYSERR;
1523 }
uint16_t start_port
Starting port range (0 if none given).
int negate_portrange
GNUNET_YES if the port range should be negated ("!" in policy).
static struct Experiment * e
#define _(String)
GNU gettext support macro.
Definition: platform.h:184
uint16_t end_port
End of port range (0 if none given).
#define GNUNET_log(kind,...)
Here is the caller graph for this function:

Variable Documentation

◆ cvt

char* cvt
static
Initial value:
= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
"0123456789+/"

Definition at line 1861 of file strings.c.

Referenced by GNUNET_STRINGS_base64_encode().