class FixTagParser {

    public boolean parse(final byte[] message, final int offset, final int length, final boolean throwExceptionOnParseFailure)
    {
        fixTagHandler.messageStart();

        int tagStart = offset;
        int equalsIndex = -1;

        for (int i = 0; i < length; i++)
        {
            int index = i + offset;
            if (ASCII_EQUALS == message[index])
            {
                equalsIndex = index;
            }

            if (containsLineSeparator(message[index]))
            {
                if (-1 != equalsIndex)
                {
                    if (!ByteUtil.isInteger(message, tagStart, equalsIndex - tagStart))
                    {
                        if (throwExceptionOnParseFailure)
                        {
                            raiseException("Invalid tag id", message, offset, length, tagStart, equalsIndex);
                        }
                        return false;
                    }

                    int tagIdentity = ByteUtil.readIntFromAscii(message, tagStart, equalsIndex - tagStart);

                    final int tagValueOffset = equalsIndex + 1;
                    final int tagValueLength = index - tagValueOffset;

                    fixTagHandler.onTag(tagIdentity, message, tagValueOffset, tagValueLength);

                    if (fixTagHandler.isFinished())
                    {
                        break;
                    }
                }

                tagStart = index + 1;
                equalsIndex = -1;
            }
        }

        fixTagHandler.messageEnd();

        return true;
    }

    public  FixTagParser(final FixTagHandler fixTagHandler);
    public  FixTagParser(final FixTagHandler fixTagHandler, final byte[] lineSeparators);

}