    001    /* Copyright 2000, 2001, Compaq Computer Corporation */
    002
    003    package javafe.filespace;
    004
    005
    006    /** Misc. utility functions on Strings */
    007
    008    public final class StringUtil {
    009
    010        /** Remove leading and trailing whitespace (just spaces for now): */
    011        //@ requires s != null;
    012        public static String trim_whitespace(String s) {
    013            while (s.length()>0 && s.charAt(0)==' ')
    014                s = s.substring(1,s.length());
    015
    016            while (s.length()>0 && s.charAt(s.length()-1)==' ')
    017                s = s.substring(0,s.length()-1);
    018
    019            return s;
    020        }
    021
    022
    023        /** Count the number of times a given character occurs in a String: */
    024        //@ requires s != null;
    025        //@ ensures \result>=0;
    026        public static int countChar(String s, char c) {
    027            int count = 0;
    028            int start = 0;
    029
    030            while ((start = s.indexOf(c, start)+1) != 0)
    031                count++;
    032
    033            return count;
    034        }
    035
    036
    037        /**
    038         * Print an array of Strings on System.out, one string per
    039         * line.  Prints "<null>" if list is null.
    040         */
    041        //@ requires list != null;
    042        public static void printList(String[] list) {
    043            if (list == null) {
    044                System.out.println("<null>");
    045                return;
    046            }
    047
    048            for (int i=0; i<list.length; i++)
    049                System.out.println(list[i]);
    050        }
    051
    052
    053        /**
    054         * Parse a (possibly empty) separator-separated list into an array of
    055         *  Strings:
    056         */
    057        //@ ensures \nonnullelements(\result);
    058        public static String[] parseList(/*@ non_null @*/ String s, char separator) {
    059            // Handle empty list case:
    060            if (s.equals(""))
    061                return new String[0];
    062
    063            int items = countChar(s, separator)+1;
    064            String[] list = new String[items];
    065
    066            int start = 0;
    067            //@ loop_invariant (\forall int j; 0<=j && j<i ==> list[j] != null);
    068            for (int i = 0; i < items-1 ; i++) {
    069
    070                int nextSep = s.indexOf(separator, start);
    071                //@ assume nextSep != -1;
    072                list[i] = s.substring(start, nextSep);
    073                start = nextSep + 1;
    074            }
    075
    076            list[items-1] = s.substring(start);
    077
    078            return list;
    079        }
    080
    081
    082        /** A simple test driver */
    083        //@ requires \nonnullelements(args);
    084        public static void main(String[] args) {
    085            if (args.length != 1) {
    086                System.out.println("StringUtil: usage: <cmd> <teststring>");
    087                return;
    088            }
    089            System.out.println("Testing using '" + args[0] + "':");
    090            System.out.println();
    091
    092            // Test trim_whitespace:
    093            System.out.println("Removing whitespace yields '" +
    094                    trim_whitespace(args[0])+ "'");
    095            System.out.println();
    096
    097            // Test countChar:
    098            System.out.println("# of commas occuring = " +
    099                countChar(args[0], ','));
    100            System.out.println();
    101
    102            // Test countChar:
    103            System.out.println("List elements are: ");
    104            printList(parseList(args[0], ','));
    105            System.out.println("(EOL)");
    106        }
    107    }