code: private boolean readExternalId(boolean requireSystemName, boolean assignFields) throws IOException, KriptonRuntimeException {
  		skip();
  		int c = peekCharacter();
  
  		if (c == 'S') {
  			read(SYSTEM);
  		} else if (c == 'P') {
  			read(PUBLIC);
  			skip();
  			if (assignFields) {
  				publicId = readQuotedId(true);
  			} else {
  				readQuotedId(false);
  			}
  		} else {
  			return false;
  		}
  
  		skip();
  
  		if (!requireSystemName) {
  			int delimiter = peekCharacter();
  			if (delimiter != '"' && delimiter != '\'') {
  				return true; // no system name!
  			}
  		}
  
  		if (assignFields) {
  			systemId = readQuotedId(true);
  		} else {
  			readQuotedId(false);
  		}
  		return true;
  	}
docs: Reads an external ID of one of these two forms: SYSTEM "quoted system
  name" PUBLIC "quoted public id" "quoted system name"
  
  If the system name is not required, this also supports lone public IDs of
  this form: PUBLIC "quoted public id"
  
  Returns true if any ID was read.
  
  @param requireSystemName the require system name
  @param assignFields the assign fields
  @return true, if successful
  @throws IOException Signals that an I/O exception has occurred.
  @throws KriptonRuntimeException the kripton runtime exception