org.apache.commons.compress.harmony.unpack200.SegmentUtils Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of commons-compress Show documentation
Show all versions of commons-compress Show documentation
Apache Commons Compress software defines an API for working with
compression and archive formats. These include: bzip2, gzip, pack200,
lzma, xz, Snappy, traditional Unix Compress, DEFLATE, DEFLATE64, LZ4,
Brotli, Zstandard and ar, cpio, jar, tar, zip, dump, 7z, arj.
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.compress.harmony.unpack200;
/**
* Utility class for unpack200
*/
public final class SegmentUtils {
public static int countArgs(final String descriptor) {
return countArgs(descriptor, 1);
}
/**
* Count the number of arguments in the descriptor. Each long or double counts as widthOfLongsAndDoubles; all other
* arguments count as 1.
*
* @param descriptor String for which arguments are counted
* @param widthOfLongsAndDoubles int increment to apply for longs doubles. This is typically 1 when counting
* arguments alone, or 2 when counting arguments for invokeinterface.
* @return integer count
*/
protected static int countArgs(final String descriptor, final int widthOfLongsAndDoubles) {
final int bra = descriptor.indexOf('(');
final int ket = descriptor.indexOf(')');
if (bra == -1 || ket == -1 || ket < bra) {
throw new IllegalArgumentException("No arguments");
}
boolean inType = false;
boolean consumingNextType = false;
int count = 0;
for (int i = bra + 1; i < ket; i++) {
final char charAt = descriptor.charAt(i);
if (inType && charAt == ';') {
inType = false;
consumingNextType = false;
} else if (!inType && charAt == 'L') {
inType = true;
count++;
} else if (charAt == '[') {
consumingNextType = true;
} else if (inType) {
// NOP
} else if (consumingNextType) {
count++;
consumingNextType = false;
} else if (charAt == 'D' || charAt == 'J') {
count += widthOfLongsAndDoubles;
} else {
count++;
}
}
return count;
}
public static int countBit16(final int[] flags) {
int count = 0;
for (final int flag : flags) {
if ((flag & (1 << 16)) != 0) {
count++;
}
}
return count;
}
public static int countBit16(final long[] flags) {
int count = 0;
for (final long flag : flags) {
if ((flag & (1 << 16)) != 0) {
count++;
}
}
return count;
}
public static int countBit16(final long[][] flags) {
int count = 0;
for (final long[] flag : flags) {
for (final long element : flag) {
if ((element & (1 << 16)) != 0) {
count++;
}
}
}
return count;
}
public static int countInvokeInterfaceArgs(final String descriptor) {
return countArgs(descriptor, 2);
}
public static int countMatches(final long[] flags, final IMatcher matcher) {
int count = 0;
for (final long flag : flags) {
if (matcher.matches(flag)) {
count++;
}
}
return count;
}
public static int countMatches(final long[][] flags, final IMatcher matcher) {
int count = 0;
for (final long[] flag : flags) {
count += countMatches(flag, matcher);
}
return count;
}
}