- switch(rule)
- {
- case 0:
- {
- // Handle characters that must be fully encoded.
- if(leftOverSize == 0)
- {
- if(posn >= byteLength)
- {
- throw new ArgumentException
- (_("Arg_InsufficientSpace"), "bytes");
- }
- bytes[posn++] = (byte)'+';
- }
- leftOverBits = ((leftOverBits << 16) | ch);
- leftOverSize += 16;
- while(leftOverSize >= 6)
- {
- if(posn >= byteLength)
- {
- throw new ArgumentException
- (_("Arg_InsufficientSpace"), "bytes");
- }
- leftOverSize -= 6;
- bytes[posn++] = (byte)(base64
- [leftOverBits >> leftOverSize]);
- leftOverBits &= ((1 << leftOverSize) - 1);
- }
- }
- break;
-
- case 1:
- {
- // The character is encoded as itself.
- if(leftOverSize != 0)
- {
- // Flush the previous encoded sequence.
- if((posn + 2) > byteLength)
- {
- throw new ArgumentException
- (_("Arg_InsufficientSpace"), "bytes");
- }
- bytes[posn++] = (byte)(base64
- [leftOverBits << (6 - leftOverSize)]);
- bytes[posn++] = (byte)'-';
- leftOverSize = 0;
- leftOverBits = 0;
- }
- if(posn >= byteLength)
- {
- throw new ArgumentException
- (_("Arg_InsufficientSpace"), "bytes");
- }
- bytes[posn++] = (byte)ch;
- }
- break;
-
- case 2:
- {
- // The character may need to be encoded.
- if(allowOptionals)
- {
- goto case 1;
- }
- else
- {
- goto case 0;
- }
- }
- // Not reached.
-
- case 3:
- {
- // Encode the plus sign as "+-".
- if(leftOverSize != 0)
- {
- // Flush the previous encoded sequence.
- if((posn + 2) > byteLength)
- {
- throw new ArgumentException
- (_("Arg_InsufficientSpace"), "bytes");
- }
- bytes[posn++] = (byte)(base64
- [leftOverBits << (6 - leftOverSize)]);
- bytes[posn++] = (byte)'-';
- leftOverSize = 0;
- leftOverBits = 0;
- }
- if((posn + 2) > byteLength)
- {
- throw new ArgumentException
- (_("Arg_InsufficientSpace"), "bytes");
- }
- bytes[posn++] = (byte)'+';
- bytes[posn++] = (byte)'-';
+ leftOverSize -= 6;
+ bytes[posn++] = (byte)(base64 [leftOverBits >> leftOverSize]);
+ leftOverBits &= ((1 << leftOverSize) - 1);
+ }
+ break;
+ case 1:
+ // The character is encoded as itself.
+ if (isInShifted) {
+ if (leftOverSize != 0) {
+ // Flush the previous encoded sequence.
+ if ((posn + 1) > byteLength) {
+ throw new ArgumentException (_("Arg_InsufficientSpace"), "bytes");