[PATCH 04/10] score: Add _IO_Base64url()

Sebastian Huber sebastian.huber at embedded-brains.de
Wed Feb 24 13:57:24 UTC 2021


Update #4267.
---
 cpukit/include/rtems/score/io.h    | 51 +++++++++++++++++++++++----
 cpukit/score/src/iobase64.c        | 56 ++++++++++++++++++++----------
 testsuites/sptests/spprintk/init.c | 12 +++++++
 3 files changed, 94 insertions(+), 25 deletions(-)

diff --git a/cpukit/include/rtems/score/io.h b/cpukit/include/rtems/score/io.h
index f851d30b8a..f7b576fddd 100644
--- a/cpukit/include/rtems/score/io.h
+++ b/cpukit/include/rtems/score/io.h
@@ -64,15 +64,21 @@ int _IO_Vprintf(
  * After word length of output characters produced by the encoding a word break
  * is produced.
  *
- * @param put_char The put character function.
- * @param arg The argument passed to the put character function.
- * @param src The pointer to the source buffer begin.
- * @param srclen The length of the source buffer in bytes.
- * @param wordbreak The word break string.
- * @param wordlen The word length in bytes.  If the word length is less than
+ * @param put_char is the put character function used to output the encoded
+ *   source buffer.
+ *
+ * @param arg is the argument passed to the put character function.
+ *
+ * @param src is the pointer to the source buffer begin.
+ *
+ * @param srclen is the length of the source buffer in bytes.
+ *
+ * @param wordbreak is the word break string.
+ *
+ * @param wordlen is the word length in bytes.  If the word length is less than
  *   four, then a word length of four will be used.
  *
- * @return The count of output characters.
+ * @return Returns the count of output characters.
  */
 int _IO_Base64(
   IO_Put_char  put_char,
@@ -83,6 +89,37 @@ int _IO_Base64(
   int          wordlen
 );
 
+/**
+ * @brief Outputs the source buffer in base64url encoding.
+ *
+ * After word length of output characters produced by the encoding a word break
+ * is produced.
+ *
+ * @param put_char is the put character function used to output the encoded
+ *   source buffer.
+ *
+ * @param arg is the argument passed to the put character function.
+ *
+ * @param src is the pointer to the source buffer begin.
+ *
+ * @param srclen is the length of the source buffer in bytes.
+ *
+ * @param wordbreak is the word break string.
+ *
+ * @param wordlen is the word length in bytes.  If the word length is less than
+ *   four, then a word length of four will be used.
+ *
+ * @return Returns the count of output characters.
+ */
+int _IO_Base64url(
+  IO_Put_char  put_char,
+  void        *arg,
+  const void  *src,
+  size_t       len,
+  const char  *wordbreak,
+  int          wordlen
+);
+
 /** @} */ 
 
 #ifdef __cplusplus
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);
+}
diff --git a/testsuites/sptests/spprintk/init.c b/testsuites/sptests/spprintk/init.c
index 0c0e4c7fb8..ffabb9ae91 100644
--- a/testsuites/sptests/spprintk/init.c
+++ b/testsuites/sptests/spprintk/init.c
@@ -242,6 +242,17 @@ static void test_io_base64( test_context *ctx )
   rtems_test_assert( n == 0 );
 }
 
+static void test_io_base64url( test_context *ctx )
+{
+  unsigned char buf[] = { 0, 0, 62, 0, 0, 63 };
+  int n;
+
+  clear( ctx );
+  n = _IO_Base64url( put_char, ctx, buf, sizeof( buf ), "\n", 0 );
+  rtems_test_assert( n == 9 );
+  rtems_test_assert( strcmp( ctx->buf, "AAA-\nAAA_" ) == 0 );
+}
+
 static rtems_task Init(
   rtems_task_argument argument
 )
@@ -257,6 +268,7 @@ static rtems_task Init(
   do_getchark();
   test_io_printf(&test_instance);
   test_io_base64(&test_instance);
+  test_io_base64url(&test_instance);
 
   TEST_END();
   rtems_test_exit( 0 );
-- 
2.26.2



More information about the devel mailing list