passes the flow down rule
[IRC.git] / Robust / src / ClassLibrary / SSJava / String.java
index ddacb966d41c17cdedf9425d5bf1087f645a4044..35c150539b66dd4bf288486622f53dd51372dab0 100644 (file)
@@ -1,9 +1,19 @@
 import Vector;
 
+@LATTICE("V<C, V<O,V*")
+@METHODDEFAULT("O<V,V<C,C<IN,C*,THISLOC=O,RETURNLOC=O")
 public class String {
+
+  @LOC("V")
   char value[];
+
+  @LOC("C")
   int count;
+
+  @LOC("O")
   int offset;
+
+  @LOC("V")
   private int cachedHashcode;
 
   private String() {
@@ -16,76 +26,75 @@ public class String {
   }
 
   public String(char str[]) {
-    char charstr[]=new char[str.length];
-    for(int i=0; i<str.length; i++)
-      charstr[i]=str[i];
-    this.value=charstr;
-    this.count=str.length;
-    this.offset=0;
+    char charstr[] = new char[str.length];
+    for (int i = 0; i < str.length; i++)
+      charstr[i] = str[i];
+    this.value = charstr;
+    this.count = str.length;
+    this.offset = 0;
   }
 
   public String(byte str[]) {
-    char charstr[]=new char[str.length];
-    for(int i=0; i<str.length; i++)
-      charstr[i]=(char)str[i];
-    this.value=charstr;
-    this.count=str.length;
-    this.offset=0;
+    char charstr[] = new char[str.length];
+    for (int i = 0; i < str.length; i++)
+      charstr[i] = (char) str[i];
+    this.value = charstr;
+    this.count = str.length;
+    this.offset = 0;
   }
 
   public String(byte str[], int offset, int length) {
-    if (length>(str.length-offset))
-      length=str.length-offset;
-    char charstr[]=new char[length];
-    for(int i=0; i<length; i++)
-      charstr[i]=(char)str[i+offset];
-    this.value=charstr;
-    this.count=length;
-    this.offset=0;
+    if (length > (str.length - offset))
+      length = str.length - offset;
+    char charstr[] = new char[length];
+    for (int i = 0; i < length; i++)
+      charstr[i] = (char) str[i + offset];
+    this.value = charstr;
+    this.count = length;
+    this.offset = 0;
   }
 
   public String(byte str[], String encoding) {
     int length = this.count;
-    if (length>(str.length))
-      length=str.length;
-    char charstr[]=new char[length];
-    for(int i=0; i<length; i++)
-      charstr[i]=(char)str[i];
-    this.value=charstr;
-    this.count=length;
-    this.offset=0;
+    if (length > (str.length))
+      length = str.length;
+    char charstr[] = new char[length];
+    for (int i = 0; i < length; i++)
+      charstr[i] = (char) str[i];
+    this.value = charstr;
+    this.count = length;
+    this.offset = 0;
   }
 
   public String(char str[], int offset, int length) {
-    if (length>(str.length-offset))
-      length=str.length-offset;
-    char charstr[]=new char[length];
-    for(int i=0; i<length; i++)
-      charstr[i]=str[i+offset];
-    this.value=charstr;
-    this.count=length;
-    this.offset=0;
+    if (length > (str.length - offset))
+      length = str.length - offset;
+    char charstr[] = new char[length];
+    for (int i = 0; i < length; i++)
+      charstr[i] = str[i + offset];
+    this.value = charstr;
+    this.count = length;
+    this.offset = 0;
   }
 
   public String(String str) {
-    this.value=str.value;
-    this.count=str.count;
-    this.offset=str.offset;
+    this.value = str.value;
+    this.count = str.count;
+    this.offset = str.offset;
   }
 
   public String(StringBuffer strbuf) {
-    value=new char[strbuf.length()];
-    count=strbuf.length();
-    offset=0;
-    for(int i=0; i<count; i++)
-      value[i]=strbuf.value[i];
+    value = new char[strbuf.length()];
+    count = strbuf.length();
+    offset = 0;
+    for (int i = 0; i < count; i++)
+      value[i] = strbuf.value[i];
   }
 
   public boolean endsWith(String suffix) {
     return regionMatches(count - suffix.count, suffix, 0, suffix.count);
   }
 
-
   public String substring(int beginIndex) {
     return substring(beginIndex, this.count);
   }
@@ -95,14 +104,14 @@ public class String {
   }
 
   public String substring(int beginIndex, int endIndex) {
-    String str=new String();
-    if (beginIndex>this.count||endIndex>this.count||beginIndex>endIndex) {
+    String str = new String();
+    if (beginIndex > this.count || endIndex > this.count || beginIndex > endIndex) {
       // FIXME
-      System.printString("Index error: "+beginIndex+" "+endIndex+" "+count+"\n"+this);
+      System.printString("Index error: " + beginIndex + " " + endIndex + " " + count + "\n" + this);
     }
-    str.value=this.value;
-    str.count=endIndex-beginIndex;
-    str.offset=this.offset+beginIndex;
+    str.value = this.value;
+    str.count = endIndex - beginIndex;
+    str.offset = this.offset + beginIndex;
     return str;
   }
 
@@ -115,69 +124,69 @@ public class String {
   }
 
   public int lastIndexOf(char ch) {
-    return this.lastindexOf((int)ch, count - 1);
+    return this.lastindexOf((int) ch, count - 1);
   }
 
   public static String concat2(String s1, String s2) {
-    if (s1==null)
+    if (s1 == null)
       return "null".concat(s2);
     else
       return s1.concat(s2);
   }
 
   public String concat(String str) {
-    String newstr=new String();
-    newstr.count=this.count+str.count;
-    char charstr[]=new char[newstr.count];
-    newstr.value=charstr;
-    newstr.offset=0;
-    for(int i=0; i<count; i++) {
-      charstr[i]=value[i+offset];
+    String newstr = new String();
+    newstr.count = this.count + str.count;
+    char charstr[] = new char[newstr.count];
+    newstr.offset = 0;
+    for (int i = 0; i < count; i++) {
+      charstr[i] = value[i + offset];
     }
-    for(int i=0; i<str.count; i++) {
-      charstr[i+count]=str.value[i+str.offset];
+    for (int i = 0; i < str.count; i++) {
+      charstr[i + count] = str.value[i + str.offset];
     }
+    newstr.value = charstr;
     return newstr;
   }
 
   public int lastindexOf(int ch, int fromIndex) {
-    for(int i=fromIndex; i>0; i--)
-      if (this.charAt(i)==ch)
+    for (int i = fromIndex; i > 0; i--)
+      if (this.charAt(i) == ch)
         return i;
     return -1;
   }
 
   public String replace(char oldch, char newch) {
-    char[] buffer=new char[count];
-    for(int i=0; i<count; i++) {
-      char x=charAt(i);
-      if (x==oldch)
-        x=newch;
-      buffer[i]=x;
+    char[] buffer = new char[count];
+    for (int i = 0; i < count; i++) {
+      char x = charAt(i);
+      if (x == oldch)
+        x = newch;
+      buffer[i] = x;
     }
     return new String(buffer);
   }
 
   public String toUpperCase() {
-    char[] buffer=new char[count];
-    for(int i=0; i<count; i++) {
-      char x=charAt(i);
-      if (x>='a'&&x<='z') {
-        x=(char) ((x-'a')+'A');
+    char[] buffer = new char[count];
+    for (int i = 0; i < count; i++) {
+      char x = charAt(i);
+      if (x >= 'a' && x <= 'z') {
+        x = (char) ((x - 'a') + 'A');
       }
-      buffer[i]=x;
+      buffer[i] = x;
     }
     return new String(buffer);
   }
 
   public String toLowerCase() {
-    char[] buffer=new char[count];
-    for(int i=0; i<count; i++) {
-      char x=charAt(i);
-      if (x>='A'&&x<='Z') {
-        x=(char) ((x-'A')+'a');
+    char[] buffer = new char[count];
+    for (int i = 0; i < count; i++) {
+      char x = charAt(i);
+      if (x >= 'A' && x <= 'Z') {
+        x = (char) ((x - 'A') + 'a');
       }
-      buffer[i]=x;
+      buffer[i] = x;
     }
     return new String(buffer);
   }
@@ -187,8 +196,8 @@ public class String {
   }
 
   public int indexOf(int ch, int fromIndex) {
-    for(int i=fromIndex; i<count; i++)
-      if (this.charAt(i)==ch)
+    for (int i = fromIndex; i < count; i++)
+      if (this.charAt(i) == ch)
         return i;
     return -1;
   }
@@ -198,9 +207,9 @@ public class String {
   }
 
   public int indexOf(String str, int fromIndex) {
-    if (fromIndex<0)
-      fromIndex=0;
-    for(int i=fromIndex; i<=(count-str.count); i++)
+    if (fromIndex < 0)
+      fromIndex = 0;
+    for (int i = fromIndex; i <= (count - str.count); i++)
       if (regionMatches(i, str, 0, str.count))
         return i;
     return -1;
@@ -212,10 +221,10 @@ public class String {
   }
 
   public int lastIndexOf(String str, int fromIndex) {
-    int k=count-str.count;
-    if (k>fromIndex)
-      k=fromIndex;
-    for(; k>=0; k--) {
+    int k = count - str.count;
+    if (k > fromIndex)
+      k = fromIndex;
+    for (; k >= 0; k--) {
       if (regionMatches(k, str, 0, str.count))
         return k;
     }
@@ -223,7 +232,7 @@ public class String {
   }
 
   public int lastIndexOf(String str) {
-    return lastIndexOf(str, count-str.count);
+    return lastIndexOf(str, count - str.count);
   }
 
   public boolean startsWith(String str) {
@@ -235,26 +244,25 @@ public class String {
   }
 
   public boolean regionMatches(int toffset, String other, int ooffset, int len) {
-    if (toffset<0 || ooffset <0 || (toffset+len)>count || (ooffset+len)>other.count)
+    if (toffset < 0 || ooffset < 0 || (toffset + len) > count || (ooffset + len) > other.count)
       return false;
-    for(int i=0; i<len; i++)
-      if (other.value[i+other.offset+ooffset]!=
-          this.value[i+this.offset+toffset])
+    for (int i = 0; i < len; i++)
+      if (other.value[i + other.offset + ooffset] != this.value[i + this.offset + toffset])
         return false;
     return true;
   }
 
   public char[] toCharArray() {
-    char str[]=new char[count];
-    for(int i=0; i<count; i++)
-      str[i]=value[i+offset];
+    char str[] = new char[count];
+    for (int i = 0; i < count; i++)
+      str[i] = value[i + offset];
     return str;
   }
 
   public byte[] getBytes() {
-    byte str[]=new byte[count];
-    for(int i=0; i<count; i++)
-      str[i]=(byte)value[i+offset];
+    byte str[] = new byte[count];
+    for (int i = 0; i < count; i++)
+      str[i] = (byte) value[i + offset];
     return str;
   }
 
@@ -263,15 +271,15 @@ public class String {
   }
 
   public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
-    if((srcBegin < 0) || (srcEnd > count) || (srcBegin > srcEnd)) {
+    if ((srcBegin < 0) || (srcEnd > count) || (srcBegin > srcEnd)) {
       // FIXME
-      System.printString("Index error: "+srcBegin+" "+srcEnd+" "+count+"\n"+this);
+      System.printString("Index error: " + srcBegin + " " + srcEnd + " " + count + "\n" + this);
       System.exit(-1);
     }
     int len = srcEnd - srcBegin;
     int j = dstBegin;
-    for(int i=srcBegin; i<srcEnd; i++)
-      dst[j++]=value[i+offset];
+    for (int i = srcBegin; i < srcEnd; i++)
+      dst[j++] = value[i + offset];
     return;
   }
 
@@ -280,154 +288,162 @@ public class String {
   }
 
   public char charAt(int i) {
-    return value[i+offset];
+    return value[i + offset];
   }
 
   public String toString() {
     return this;
   }
 
-  public static String valueOf(Object o) {
-    if (o==null)
+  @LATTICE("OUT<THIS,THIS<IN,THISLOC=THIS,RETURNLOC=OUT,GLOBALLOC=THIS")
+  public static String valueOf(@LOC("THIS") Object o) {
+    if (o == null)
       return "null";
     else
       return o.toString();
   }
 
-  public static String valueOf(boolean b) {
+  public static String valueOf(@LOC("IN") boolean b) {
     if (b)
       return new String("true");
     else
       return new String("false");
   }
 
-  public static String valueOf(char c) {
-    char ar[]=new char[1];
-    ar[0]=c;
+  public static String valueOf(@LOC("IN") char c) {
+    @LOC("C") char ar[] = new char[1];
+    ar[0] = c;
     return new String(ar);
   }
 
-  public static String valueOf(int x) {
-    int length=0;
-    int tmp;
-    if (x<0)
-      tmp=-x;
+  public static String valueOf(@LOC("C") int x) {
+    @LOC("C") int length = 0;
+    @LOC("C") int tmp;
+    if (x < 0)
+      tmp = -x;
     else
-      tmp=x;
+      tmp = x;
+    TERMINATE:
     do {
-      tmp=tmp/10;
-      length=length+1;
-    } while(tmp!=0);
+      tmp = tmp / 10;
+      length = length + 1;
+    } while (tmp != 0);
 
-    char chararray[];
-    if (x<0)
-      chararray=new char[length+1];
+    @LOC("C") char chararray[];
+    if (x < 0)
+      chararray = new char[length + 1];
     else
-      chararray=new char[length];
-    int voffset;
-    if (x<0) {
-      chararray[0]='-';
-      voffset=1;
-      x=-x;
+      chararray = new char[length];
+    @LOC("C") int voffset;
+    if (x < 0) {
+      chararray[0] = '-';
+      voffset = 1;
+      x = -x;
     } else
-      voffset=0;
+      voffset = 0;
 
+    TERMINATE:
     do {
-      chararray[--length+voffset]=(char)(x%10+'0');
-      x=x/10;
-    } while (length!=0);
+      chararray[--length + voffset] = (char) (x % 10 + '0');
+      x = x / 10;
+    } while (length != 0);
     return new String(chararray);
   }
 
-  public static String valueOf(double val) {
-    char[] chararray=new char[20];
-    String s=new String();
-    s.offset=0;
-    s.count=convertdoubletochar(val, chararray);
-    s.value=chararray;
+  public static String valueOf(@LOC("IN") double val) {
+    @LOC("C") char[] chararray = new char[20];
+    @LOC("V")  String s = new String();
+    s.offset = 0;
+    s.count = convertdoubletochar(val, chararray);
+    s.value = chararray;
     return s;
   }
 
-  public static native int convertdoubletochar(double val, char [] chararray);
+  public static native int convertdoubletochar(double val, char[] chararray);
 
-  public static String valueOf(long x) {
-    int length=0;
-    long tmp;
-    if (x<0)
-      tmp=-x;
+  public static String valueOf(@LOC("C") long x) {
+    @LOC("C") int length = 0;
+    @LOC("C") long tmp;
+    if (x < 0)
+      tmp = -x;
     else
-      tmp=x;
+      tmp = x;
+    
+    TERMINATE:
     do {
-      tmp=tmp/10;
-      length=length+1;
-    } while(tmp!=0);
+      tmp = tmp / 10;
+      length = length + 1;
+    } while (tmp != 0);
 
-    char chararray[];
-    if (x<0)
-      chararray=new char[length+1];
+    @LOC("C") char chararray[];
+    if (x < 0)
+      chararray = new char[length + 1];
     else
-      chararray=new char[length];
-    int voffset;
-    if (x<0) {
-      chararray[0]='-';
-      voffset=1;
-      x=-x;
+      chararray = new char[length];
+    @LOC("C") int voffset;
+    if (x < 0) {
+      chararray[0] = '-';
+      voffset = 1;
+      x = -x;
     } else
-      voffset=0;
+      voffset = 0;
 
+    TERMINATE:
     do {
-      chararray[--length+voffset]=(char)(x%10+'0');
-      x=x/10;
-    } while (length!=0);
+      chararray[--length + voffset] = (char) (x % 10 + '0');
+      x = x / 10;
+    } while (length != 0);
     return new String(chararray);
   }
 
   public int compareTo(String s) {
-    int smallerlength=count<s.count?count:s.count;
+    int smallerlength = count < s.count ? count : s.count;
 
-    for( int i = 0; i < smallerlength; i++ ) {
+    for (int i = 0; i < smallerlength; i++) {
       int valDiff = this.charAt(i) - s.charAt(i);
-      if( valDiff != 0 ) {
+      if (valDiff != 0) {
         return valDiff;
       }
     }
-    return count-s.count;
+    return count - s.count;
   }
 
+  @LATTICE("OUT<THIS,THIS<C,C*,THISLOC=THIS")
+  @RETURNLOC("OUT")
   public int hashCode() {
-    if (cachedHashcode!=0)
+    if (cachedHashcode != 0)
       return cachedHashcode;
-    int hashcode=0;
-    for(int i=0; i<count; i++)
-      hashcode=hashcode*31+value[i+offset];
-    cachedHashcode=hashcode;
+    @LOC("THIS,String.V") int hashcode = 0;
+    for (@LOC("THIS,String.V") int i = 0; i < count; i++)
+      hashcode = hashcode * 31 + value[i + offset];
+    cachedHashcode = hashcode;
     return hashcode;
   }
 
   public boolean equals(Object o) {
-    if (o.getType()!=getType())
+    if (o.getType() != getType())
       return false;
-    String s=(String)o;
-    if (s.count!=count)
+    String s = (String) o;
+    if (s.count != count)
       return false;
-    for(int i=0; i<count; i++) {
-      if (s.value[i+s.offset]!=value[i+offset])
+    for (int i = 0; i < count; i++) {
+      if (s.value[i + s.offset] != value[i + offset])
         return false;
     }
     return true;
   }
 
   public boolean equalsIgnoreCase(String s) {
-    if (s.count!=count)
+    if (s.count != count)
       return false;
-    for(int i=0; i<count; i++) {
-      char l=s.value[i+s.offset];
-      char r=value[i+offset];
-      if (l>='a'&&l<='z')
-        l=(char)((l-'a')+'A');
-      if (r>='a'&&r<='z')
-        r=(char)((r-'a')+'A');
-      if (l!=r)
+    for (int i = 0; i < count; i++) {
+      char l = s.value[i + s.offset];
+      char r = value[i + offset];
+      if (l >= 'a' && l <= 'z')
+        l = (char) ((l - 'a') + 'A');
+      if (r >= 'a' && r <= 'z')
+        r = (char) ((r - 'a') + 'A');
+      if (l != r)
         return false;
     }
     return true;
@@ -436,39 +452,40 @@ public class String {
   public Vector split() {
     Vector splitted = new Vector();
     int i;
-    int cnt =0;
+    int cnt = 0;
 
     // skip first spaces
-    for(i = 0; i< count; i++) {
-      if(value[i+offset] != '\n' && value[i+offset] != '\t' && value[i+offset] != ' ')
+    for (i = 0; i < count; i++) {
+      if (value[i + offset] != '\n' && value[i + offset] != '\t' && value[i + offset] != ' ')
         break;
     }
 
-    int oldi=i;
+    int oldi = i;
 
-    while(i<count) {
-      if(value[i+offset] == '\n' || value[i+offset] == '\t' || value[i+offset] == ' ') {
-        String t=new String();
-        t.value=value;
-        t.offset=oldi;
-        t.count=i-oldi;
+    while (i < count) {
+      if (value[i + offset] == '\n' || value[i + offset] == '\t' || value[i + offset] == ' ') {
+        String t = new String();
+        t.value = value;
+        t.offset = oldi;
+        t.count = i - oldi;
         splitted.addElement(t);
 
         // skip extra spaces
-        while( i < count && ( value[i+offset] == '\n' || value[i+offset] == '\t' || value[i+offset] == ' ')) {
+        while (i < count
+            && (value[i + offset] == '\n' || value[i + offset] == '\t' || value[i + offset] == ' ')) {
           i++;
         }
-        oldi=i;
+        oldi = i;
       } else {
         i++;
       }
     }
 
-    if(i!=oldi) {
-      String t=new String();
-      t.value=value;
-      t.offset=oldi;
-      t.count=i-oldi;
+    if (i != oldi) {
+      String t = new String();
+      t.value = value;
+      t.offset = oldi;
+      t.count = i - oldi;
       splitted.addElement(t);
     }
 
@@ -476,18 +493,18 @@ public class String {
   }
 
   public boolean contains(String str) {
-    int i,j;
+    int i, j;
     char[] strChar = str.toCharArray();
     int cnt;
 
-    for(i = 0; i < count; i++) {
-      if(value[i] == strChar[0]) {
-        cnt=0;
-        for(j=0; j < str.length() && i+j < count; j++) {
-          if(value[i+j] == strChar[j])
+    for (i = 0; i < count; i++) {
+      if (value[i] == strChar[0]) {
+        cnt = 0;
+        for (j = 0; j < str.length() && i + j < count; j++) {
+          if (value[i + j] == strChar[j])
             cnt++;
         }
-        if(cnt == str.length())
+        if (cnt == str.length())
           return true;
       }
     }
@@ -499,8 +516,8 @@ public class String {
   public String trim() {
     int len = count;
     int st = 0;
-    int off = offset;      /* avoid getfield opcode */
-    char[] val = value;    /* avoid getfield opcode */
+    int off = offset; /* avoid getfield opcode */
+    char[] val = value; /* avoid getfield opcode */
 
     while ((st < len) && (val[off + st] <= ' ')) {
       st++;
@@ -508,7 +525,7 @@ public class String {
     while ((st < len) && (val[off + len - 1] <= ' ')) {
       len--;
     }
-    return ((st > 0) || (len < count))?substring(st, len):this;
+    return ((st > 0) || (len < count)) ? substring(st, len) : this;
   }
 
   public boolean matches(String regex) {