code: private static byte[] allocateConvertedString(byte[] source, byte[] destination, byte[] str, int strP, int strLen, byte[] callerDstBuf, Ptr dstLenPtr) {
          int dstBufSize;
  
          if (callerDstBuf != null) {
              dstBufSize = callerDstBuf.length;
          } else if (strLen == 0) {
              dstBufSize = 1; // ??
          } else {
              dstBufSize = strLen;
          }
  
          EConv ec = TranscoderDB.open(source, destination, 0);
          if (ec == null) return null;
  
          byte[] dstStr;
          if (callerDstBuf != null) {
              dstStr = callerDstBuf;
          } else {
              dstStr = new byte[dstBufSize];
          }
  
          int dstLen = 0;
          Ptr sp = new Ptr(strP);
          Ptr dp = new Ptr(dstLen);
          EConvResult res = ec.convert(str, sp, strP + strLen, dstStr, dp, dstBufSize, 0);
          dstLen = dp.p;
  
          while (res.isDestinationBufferFull()) {
              dstBufSize *= 2;
              byte[] tmp = new byte[dstBufSize];
              System.arraycopy(dstStr, 0, tmp, 0, dstBufSize / 2);
              dstStr = tmp;
  
              dp.p = dstLen; // ??
              res = ec.convert(str, sp, strP + strLen, dstStr, dp, dstBufSize, 0);
              dstLen = dp.p;
          }
  
          if (!res.isFinished()) return null;
  
          ec.close();
          dstLenPtr.p = dstLen;
  
          return dstStr;
      }
docs: /* allocate_converted_string