public int readVInt()

in lucene-directory-v2/src/main/java/jetbrains/exodus/lucene2/XodusDirectory.java [1054:1124]


        public int readVInt() throws IOException {
            var pageOffset = (int) position & (pageSize - 1);
            var pageAddress = fileAddress + position - pageOffset;


            long remaining = Math.min(end - position, pageSize - pageOffset);

            int positionOffset = 0;
            if (5 <= remaining) {
                readPageIfNeeded(pageAddress);
                try {
                    pageOffset = (int) position & (pageSize - 1);
                    remaining = Math.min(end - position, pageSize - pageOffset);
                    if (remaining < 5) {
                        return super.readVInt();
                    }

                    byte b = page[pageOffset];
                    positionOffset++;

                    if (b >= 0) {
                        return b;
                    }

                    pageOffset++;
                    int i = b & 0x7F;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7F) << 7;
                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7F) << 14;

                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    i |= (b & 0x7F) << 21;
                    if (b >= 0) {
                        return i;
                    }

                    pageOffset++;
                    b = page[pageOffset];
                    positionOffset++;

                    // Warning: the next ands use 0x0F / 0xF0 - beware copy/paste errors:
                    i |= (b & 0x0F) << 28;
                    if ((b & 0xF0) == 0) {
                        return i;
                    }
                } finally {
                    movePosition(positionOffset);
                }

                throw new IOException("Invalid vInt detected (too many bits)");
            } else {
                return super.readVInt();
            }
        }