From: Michael Koch Date: Wed, 29 Oct 2003 16:07:59 +0000 (+0000) Subject: [multiple changes] X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8b941eec31d98619765dec95929a2a86058d5843;p=platform%2Fupstream%2Fgcc.git [multiple changes] 2003-10-29 Mark Wielaard From Guilhem Lavaux * java/text/DateFormat.java (Field): New public static inner class. * java/text/Format.java (Field): Likewise. (formatToCharacterIterator): New method. * java/text/FormatCharacterIterator.java: New file. 2003-10-29 Mark Wielaard From Guilhem Lavaux * java/util/Currency.java: New file. 2003-10-29 Michael Koch * Makefile.am (ordinary_java_source_files): Added java/text/FormatCharacterIterator.java and java/util/Currency.java. * Makefile.in: Regenerated. From-SVN: r73046 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 39affa5..778ee84 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,22 @@ +2003-10-29 Mark Wielaard + + From Guilhem Lavaux + * java/text/DateFormat.java (Field): New public static inner class. + * java/text/Format.java (Field): Likewise. + (formatToCharacterIterator): New method. + * java/text/FormatCharacterIterator.java: New file. + +2003-10-29 Mark Wielaard + + From Guilhem Lavaux + * java/util/Currency.java: New file. + +2003-10-29 Michael Koch + + * Makefile.am (ordinary_java_source_files): Added + java/text/FormatCharacterIterator.java and java/util/Currency.java. + * Makefile.in: Regenerated. + 2003-10-29 Dalibor Topic * gnu/java/beans/IntrospectionIncubator.java (addMethod): Add public diff --git a/libjava/Makefile.am b/libjava/Makefile.am index 91d1647..569babb 100644 --- a/libjava/Makefile.am +++ b/libjava/Makefile.am @@ -1942,6 +1942,7 @@ java/util/Collection.java \ java/util/Collections.java \ java/util/Comparator.java \ java/util/ConcurrentModificationException.java \ +java/util/Currency.java \ java/util/Date.java \ java/util/Dictionary.java \ java/util/EmptyStackException.java \ @@ -2580,6 +2581,7 @@ java/text/DecimalFormat.java \ java/text/DecimalFormatSymbols.java \ java/text/FieldPosition.java \ java/text/Format.java \ +java/text/FormatCharacterIterator.java \ java/text/MessageFormat.java \ java/text/NumberFormat.java \ java/text/ParseException.java \ diff --git a/libjava/Makefile.in b/libjava/Makefile.in index d730fd9c..da479ca 100644 --- a/libjava/Makefile.in +++ b/libjava/Makefile.in @@ -1664,6 +1664,7 @@ java/util/Collection.java \ java/util/Collections.java \ java/util/Comparator.java \ java/util/ConcurrentModificationException.java \ +java/util/Currency.java \ java/util/Date.java \ java/util/Dictionary.java \ java/util/EmptyStackException.java \ @@ -2297,6 +2298,7 @@ java/text/DecimalFormat.java \ java/text/DecimalFormatSymbols.java \ java/text/FieldPosition.java \ java/text/Format.java \ +java/text/FormatCharacterIterator.java \ java/text/MessageFormat.java \ java/text/NumberFormat.java \ java/text/ParseException.java \ @@ -3831,6 +3833,7 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ .deps/java/text/DateFormat.P .deps/java/text/DateFormatSymbols.P \ .deps/java/text/DecimalFormat.P .deps/java/text/DecimalFormatSymbols.P \ .deps/java/text/FieldPosition.P .deps/java/text/Format.P \ +.deps/java/text/FormatCharacterIterator.P \ .deps/java/text/MessageFormat.P .deps/java/text/NumberFormat.P \ .deps/java/text/ParseException.P .deps/java/text/ParsePosition.P \ .deps/java/text/RuleBasedCollator.P .deps/java/text/SimpleDateFormat.P \ @@ -3842,17 +3845,18 @@ DEP_FILES = .deps/$(srcdir)/$(CONVERT_DIR)/gen-from-JIS.P \ .deps/java/util/Calendar.P .deps/java/util/Collection.P \ .deps/java/util/Collections.P .deps/java/util/Comparator.P \ .deps/java/util/ConcurrentModificationException.P \ -.deps/java/util/Date.P .deps/java/util/Dictionary.P \ -.deps/java/util/EmptyStackException.P .deps/java/util/Enumeration.P \ -.deps/java/util/EventListener.P .deps/java/util/EventListenerProxy.P \ -.deps/java/util/EventObject.P .deps/java/util/GregorianCalendar.P \ -.deps/java/util/HashMap.P .deps/java/util/HashSet.P \ -.deps/java/util/Hashtable.P .deps/java/util/IdentityHashMap.P \ -.deps/java/util/Iterator.P .deps/java/util/LinkedHashMap.P \ -.deps/java/util/LinkedHashSet.P .deps/java/util/LinkedList.P \ -.deps/java/util/List.P .deps/java/util/ListIterator.P \ -.deps/java/util/ListResourceBundle.P .deps/java/util/Locale.P \ -.deps/java/util/Map.P .deps/java/util/MissingResourceException.P \ +.deps/java/util/Currency.P .deps/java/util/Date.P \ +.deps/java/util/Dictionary.P .deps/java/util/EmptyStackException.P \ +.deps/java/util/Enumeration.P .deps/java/util/EventListener.P \ +.deps/java/util/EventListenerProxy.P .deps/java/util/EventObject.P \ +.deps/java/util/GregorianCalendar.P .deps/java/util/HashMap.P \ +.deps/java/util/HashSet.P .deps/java/util/Hashtable.P \ +.deps/java/util/IdentityHashMap.P .deps/java/util/Iterator.P \ +.deps/java/util/LinkedHashMap.P .deps/java/util/LinkedHashSet.P \ +.deps/java/util/LinkedList.P .deps/java/util/List.P \ +.deps/java/util/ListIterator.P .deps/java/util/ListResourceBundle.P \ +.deps/java/util/Locale.P .deps/java/util/Map.P \ +.deps/java/util/MissingResourceException.P \ .deps/java/util/NoSuchElementException.P .deps/java/util/Observable.P \ .deps/java/util/Observer.P .deps/java/util/Properties.P \ .deps/java/util/PropertyPermission.P \ diff --git a/libjava/java/text/DateFormat.java b/libjava/java/text/DateFormat.java index 76bf535..bf4c2c8 100644 --- a/libjava/java/text/DateFormat.java +++ b/libjava/java/text/DateFormat.java @@ -1,5 +1,5 @@ /* DateFormat.java -- Class for formatting/parsing date/times - Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -39,6 +39,7 @@ exception statement from your version. */ package java.text; import java.util.*; +import java.io.InvalidObjectException; /** * @author Per Bothner @@ -86,6 +87,97 @@ public abstract class DateFormat extends Format implements Cloneable public static final int HOUR0_FIELD = 16; public static final int TIMEZONE_FIELD = 17; + + public static class Field extends Format.Field + { + static final long serialVersionUID = 7441350119349544720L; + + private int calendarField; + + public static final DateFormat.Field ERA + = new Field("era", Calendar.ERA); + public static final DateFormat.Field YEAR + = new Field("year", Calendar.YEAR); + public static final DateFormat.Field MONTH + = new Field("month", Calendar.MONTH); + public static final DateFormat.Field DAY_OF_MONTH + = new Field("day of month", Calendar.DAY_OF_MONTH); + public static final DateFormat.Field HOUR_OF_DAY1 + = new Field("hour of day 1", Calendar.HOUR_OF_DAY); + public static final DateFormat.Field HOUR_OF_DAY0 + = new Field("hour of day 0", Calendar.HOUR_OF_DAY); + public static final DateFormat.Field MINUTE + = new Field("minute", Calendar.MINUTE); + public static final DateFormat.Field SECOND + = new Field("second", Calendar.SECOND); + public static final DateFormat.Field MILLISECOND + = new Field("millisecond", Calendar.MILLISECOND); + public static final DateFormat.Field DAY_OF_WEEK + = new Field("day of week", Calendar.DAY_OF_WEEK); + public static final DateFormat.Field DAY_OF_YEAR + = new Field("day of year", Calendar.DAY_OF_YEAR); + public static final DateFormat.Field DAY_OF_WEEK_IN_MONTH + = new Field("day of week in month", Calendar.DAY_OF_WEEK_IN_MONTH); + public static final DateFormat.Field WEEK_OF_YEAR + = new Field("week of year", Calendar.WEEK_OF_YEAR); + public static final DateFormat.Field WEEK_OF_MONTH + = new Field("week of month", Calendar.WEEK_OF_MONTH); + public static final DateFormat.Field AM_PM + = new Field("am/pm", Calendar.AM_PM); + public static final DateFormat.Field HOUR1 + = new Field("hour1", Calendar.HOUR); + public static final DateFormat.Field HOUR0 + = new Field("hour0", Calendar.HOUR); + public static final DateFormat.Field TIME_ZONE + = new Field("timezone", Calendar.ZONE_OFFSET); + + public static final DateFormat.Field[] allFields = + { + ERA, YEAR, MONTH, DAY_OF_MONTH, HOUR_OF_DAY1, + HOUR_OF_DAY0, MINUTE, SECOND, MILLISECOND, + DAY_OF_WEEK, DAY_OF_YEAR, DAY_OF_WEEK_IN_MONTH, + WEEK_OF_YEAR, WEEK_OF_MONTH, AM_PM, HOUR1, HOUR0, + TIME_ZONE + }; + + // For deserialization + private Field() + { + super(""); + } + + protected Field(String name, int calendarField) + { + super(name); + this.calendarField = calendarField; + } + + public int getCalendarField() + { + return calendarField; + } + + public static Field ofCalendarField(int calendarField) + { + if (calendarField >= allFields.length || calendarField < 0) + throw new IllegalArgumentException("no such calendar field (" + + calendarField + ")"); + + return allFields[calendarField]; + } + + protected Object readResolve() throws InvalidObjectException + { + String s = getName(); + + for (int i=0;iDateFormat. */ @@ -152,7 +244,9 @@ public abstract class DateFormat extends Format implements Cloneable if (obj instanceof Number) obj = new Date(((Number) obj).longValue()); else if (! (obj instanceof Date)) - throw new IllegalArgumentException ("Cannot format given Object as a Date"); + throw new IllegalArgumentException + ("Cannot format given Object as a Date"); + return format ((Date) obj, buf, pos); } diff --git a/libjava/java/text/DecimalFormat.java b/libjava/java/text/DecimalFormat.java index 7c5d5b0..8dae187 100644 --- a/libjava/java/text/DecimalFormat.java +++ b/libjava/java/text/DecimalFormat.java @@ -202,6 +202,8 @@ public class DecimalFormat extends NumberFormat } else if (c != syms.getExponential() && c != syms.getPatternSeparator() + && c != syms.getPercent() + && c != syms.getPerMill() && patChars.indexOf(c) != -1) throw new IllegalArgumentException ("unexpected special " + "character - index: " + index); diff --git a/libjava/java/text/Format.java b/libjava/java/text/Format.java index ab61f28..ba32cae 100644 --- a/libjava/java/text/Format.java +++ b/libjava/java/text/Format.java @@ -38,6 +38,10 @@ exception statement from your version. */ package java.text; +import java.util.Set; +import java.util.Map; +import java.util.HashSet; +import java.util.HashMap; import java.io.Serializable; /** @@ -61,6 +65,16 @@ public abstract class Format implements Serializable, Cloneable { static final long serialVersionUID = 4479235611355683992L; + public static class Field extends AttributedCharacterIterator.Attribute + { + static final long serialVersionUID = 276966692217360283L; + + public Field(String name) + { + super(name); + } + } + /** * This method initializes a new instance of Format. * It performs no actions, but acts as a default constructor for @@ -142,6 +156,11 @@ public abstract class Format implements Serializable, Cloneable */ public abstract Object parseObject (String str, ParsePosition pos); + public AttributedCharacterIterator formatToCharacterIterator(Object obj) + { + return new FormatCharacterIterator(format(obj), null, null); + } + /** * Creates a copy of this object. * diff --git a/libjava/java/text/FormatCharacterIterator.java b/libjava/java/text/FormatCharacterIterator.java new file mode 100644 index 0000000..8693707 --- /dev/null +++ b/libjava/java/text/FormatCharacterIterator.java @@ -0,0 +1,405 @@ +/* FormatCharacter.java -- Implementation of AttributedCharacterIterator for + formatters. + Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath 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 +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +02111-1307 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ +package java.text; + +import java.util.Set; +import java.util.HashSet; +import java.util.Map; +import java.util.HashMap; +import java.util.Vector; + +class FormatCharacterIterator implements AttributedCharacterIterator +{ + private String formattedString; + private int charIndex; + private int attributeIndex; + private int[] ranges; + private HashMap[] attributes; + + FormatCharacterIterator() + { + formattedString = ""; + ranges = new int[0]; + attributes = new HashMap[0]; + } + + FormatCharacterIterator(String s, int[] ranges, HashMap[] attributes) + { + formattedString = s; + this.ranges = ranges; + this.attributes = attributes; + } + + /* + * ----------------------------------- + * AttributedCharacterIterator methods + * ----------------------------------- + */ + public Set getAllAttributeKeys() + { + if (attributes != null && attributes[attributeIndex] != null) + return attributes[attributeIndex].keySet(); + else + return new HashSet(); + } + + public Map getAttributes() + { + if (attributes != null && attributes[attributeIndex] != null) + return attributes[attributeIndex]; + else + return new HashMap(); + } + + public Object getAttribute(AttributedCharacterIterator.Attribute attrib) + { + if (attributes != null && attributes[attributeIndex] != null) + return attributes[attributeIndex].get(attrib); + else + return null; + } + + public int getRunLimit(Set reqAttrs) + { + if (attributes == null) + return formattedString.length(); + + int currentAttrIndex = attributeIndex; + Set newKeys; + + do + { + currentAttrIndex++; + if (currentAttrIndex == attributes.length) + return formattedString.length(); + if (attributes[currentAttrIndex] == null) + break; + newKeys = attributes[currentAttrIndex].keySet(); + } + while (newKeys.containsAll(reqAttrs)); + + return ranges[currentAttrIndex-1]; + } + + public int getRunLimit(AttributedCharacterIterator.Attribute attribute) + { + Set s = new HashSet(); + + s.add(attribute); + return getRunLimit(s); + } + + public int getRunLimit() + { + if (attributes == null) + return formattedString.length(); + if (attributes[attributeIndex] == null) + { + for (int i=attributeIndex+1;i 0) ? ranges[currentAttrIndex-1] : 0; + } + + public int getRunStart() + { + if (attributes == null) + return 0; + + if (attributes[attributeIndex] == null) + { + for (int i=attributeIndex;i>0;i--) + if (attributes[i] != null) + return ranges[attributeIndex-1]; + return 0; + } + + return getRunStart(attributes[attributeIndex].keySet()); + } + + public int getRunStart(AttributedCharacterIterator.Attribute attribute) + { + Set s = new HashSet(); + + s.add(attribute); + return getRunStart(s); + } + + public Object clone() + { + return new FormatCharacterIterator(formattedString, ranges, attributes); + } + + /* + * --------------------------------- + * CharacterIterator methods + * --------------------------------- + */ + public char current() + { + return formattedString.charAt(charIndex); + } + + public char first() + { + charIndex = 0; + attributeIndex = 0; + return formattedString.charAt(0); + } + + public int getBeginIndex() + { + return 0; + } + + public int getEndIndex() + { + return formattedString.length(); + } + + public int getIndex() + { + return charIndex; + } + + public char last() + { + charIndex = formattedString.length()-1; + if (attributes != null) + attributeIndex = attributes.length-1; + return formattedString.charAt(charIndex); + } + + public char next() + { + charIndex++; + if (charIndex >= formattedString.length()) + { + charIndex = getEndIndex(); + return DONE; + } + if (attributes != null) + { + if (charIndex >= ranges[attributeIndex]) + attributeIndex++; + } + return formattedString.charAt(charIndex); + } + + public char previous() + { + charIndex--; + if (charIndex < 0) + { + charIndex = 0; + return DONE; + } + + if (attributes != null) + { + if (charIndex < ranges[attributeIndex]) + attributeIndex--; + } + return formattedString.charAt(charIndex); + } + + public char setIndex(int position) + { + if (position < 0 || position > formattedString.length()) + throw new IllegalArgumentException("position is out of range"); + + charIndex = position; + if (attributes != null) + { + for (attributeIndex=0;attributeIndex charIndex) + break; + attributeIndex--; + } + if (charIndex == formattedString.length()) + return DONE; + else + return formattedString.charAt(charIndex); + } + + protected void mergeAttributes(HashMap[] attributes, int[] ranges) + { + Vector new_ranges = new Vector(); + Vector new_attributes = new Vector(); + int i = 0, j = 0; + + while (i < this.ranges.length && j < ranges.length) + { + if (this.attributes[i] != null) + { + new_attributes.add(this.attributes[i]); + if (attributes[j] != null) + this.attributes[i].putAll(attributes[j]); + } + else + { + new_attributes.add(attributes[j]); + } + if (this.ranges[i] == ranges[j]) + { + new_ranges.add(new Integer(ranges[j])); + i++; + j++; + } + else if (this.ranges[i] < ranges[j]) + { + new_ranges.add(new Integer(this.ranges[i])); + i++; + } + else + { + new_ranges.add(new Integer(ranges[j])); + j++; + } + } + + if (i != this.ranges.length) + { + for (;iString containing currency code. + */ + public String getCurrencyCode () + { + try + { + return res.getString ("intlCurrencySymbol"); + } + catch (Exception _) + { + return null; + } + } + + /** + * @return number of digits after decimal separator for this currency. + */ + public int getDefaultFractionDigits () + { + NumberFormat currency = NumberFormat.getCurrencyInstance (locale); + + return currency.getMaximumFractionDigits(); + } + + /** + * Builds a new currency instance for this locale. + * + * @param locale a Locale instance. + * + * @return a new Currency instance. + */ + public static Currency getInstance (Locale locale) + { + return new Currency (locale); + } + + /** + * Builds the currency corresponding to the specified currency code. + * + * @param currencyCode a string representing a currency code. + * + * @return a new Currency instance. + */ + public static Currency getInstance (String currencyCode) + { + Locale[] all_locales = Locale.getAvailableLocales (); + + for (int i=0;iString containing the ISO4217 currency code. + */ + public String toString() + { + try + { + return res.getString ("intlCurrencySymbol"); + } + catch (Exception _) + { + return "(unknown currency)"; + } + } +}