File: cmBase32.cxx

package info (click to toggle)
cmake 4.1.2-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 147,412 kB
  • sloc: ansic: 403,924; cpp: 290,826; sh: 4,091; python: 3,357; yacc: 3,106; lex: 1,189; f90: 532; asm: 471; lisp: 375; cs: 270; java: 266; fortran: 230; perl: 217; objc: 215; xml: 198; makefile: 98; javascript: 83; pascal: 63; tcl: 55; php: 25; ruby: 22
file content (93 lines) | stat: -rw-r--r-- 2,466 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file LICENSE.rst or https://cmake.org/licensing for details.  */
#include "cmBase32.h"

// -- Static functions

static unsigned char const Base32EncodeTable[33] =
  "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";

inline unsigned char Base32EncodeChar(int schar)
{
  return Base32EncodeTable[schar];
}

static void Base32Encode5(unsigned char const src[5], char dst[8])
{
  // [0]:5 bits
  dst[0] = Base32EncodeChar((src[0] >> 3) & 0x1F);
  // [0]:3 bits + [1]:2 bits
  dst[1] = Base32EncodeChar(((src[0] << 2) & 0x1C) + ((src[1] >> 6) & 0x03));
  // [1]:5 bits
  dst[2] = Base32EncodeChar((src[1] >> 1) & 0x1F);
  // [1]:1 bit + [2]:4 bits
  dst[3] = Base32EncodeChar(((src[1] << 4) & 0x10) + ((src[2] >> 4) & 0x0F));
  // [2]:4 bits + [3]:1 bit
  dst[4] = Base32EncodeChar(((src[2] << 1) & 0x1E) + ((src[3] >> 7) & 0x01));
  // [3]:5 bits
  dst[5] = Base32EncodeChar((src[3] >> 2) & 0x1F);
  // [3]:2 bits + [4]:3 bit
  dst[6] = Base32EncodeChar(((src[3] << 3) & 0x18) + ((src[4] >> 5) & 0x07));
  // [4]:5 bits
  dst[7] = Base32EncodeChar((src[4] << 0) & 0x1F);
}

// -- Class methods

cmBase32Encoder::cmBase32Encoder() = default;

std::string cmBase32Encoder::encodeString(unsigned char const* input,
                                          size_t len, bool padding)
{
  std::string res;

  static size_t const blockSize = 5;
  static size_t const bufferSize = 8;
  char buffer[bufferSize];

  unsigned char const* end = input + len;
  while ((input + blockSize) <= end) {
    Base32Encode5(input, buffer);
    res.append(buffer, bufferSize);
    input += blockSize;
  }

  size_t remain = static_cast<size_t>(end - input);
  if (remain != 0) {
    // Temporary source buffer filled up with 0s
    unsigned char padded[blockSize];
    for (size_t ii = 0; ii != remain; ++ii) {
      padded[ii] = input[ii];
    }
    for (size_t ii = remain; ii != blockSize; ++ii) {
      padded[ii] = 0;
    }

    Base32Encode5(padded, buffer);
    size_t numPad(0);
    switch (remain) {
      case 1:
        numPad = 6;
        break;
      case 2:
        numPad = 4;
        break;
      case 3:
        numPad = 3;
        break;
      case 4:
        numPad = 1;
        break;
      default:
        break;
    }
    res.append(buffer, bufferSize - numPad);
    if (padding) {
      for (size_t ii = 0; ii != numPad; ++ii) {
        res.push_back(paddingChar);
      }
    }
  }

  return res;
}