bool
internalizeOneObjectFile(objectFileListType *objectFile)
{
	FILE		*objectFildes;
	int		 magic;
	int		 mode;
	addressType	 startAddress;
	addressType	 endAddress;

	currentFileName = objectFile->name;
	if ((objectFildes = fopen(objectFile->name, "r")) == NULL) {
		error(CANT_OPEN_OBJECT_FILE_ERROR, objectFile->name);
		perror("Unix says");
		return(FALSE);
	}
	if (verbose)
		printf("internalizing %s:\n", objectFile->name);
	if ((magic = readWord(objectFildes, objectFile->name)) != 0xFFFF) {
		error(BAD_OBJECT_FILE_ERROR, objectFile->name);
		return(FALSE);
	}
	mode = MODE_ABSOLUTE;
	for (;;) {
		startAddress = readWord(objectFildes, objectFile->name);
		if (startAddress == 0xFFFF) {
			if (mode == MODE_ABSOLUTE) {
				mode = MODE_RELOCATABLE;
				continue;
			} else {
				break;
			}
		}
		endAddress = readWord(objectFildes, objectFile->name);
		readCode(startAddress, endAddress, mode, objectFile,
			objectFildes);
	}
	readReservations(objectFile, objectFildes);
	readReferences(objectFile, objectFildes);
	readSymbols(objectFile, objectFildes);
	readExpressions(objectFile, objectFildes);
	readFunctions(objectFile, objectFildes);
	instantiateExpressionAndSymbolPointers(objectFile);
	if (readExpressionEntryPoint) {
		pc = entryPointExpression;
		putSymbolPointersIntoExpression();
		readExpressionEntryPoint = FALSE;
		haveExpressionEntryPoint = TRUE;
	}
	qsort(objectFile->symbolTable, objectFile->symbolCount,
		sizeof(symbolType *), compareSymbolValues);
	fclose(objectFildes);
	return(TRUE);
}
XmlPullParser::Event BindingXmlPullParser::next() {
    // Clear old state in preparation for the next event.
    mOverride = false;
    mAttributes.clear();

    while (true) {
        Event event = mParser->next();
        if (event == Event::kStartElement) {
            if (mParser->getElementNamespace().empty() &&
                    mParser->getElementName() == kVariableTagName) {
                // This is a variable tag. Record data from it, and
                // then discard the entire element.
                if (!readVariableDeclaration()) {
                    // mLastError is set, so getEvent will return kBadDocument.
                    return getEvent();
                }
                continue;
            } else {
                // Check for expressions of the form @{} in attribute text.
                const auto endAttrIter = mParser->endAttributes();
                for (auto attr = mParser->beginAttributes(); attr != endAttrIter; ++attr) {
                    StringPiece16 value = util::trimWhitespace(attr->value);
                    if (util::stringStartsWith<char16_t>(value, u"@{") &&
                            util::stringEndsWith<char16_t>(value, u"}")) {
                        if (!readExpressions()) {
                            return getEvent();
                        }
                        break;
                    }
                }
            }
        } else if (event == Event::kStartNamespace || event == Event::kEndNamespace) {
            if (mParser->getNamespaceUri() == kBindingNamespaceUri) {
                // Skip binding namespace tags.
                continue;
            }
        }
        return event;
    }
    return Event::kBadDocument;
}