diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-02-23 13:25:00 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2021-02-25 16:16:25 +0100 |
commit | 5f8bc839e89ea6efa7f48ebcec8939861024649f (patch) | |
tree | 94fff4d939edd79621c60f66a4164822cb4296d4 /cpukit/score | |
parent | libtest: Report build label (diff) | |
download | rtems-5f8bc839e89ea6efa7f48ebcec8939861024649f.tar.bz2 |
score: Add _IO_Base64url()
Update #4267.
Diffstat (limited to 'cpukit/score')
-rw-r--r-- | cpukit/score/src/iobase64.c | 56 |
1 files changed, 38 insertions, 18 deletions
diff --git a/cpukit/score/src/iobase64.c b/cpukit/score/src/iobase64.c index bbf7658c2a..38bc2cd22c 100644 --- a/cpukit/score/src/iobase64.c +++ b/cpukit/score/src/iobase64.c @@ -6,11 +6,11 @@ * @ingroup RTEMSScoreIO * * @brief This source file contains the implementation of - * _IO_Base64(). + * _IO_Base64() and _IO_Base64url(). */ /* - * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) + * Copyright (C) 2020, 2021 embedded brains GmbH (http://www.embedded-brains.de) * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1998-2001, 2003 Internet Software Consortium. * @@ -29,17 +29,15 @@ #include <rtems/score/io.h> -static const char base64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - -static void _IO_Put(int c, void *arg, IO_Put_char put_char) +static void +_IO_Put(int c, void *arg, IO_Put_char put_char) { (*put_char)(c, arg); } -int -_IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen, - const char *wordbreak, int wordlen) +static int +_IO_Base64_with_encoding(IO_Put_char put_char, void *arg, const void *src, + size_t srclen, const char *wordbreak, int wordlen, const char *encoding) { unsigned int loops = 0; const unsigned char *in = src; @@ -50,12 +48,12 @@ _IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen, } while (srclen > 2) { - _IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char); - _IO_Put(base64[((in[0]<<4)&0x30)| + _IO_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); + _IO_Put(encoding[((in[0]<<4)&0x30)| ((in[1]>>4)&0x0f)], arg, put_char); - _IO_Put(base64[((in[1]<<2)&0x3c)| + _IO_Put(encoding[((in[1]<<2)&0x3c)| ((in[2]>>6)&0x03)], arg, put_char); - _IO_Put(base64[in[2]&0x3f], arg, put_char); + _IO_Put(encoding[in[2]&0x3f], arg, put_char); in += 3; srclen -= 3; out += 4; @@ -74,18 +72,40 @@ _IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen, } } if (srclen == 2) { - _IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char); - _IO_Put(base64[((in[0]<<4)&0x30)| + _IO_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); + _IO_Put(encoding[((in[0]<<4)&0x30)| ((in[1]>>4)&0x0f)], arg, put_char); - _IO_Put(base64[((in[1]<<2)&0x3c)], arg, put_char); + _IO_Put(encoding[((in[1]<<2)&0x3c)], arg, put_char); _IO_Put('=', arg, put_char); out += 4; } else if (srclen == 1) { - _IO_Put(base64[(in[0]>>2)&0x3f], arg, put_char); - _IO_Put(base64[((in[0]<<4)&0x30)], arg, put_char); + _IO_Put(encoding[(in[0]>>2)&0x3f], arg, put_char); + _IO_Put(encoding[((in[0]<<4)&0x30)], arg, put_char); _IO_Put('=', arg, put_char); _IO_Put('=', arg, put_char); out += 4; } return out; } + +static const char base64[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; + +int +_IO_Base64(IO_Put_char put_char, void *arg, const void *src, size_t srclen, + const char *wordbreak, int wordlen) +{ + return _IO_Base64_with_encoding(put_char, arg, src, srclen, wordbreak, + wordlen, base64); +} + +static const char base64url[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_="; + +int +_IO_Base64url(IO_Put_char put_char, void *arg, const void *src, size_t srclen, + const char *wordbreak, int wordlen) +{ + return _IO_Base64_with_encoding(put_char, arg, src, srclen, wordbreak, + wordlen, base64url); +} |