docs: void finishScanString(boolean is_in_expression) throws IOException
      {
          assert isIncomplete;
          assert inQuotedContent;
  
          for (;;)
          {
              int c = this.read();
              if (c == -1) {
                  throw new UnexpectedEofException();
              }
              if (c == endquote) break;  // endquote == -1 during long strings
              if (c == '\\') {
                  c = readEscapedCharacter(this.in, false /*not clob*/);
                  if (c != EMPTY_ESCAPE_SEQUENCE) {
                      value.appendCodePoint(c);
                  }
              }
              else if (c == '\'' && isLongString) {
                  // This happens while handling triple-quote field names
                  if (twoMoreSingleQuotes()) {
                      // At the end of a long string.  Look for another one.
                      inQuotedContent = false;
                      c = readIgnoreWhitespace();
  
                      if (c == '\'' && twoMoreSingleQuotes()) {
                          // Yep, another triple-quote.  We've consumed all three
                          // so just keep reading.
                          inQuotedContent = true;
                      }
                      else {
                          // Something else, we are done.
                          unread(c);
                          break;
                      }
                  }
                  else {
                      // Still inside the long string
                      value.append((char)c);
                  }
              }
              else if (!isLongString && (c == '\n')) {
                  throw new IonException("unexpected line terminator encountered in quoted string");
              }
              else {
                  value.append((char)c);
              }
          }
          return;
      }