code: private Diff decode(final int blockSize_C, final int blockSize_S,
  			final int blockSize_E, final int blockSize_B, final int blockSize_L)
  		throws UnsupportedEncodingException, DecodingException
  	{
  
  		int code = r.read(blockSize_C);
  		Diff diff = new Diff();
  
  		while (code != -1) {
  			// System.out.print(code + "\t");
  
  			switch (DiffAction.parse(code)) {
  			case FULL_REVISION_UNCOMPRESSED:
  				diff.add(decodeFullRevision(blockSize_L));
  				break;
  			case INSERT:
  				diff.add(decodeAdd(blockSize_S, blockSize_L));
  				break;
  			case DELETE:
  				diff.add(decodeDelete(blockSize_S, blockSize_E));
  				break;
  			case REPLACE:
  				diff.add(decodeReplace(blockSize_S, blockSize_E, blockSize_L));
  				break;
  			case CUT:
  				diff.add(decodeCut(blockSize_S, blockSize_E, blockSize_B));
  				break;
  			case PASTE:
  				diff.add(decodePaste(blockSize_S, blockSize_B, r));
  				break;
  			default:
  				throw new DecodingException("Invalid block_c code: " + code);
  			}
  
  			// System.out.println();
  			code = r.read(blockSize_C);
  		}
  
  		return diff;
  	}
docs: Decodes the information, after the codec was successfully decoded, and
  returns the Diff.
  
  @param blockSize_C
  length of a C block
  @param blockSize_S
  length of a S block
  @param blockSize_E
  length of a E block
  @param blockSize_B
  length of a B block
  @param blockSize_L
  length of a L block
  @return Diff
  
  @throws UnsupportedEncodingException
  if the character encoding is unsupported
  @throws DecodingException
  if the decoding failed