summaryrefslogtreecommitdiffstats
path: root/cpukit/score
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-23 13:25:00 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-25 16:16:25 +0100
commit5f8bc839e89ea6efa7f48ebcec8939861024649f (patch)
tree94fff4d939edd79621c60f66a4164822cb4296d4 /cpukit/score
parentlibtest: Report build label (diff)
downloadrtems-5f8bc839e89ea6efa7f48ebcec8939861024649f.tar.bz2
score: Add _IO_Base64url()
Update #4267.
Diffstat (limited to 'cpukit/score')
-rw-r--r--cpukit/score/src/iobase64.c56
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);
+}