docs: private String[] parseLine(String nextLine, boolean multi) throws IOException {
  
          if (!multi && pending != null) {
              pending = null;
          }
  
          if (nextLine == null) {
              if (pending != null) {
                  String s = pending;
                  pending = null;
                  return new String[]{s};
              } else {
                  return null;
              }
          }
  
          List<String> tokensOnThisLine = new ArrayList<String>();
          StringBuilder sb = new StringBuilder(INITIAL_READ_SIZE);
          boolean inQuotes = false;
          if (pending != null) {
              sb.append(pending);
              pending = null;
              inQuotes = true;
          }
          for (int i = 0; i < nextLine.length(); i++) {
  
              char c = nextLine.charAt(i);
              if (c == this.escape) {
                  if (isNextCharacterEscapable(nextLine, inQuotes || inField, i)) {
                      sb.append(nextLine.charAt(i + 1));
                      i++;
                  }
              } else if (c == quotechar) {
                  if (isNextCharacterEscapedQuote(nextLine, inQuotes || inField, i)) {
                      sb.append(nextLine.charAt(i + 1));
                      i++;
                  } else {
                      //inQuotes = !inQuotes;
  
                      // the tricky case of an embedded quote in the middle: a,bc"d"ef,g
                      if (!strictQuotes) {
                          if (i > 2 //not on the beginning of the line
                                  && nextLine.charAt(i - 1) != this.separator //not at the beginning of an escape sequence
                                  && nextLine.length() > (i + 1) &&
                                  nextLine.charAt(i + 1) != this.separator //not at the	end of an escape sequence
                                  ) {
  
                              if (ignoreLeadingWhiteSpace && sb.length() > 0 && isAllWhiteSpace(sb)) {
                                  sb.setLength(0);  //discard white space leading up to quote
                              } else {
                                  sb.append(c);
                                  //continue;
                              }
  
                          }
                      }
  
                      inQuotes = !inQuotes;
                  }
                  inField = !inField;
              } else if (c == separator && !inQuotes) {
                  tokensOnThisLine.add(sb.toString());
                  sb.setLength(0); // start work on next token
                  inField = false;
              } else {
                  if (!strictQuotes || inQuotes) {
                      sb.append(c);
                      inField = true;
                  }
              }
          }
          // line is done - check status
          if (inQuotes) {
              if (multi) {
                  // continuing a quoted section, re-append newline
                  sb.append("\n");
                  pending = sb.toString();
                  sb = null; // this partial content is not to be added to field list yet
              } else {
                  throw new IOException("Un-terminated quoted field at end of CSV line");
              }
          }
          if (sb != null) {
              tokensOnThisLine.add(sb.toString());
          }
          return tokensOnThisLine.toArray(new String[tokensOnThisLine.size()]);
  
      }