+++ /dev/null
-/*
- * Copyright (c) 2003-2005 The BISON Project
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 2 as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-package peersim.util;
-
-import java.math.*;
-import java.util.*;
-
-import org.lsmp.djep.groupJep.*;
-
-import peersim.config.*;
-
-/**
- * This utility class can be used to parse range expressions. In particular,
- * it is used by {@link peersim.rangesim.RangeSimulator} to express ranges for
- * configuration properties.
- * <p>
- * The language for range expression is the following:
- * <pre>
- * [rangelist] := [range] | [range],[rangelist]
- * [range] := value | min:max | min:max|step |
- * min:max*|step
- * </pre>
- * where <tt>value</tt>, <tt>min</tt>, <tt>max</tt> and <tt>step</tt>
- * are numeric atoms that defines ranges.
- * <p>
- * For example, the following range expression:
- * <pre>
- * 5,9:11,13:17|2,32:128*|2
- * </pre>
- * corresponds to 5 (single value), 9-10-11 (range between 9 and 11,
- * default increment 1), 13-15-17 (range between 13 and 17, specified
- * step 2, 32-64-128 (range between 32 and 128, multiplicative step 2).
- *
- * @author Alberto Montresor
- * @version $Revision: 1.8 $
- */
-public class StringListParser
-{
-
-/** Disable instance construction */
-private StringListParser() { }
-
-/**
- * Parse the specified string.
- *
- * @param s the string to be parsed
- * @return an array of strings containing all the values defined by the
- * range string
- */
-public static String[] parseList(String s)
-{
- ArrayList<String> list = new ArrayList<String>();
- String[] tokens = s.split(",");
- for (int i = 0; i < tokens.length; i++) {
- parseItem(list, tokens[i]);
- }
- return list.toArray(new String[list.size()]);
-}
-
-private static void parseItem(List<String> list, String item)
-{
- String[] array = item.split(":");
- if (array.length == 1) {
- parseSingleItem(list, item);
- } else if (array.length == 2) {
- parseRangeItem(list, array[0], array[1]);
- } else {
- throw new IllegalArgumentException("Element " + item
- + "should be formatted as <start>:<stop> or <value>");
- }
-}
-
-private static void parseSingleItem(List<String> list, String item)
-{
- list.add(item);
-}
-
-private static void parseRangeItem(List<String> list, String start, String stop)
-{
- Number vstart;
- Number vstop;
- Number vinc;
- boolean sum;
-
- GroupJep jep = new GroupJep(new Operators());
- jep.parseExpression(start);
- vstart = (Number) jep.getValueAsObject();
- int pos = stop.indexOf("|*");
- if (pos >= 0) {
- // The string contains a multiplicative factor
- jep.parseExpression(stop.substring(0, pos));
- vstop = (Number) jep.getValueAsObject();
- jep.parseExpression(stop.substring(pos + 2));
- vinc = (Number) jep.getValueAsObject();
- sum = false;
- } else {
- pos = stop.indexOf("|");
- // The string contains an additive factor
- if (pos >= 0) {
- // The string contains just the final value
- jep.parseExpression(stop.substring(0, pos));
- vstop = (Number) jep.getValueAsObject();
- jep.parseExpression(stop.substring(pos + 1));
- vinc = (Number) jep.getValueAsObject();
- sum = true;
- } else {
- jep.parseExpression(stop);
- vstop = (Number) jep.getValueAsObject();
- vinc = BigInteger.ONE;
- sum = true;
- }
- }
-
- if (vstart instanceof BigInteger && vstart instanceof BigInteger && vinc instanceof BigInteger) {
- long vvstart = vstart.longValue();
- long vvstop = vstop.longValue();
- long vvinc = vinc.longValue();
- if (sum) {
- for (long i = vvstart; i <= vvstop; i += vvinc)
- list.add("" + i);
- } else {
- for (long i = vvstart; i <= vvstop; i *= vvinc)
- list.add("" + i);
- }
- } else {
- double vvstart = vstart.doubleValue();
- double vvstop = vstop.doubleValue();
- double vvinc = vinc.doubleValue();
- if (sum) {
- for (double i = vvstart; i <= vvstop; i += vvinc)
- list.add("" + i);
- } else {
- for (double i = vvstart; i <= vvstop; i *= vvinc)
- list.add("" + i);
- }
- }
-}
-
-/*
-public static void main(String[] args)
-{
- String[] ret = parseList(args[0]);
- for (int i = 0; i < ret.length; i++)
- System.out.print(ret[i] + " ");
- System.out.println("");
-}
-*/
-}