[sword-cvs] icu-sword/source/i18n/unicode ulocdata.h,NONE,1.1 calendar.h,1.4,1.5 choicfmt.h,1.3,1.4 coleitr.h,1.4,1.5 coll.h,1.4,1.5 datefmt.h,1.4,1.5 dcfmtsym.h,1.4,1.5 decimfmt.h,1.7,1.8 dtfmtsym.h,1.3,1.4 fieldpos.h,1.3,1.4 fmtable.h,1.3,1.4 format.h,1.3,1.4 gregocal.h,1.4,1.5 msgfmt.h,1.3,1.4 numfmt.h,1.4,1.5 rbnf.h,1.4,1.5 regex.h,1.1,1.2 search.h,1.5,1.6 simpletz.h,1.3,1.4 smpdtfmt.h,1.4,1.5 sortkey.h,1.4,1.5 stsearch.h,1.5,1.6 tblcoll.h,1.4,1.5 timezone.h,1.4,1.5 translit.h,1.5,1.6 ucal.h,1.4,1.5 ucol.h,1.5,1.6 ucoleitr.h,1.4,1.5 ucurr.h,1.1,1.2 udat.h,1.5,1.6 umsg.h,1.4,1.5 unifltlg.h,1.4,1.5 unirepl.h,1.1,1.2 unum.h,1.5,1.6 utrans.h,1.5,1.6

sword@www.crosswire.org sword@www.crosswire.org
Tue, 6 Apr 2004 03:10:57 -0700


Update of /cvs/core/icu-sword/source/i18n/unicode
In directory www:/tmp/cvs-serv8911/source/i18n/unicode

Modified Files:
	calendar.h choicfmt.h coleitr.h coll.h datefmt.h dcfmtsym.h 
	decimfmt.h dtfmtsym.h fieldpos.h fmtable.h format.h gregocal.h 
	msgfmt.h numfmt.h rbnf.h regex.h search.h simpletz.h 
	smpdtfmt.h sortkey.h stsearch.h tblcoll.h timezone.h 
	translit.h ucal.h ucol.h ucoleitr.h ucurr.h udat.h umsg.h 
	unifltlg.h unirepl.h unum.h utrans.h 
Added Files:
	ulocdata.h 
Log Message:
ICU 2.8 sync

--- NEW FILE: ulocdata.h ---
/*
******************************************************************************
*                                                                            *
* Copyright (C) 2003, International Business Machines                        *
*                Corporation and others. All Rights Reserved.                *
*                                                                            *
******************************************************************************
*   file name:  ulocdata.h
*   encoding:   US-ASCII
*   tab size:   8 (not used)
*   indentation:4
*
*   created on: 2003Oct21
*   created by: Ram Viswanadha
*/

#ifndef __ULOCDATA_H__
#define __ULOCDATA_H__

#include "unicode/ures.h"
#include "unicode/uloc.h"
#include "unicode/uset.h"


/**
 * Fills the set with the set of exemplar characters for the locale and 
 * returns the set.
 *
 * @param fillIn    A pointer to USet object to be filled in with the 
 *                  exemplar characters set for the locale. 
 *                  <em> If NULL is passed, then a new USet will be created and returned.
 *                   The caller owns this object and must dispose it by calling uset_close.
 *                   </em>
 * @param localeID  The id of the locale for which the exemplar character set 
 *                  needs to be retrieved.
 * @param status    Must be a valid pointer to an error code value,
 *                  which must not indicate a failure before the function call.
 * @return USet*    The pointer to the fillIn USet object.
 * @draft ICU 2.8
 */
U_CAPI USet* U_EXPORT2 
ulocdata_getExemplarSet(USet *fillIn, const char *localeID, UErrorCode *status);


/**
 * Enumeration for representing the measurement systems.
 * @draft ICU 2.8
 */
typedef enum UMeasurementSystem {
    UMS_SI,     /** Measurement system specified by SI otherwise known as Metric system. */
    UMS_US,     /** Measurement system followed in the United States of America. */ 
    UMS_LIMIT
} UMeasurementSystem;

/**
 * Returns the measurement system used in the locale specified by the localeID.
 *
 * @param localeID      The id of the locale for which the measurement system to be retrieved.
 * @param status        Must be a valid pointer to an error code value,
 *                      which must not indicate a failure before the function call.
 * @return UMeasurementSystem the measurement system used in the locale.
 * @draft ICU 2.8
 */
U_CAPI UMeasurementSystem U_EXPORT2
ulocdata_getMeasurementSystem(const char *localeID, UErrorCode *status);

/**
 * Returns the element gives the normal business letter size, and customary units. 
 * The units for the numbers are always in <em>milli-meters</em>.
 * For US since 8.5 and 11 do not yeild an integral value when converted to milli-meters,
 * the values are rounded off.
 * So for A4 size paper the height and width are 297 mm and 210 mm repectively, 
 * and for US letter size the height and width are 279 mm and 216 mm respectively.
 *
 * @param localeID      The id of the locale for which the paper size information to be retrieved.
 * @param height        A pointer to int to recieve the height information.
 * @param width         A pointer to int to recieve the width information.
 * @param status        Must be a valid pointer to an error code value,
 *                      which must not indicate a failure before the function call.
 * @draft ICU 2.8
 */
U_CAPI void U_EXPORT2
ulocdata_getPaperSize(const char *localeID, int32_t *height, int32_t *width, UErrorCode *status);

#endif

Index: calendar.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/calendar.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- calendar.h	10 Sep 2003 02:42:25 -0000	1.4
+++ calendar.h	6 Apr 2004 10:08:57 -0000	1.5
@@ -18,6 +18,7 @@
 *   11/15/99    weiv        added YEAR_WOY and DOW_LOCAL
 *                           to EDateFields
 *    8/19/2002  srl         Removed Javaisms
+*   11/07/2003  srl         Update, clean up documentation.
 ********************************************************************************
 */
 
@@ -43,6 +44,11 @@
 typedef const void* URegistryKey;
 
 /**
+ * @internal
+ */
+typedef int32_t UFieldResolutionTable[12][8];
+
+/**
  * <code>Calendar</code> is an abstract base class for converting between
  * a <code>UDate</code> object and a set of integer fields such as
  * <code>YEAR</code>, <code>MONTH</code>, <code>DAY</code>, <code>HOUR</code>,
@@ -183,12 +189,10 @@
         MILLISECOND,          // Example: 0..999
         ZONE_OFFSET,          // Example: -12*U_MILLIS_PER_HOUR..12*U_MILLIS_PER_HOUR
         DST_OFFSET,           // Example: 0 or U_MILLIS_PER_HOUR
-// here will go names for 'Y' and 'e'
-        YEAR_WOY,  // 'Y' Example: 1..big number
-        DOW_LOCAL, // 'e' Example: 1..7
-        FIELD_COUNT,
+        YEAR_WOY,             // 'Y' Example: 1..big number - Year of Week of Year 
+        DOW_LOCAL,            // 'e' Example: 1..7 - Day of Week / Localized
 
-        DAY_OF_MONTH = DATE   // Synonyms
+        FIELD_COUNT = UCAL_FIELD_COUNT // See ucal.h for other fields.
     };
 
     /**
@@ -476,7 +480,7 @@
      *                leniency, this will be set to an error status.
      * @deprecated ICU 2.6. use add(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead.
      */
-    virtual void add(EDateFields field, int32_t amount, UErrorCode& status) = 0;
+    virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
 
     /**
      * UDate Arithmetic function. Adds the specified (signed) amount of time to the given
@@ -495,7 +499,7 @@
      *                leniency, this will be set to an error status.
      * @draft ICU 2.6.
      */
-    virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status) = 0;
+    virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
 
     /**
      * Time Field Rolling function. Rolls (up/down) a single unit of time on the given
@@ -569,7 +573,7 @@
      *                an error status.
      * @deprecated ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead.
      */
-    virtual void roll(EDateFields field, int32_t amount, UErrorCode& status) = 0;
+    virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
 
     /**
      * Time Field Rolling function. Rolls by the given amount on the given
@@ -593,7 +597,7 @@
      *                an error status.
      * @draft ICU 2.6.
      */
-    virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) = 0;
+    virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
 
     /**
      * Return the difference between the given time and the time this
@@ -843,7 +847,7 @@
      * @return       The minimum value for the given time field.
      * @deprecated ICU 2.6. Use getMinimum(UCalendarDateFields field) instead.
      */
-    virtual int32_t getMinimum(EDateFields field) const = 0;
+    virtual int32_t getMinimum(EDateFields field) const;
 
     /**
      * Gets the minimum value for the given time field. e.g., for Gregorian
@@ -853,7 +857,7 @@
      * @return       The minimum value for the given time field.
      * @draft ICU 2.6.
      */
-    virtual int32_t getMinimum(UCalendarDateFields field) const = 0;
+    virtual int32_t getMinimum(UCalendarDateFields field) const;
 
     /**
      * Gets the maximum value for the given time field. e.g. for Gregorian DAY_OF_MONTH,
@@ -863,7 +867,7 @@
      * @return       The maximum value for the given time field.
      * @deprecated ICU 2.6. Use getMaximum(UCalendarDateFields field) instead.
      */
-    virtual int32_t getMaximum(EDateFields field) const = 0;
+    virtual int32_t getMaximum(EDateFields field) const;
 
     /**
      * Gets the maximum value for the given time field. e.g. for Gregorian DAY_OF_MONTH,
@@ -873,7 +877,7 @@
      * @return       The maximum value for the given time field.
      * @draft ICU 2.6.
      */
-    virtual int32_t getMaximum(UCalendarDateFields field) const = 0;
+    virtual int32_t getMaximum(UCalendarDateFields field) const;
 
     /**
      * Gets the highest minimum value for the given field if varies. Otherwise same as
@@ -883,7 +887,7 @@
      * @return       The highest minimum value for the given time field.
      * @deprecated ICU 2.6. Use getGreatestMinimum(UCalendarDateFields field) instead.
      */
-    virtual int32_t getGreatestMinimum(EDateFields field) const = 0;
+    virtual int32_t getGreatestMinimum(EDateFields field) const;
 
     /**
      * Gets the highest minimum value for the given field if varies. Otherwise same as
@@ -893,7 +897,7 @@
      * @return       The highest minimum value for the given time field.
      * @draft ICU 2.6.
      */
-    virtual int32_t getGreatestMinimum(UCalendarDateFields field) const = 0;
+    virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
 
     /**
      * Gets the lowest maximum value for the given field if varies. Otherwise same as
@@ -903,7 +907,7 @@
      * @return       The lowest maximum value for the given time field.
      * @deprecated ICU 2.6. Use getLeastMaximum(UCalendarDateFields field) instead.
      */
-    virtual int32_t getLeastMaximum(EDateFields field) const = 0;
+    virtual int32_t getLeastMaximum(EDateFields field) const;
 
     /**
      * Gets the lowest maximum value for the given field if varies. Otherwise same as
@@ -913,7 +917,7 @@
      * @return       The lowest maximum value for the given time field.
      * @draft ICU 2.6.
      */
-    virtual int32_t getLeastMaximum(UCalendarDateFields field) const = 0;
+    virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
 
     /**
      * Return the minimum value that this field could have, given the current date.
@@ -1206,7 +1210,7 @@
      *                leniency, this will be set to an error status.
      * @stable ICU 2.0
      */
-    virtual void computeTime(UErrorCode& status) = 0;
+    virtual void computeTime(UErrorCode& status);
 
     /**
      * Converts GMT as milliseconds to time field values. This allows you to sync up the
@@ -1219,7 +1223,7 @@
      *                leniency, this will be set to an error status.
      * @stable ICU 2.0
      */
-    virtual void computeFields(UErrorCode& status) = 0;
+    virtual void computeFields(UErrorCode& status);
 
     /**
      * Gets this Calendar's current time as a long.
@@ -1265,11 +1269,23 @@
 
     /**
      * Gets the value for a given time field. Subclasses can use this function to get
+     * field values without forcing recomputation of time. If the field's stamp is UNSET,
+     * the defaultValue is used.
+     *
+     * @param field  The given time field.
+     * @param defaultValue a default value used if the field is unset.
+     * @return       The value for the given time field.
+     * @internal
+     */
+    inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
+
+    /**
+     * Gets the value for a given time field. Subclasses can use this function to get
      * field values without forcing recomputation of time.
      *
      * @param field  The given time field.
      * @return       The value for the given time field.
-     * @draft ICU 2.6.
+     * @internal
      */
     inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
 
@@ -1295,6 +1311,245 @@
      */
     inline void internalSet(UCalendarDateFields field, int32_t value);
 
+    /**
+     * Prepare this calendar for computing the actual minimum or maximum.
+     * This method modifies this calendar's fields; it is called on a
+     * temporary calendar.
+     * @internal
+     */
+    virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status);
+    
+    /**
+     * Limit enums. Not in sync with UCalendarLimitTypes (refers to internal fields).
+     * @internal  
+     */
+    enum ELimitType { 
+      UCAL_LIMIT_MINIMUM = 0, 
+      UCAL_LIMIT_GREATEST_MINIMUM, 
+      UCAL_LIMIT_LEAST_MAXIMUM, 
+      UCAL_LIMIT_MAXIMUM, 
+      UCAL_LIMIT_COUNT
+    };
+    
+    /**
+     * Subclass API for defining limits of different types.
+     * Subclasses must implement this method to return limits for the
+     * following fields:
+     *
+     * <pre>UCAL_ERA
+     * UCAL_YEAR
+     * UCAL_MONTH
+     * UCAL_WEEK_OF_YEAR
+     * UCAL_WEEK_OF_MONTH
+     * UCAL_DATE (DAY_OF_MONTH on Java)
+     * UCAL_DAY_OF_YEAR
+     * UCAL_DAY_OF_WEEK_IN_MONTH
+     * UCAL_YEAR_WOY
+     * UCAL_EXTENDED_YEAR</pre>
+     *
+     * @param field one of the above field numbers
+     * @param limitType one of <code>MINIMUM</code>, <code>GREATEST_MINIMUM</code>,
+     * <code>LEAST_MAXIMUM</code>, or <code>MAXIMUM</code>
+     * @internal
+     */
+    virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0;
+
+    /**
+     * Return a limit for a field.
+     * @param field the field, from 0..UCAL_MAX_FIELD</code>
+     * @param limitType the type specifier for the limit
+     * @see #ELimitType
+     * @internal
+     */
+    virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const;
+
+
+    /**
+     * Return the Julian day number of day before the first day of the
+     * given month in the given extended year.  Subclasses should override
+     * this method to implement their calendar system.
+     * @param eyear the extended year
+     * @param month the zero-based month, or 0 if useMonth is false
+     * @param useMonth if false, compute the day before the first day of
+     * the given year, otherwise, compute the day before the first day of
+     * the given month
+     * @param return the Julian day number of the day before the first
+     * day of the given month and year
+     * @internal
+     */
+    virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
+                                                   UBool useMonth) const  = 0;
+
+    /**
+     * Return the number of days in the given month of the given extended
+     * year of this calendar system.  Subclasses should override this
+     * method if they can provide a more correct or more efficient
+     * implementation than the default implementation in Calendar.
+     * @internal
+     */
+    virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ;
+
+    /**
+     * Return the number of days in the given extended year of this
+     * calendar system.  Subclasses should override this method if they can
+     * provide a more correct or more efficient implementation than the
+     * default implementation in Calendar.
+     * @stable ICU 2.0
+     */
+    virtual int32_t handleGetYearLength(int32_t eyear) const;
+
+
+    /**
+     * Return the extended year defined by the current fields.  This will
+     * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such
+     * as UCAL_ERA) specific to the calendar system, depending on which set of
+     * fields is newer.
+     * @return the extended year
+     * @internal
+     */
+    virtual int32_t handleGetExtendedYear() = 0;
+
+    /**
+     * Subclasses may override this.  This method calls
+     * handleGetMonthLength() to obtain the calendar-specific month
+     * length.
+     * @param bestField which field to use to calculate the date 
+     * @return julian day specified by calendar fields.
+     * @internal
+     */
+    virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField);
+
+    /** 
+     * Subclasses must override this to convert from week fields 
+     * (YEAR_WOY and WEEK_OF_YEAR) to an extended year in the case
+     * where YEAR, EXTENDED_YEAR are not set.
+     * The Calendar implementation assumes yearWoy is in extended gregorian form
+     * @internal
+     * @return the extended year, UCAL_EXTENDED_YEAR
+     */
+    virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
+
+    /**
+     * Compute the Julian day from fields.  Will determine whether to use
+     * the JULIAN_DAY field directly, or other fields.
+     * @return the julian day
+     * @internal
+     */
+    int32_t computeJulianDay();
+    
+    /**
+     * Compute the milliseconds in the day from the fields.  This is a
+     * value from 0 to 23:59:59.999 inclusive, unless fields are out of
+     * range, in which case it can be an arbitrary value.  This value
+     * reflects local zone wall time.
+     * @internal
+     */
+    int32_t computeMillisInDay();
+
+    /**
+     * This method can assume EXTENDED_YEAR has been set.
+     * @param millis milliseconds of the date fields
+     * @param millisInDay milliseconds of the time fields; may be out
+     * or range.
+     * @internal
+     */
+    int32_t computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec);
+
+
+    /**
+     * Determine the best stamp in a range.
+     * @param start first enum to look at
+     * @param end last enum to look at
+     * @param best stamp prior to function call
+     * @return the stamp value of the best stamp
+     * @internal
+     */
+    int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const;
+
+    /**
+     * Values for field resolution tables
+     * @see #resolveFields
+     * @internal
+     */
+    enum {
+      /** Marker for end of resolve set (row or group). */
+      kResolveSTOP = -1,
+      /** Value to be bitwised "ORed" against resolve table field values for remapping.  Example: (UCAL_DATE | kResolveRemap) in 1st column will cause 'UCAL_DATE' to be returned, but will not examine the value of UCAL_DATE.  */
+      kResolveRemap = 32
+    };
+
+    /**
+     * Precedence table for Dates
+     * @see #resolveFields
+     * @internal
+     */
+    static const UFieldResolutionTable kDatePrecedence[];
+
+    /**
+     * Precedence table for Year
+     * @see #resolveFields
+     * @internal
+     */
+    static const UFieldResolutionTable kYearPrecedence[];
+
+    /**
+     * Precedence table for Day of Week
+     * @see #resolveFields
+     * @internal
+     */
+    static const UFieldResolutionTable kDOWPrecedence[];
+
+    /**
+     * Given a precedence table, return the newest field combination in
+     * the table, or UCAL_FIELD_COUNT if none is found.
+     *
+     * <p>The precedence table is a 3-dimensional array of integers.  It
+     * may be thought of as an array of groups.  Each group is an array of
+     * lines.  Each line is an array of field numbers.  Within a line, if
+     * all fields are set, then the time stamp of the line is taken to be
+     * the stamp of the most recently set field.  If any field of a line is
+     * unset, then the line fails to match.  Within a group, the line with
+     * the newest time stamp is selected.  The first field of the line is
+     * returned to indicate which line matched.
+     *
+     * <p>In some cases, it may be desirable to map a line to field that
+     * whose stamp is NOT examined.  For example, if the best field is
+     * DAY_OF_WEEK then the DAY_OF_WEEK_IN_MONTH algorithm may be used.  In
+     * order to do this, insert the value <code>kResolveRemap | F</code> at
+     * the start of the line, where <code>F</code> is the desired return
+     * field value.  This field will NOT be examined; it only determines
+     * the return value if the other fields in the line are the newest.
+     *
+     * <p>If all lines of a group contain at least one unset field, then no
+     * line will match, and the group as a whole will fail to match.  In
+     * that case, the next group will be processed.  If all groups fail to
+     * match, then UCAL_FIELD_COUNT is returned.
+     * @internal
+     */
+    UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable);
+
+    virtual const UFieldResolutionTable* getFieldResolutionTable() const;
+
+    /**
+     * Return the field that is newer, either defaultField, or
+     * alternateField.  If neither is newer or neither is set, return defaultField.
+     * @internal
+     */
+    UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const;
+
+    
+private:    
+    /**
+     * Helper function for calculating limits by trial and error
+     * @param field The field being investigated
+     * @param startValue starting (least max) value of field
+     * @param endValue ending (greatest max) value of field
+     * @param status return type
+     * @internal
+     */
+    int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
+
+
 protected:
     /**
      * The flag which indicates if the current time is set in the calendar.
@@ -1346,7 +1601,7 @@
 
     /**
      * The flags which tell if a specified time field for the calendar is set.
-     * @stable ICU 2.0
+     * @deprecated ICU 2.8 use (fStamp[n]!=kUnset)
      */
     UBool      fIsSet[UCAL_FIELD_COUNT];
 
@@ -1367,9 +1622,209 @@
      */
     int32_t        fStamp[UCAL_FIELD_COUNT];
 
+    /**
+     * Subclasses may override this method to compute several fields
+     * specific to each calendar system.  These are:
+     *
+     * <ul><li>ERA
+     * <li>YEAR
+     * <li>MONTH
+     * <li>DAY_OF_MONTH
+     * <li>DAY_OF_YEAR
+     * <li>EXTENDED_YEAR</ul>
+     *
+     * Subclasses can refer to the DAY_OF_WEEK and DOW_LOCAL fields, which
+     * will be set when this method is called.  Subclasses can also call
+     * the getGregorianXxx() methods to obtain Gregorian calendar
+     * equivalents for the given Julian day.
+     *
+     * <p>In addition, subclasses should compute any subclass-specific
+     * fields, that is, fields from BASE_FIELD_COUNT to
+     * getFieldCount() - 1.
+     *
+     * <p>The default implementation in <code>Calendar</code> implements
+     * a pure proleptic Gregorian calendar.
+     * @internal
+     */
+    virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
+
+    /**
+     * Return the extended year on the Gregorian calendar as computed by
+     * <code>computeGregorianFields()</code>.
+     * @see #computeGregorianFields
+     * @internal
+     */
+    int32_t getGregorianYear() const {
+        return fGregorianYear;
+    }
+
+    /**
+     * Return the month (0-based) on the Gregorian calendar as computed by
+     * <code>computeGregorianFields()</code>.
+     * @see #computeGregorianFields
+     * @internal
+     */
+    int32_t getGregorianMonth() const {
+        return fGregorianMonth;
+    }
+
+    /**
+     * Return the day of year (1-based) on the Gregorian calendar as
+     * computed by <code>computeGregorianFields()</code>.
+     * @see #computeGregorianFields
+     * @internal
+     */
+    int32_t getGregorianDayOfYear() const {
+        return fGregorianDayOfYear;
+    }
+
+    /**
+     * Return the day of month (1-based) on the Gregorian calendar as
+     * computed by <code>computeGregorianFields()</code>.
+     * @see #computeGregorianFields
+     * @internal
+     */
+    int32_t getGregorianDayOfMonth() const {
+      return fGregorianDayOfMonth;
+    }
+
+    /**
+     * Called by computeJulianDay.  Returns the default month (0-based) for the year,
+     * taking year and era into account.  Defaults to 0 for Gregorian, which doesn't care.
+     * @internal
+     * @internal
+     */
+    virtual int32_t getDefaultMonthInYear() ;
+
+
+    /**
+     * Called by computeJulianDay.  Returns the default day (1-based) for the month,
+     * taking currently-set year and era into account.  Defaults to 1 for Gregorian.
+     * @internal
+     */
+    virtual int32_t getDefaultDayInMonth(int32_t /*month*/);
+
+    //-------------------------------------------------------------------------
+    // Protected utility methods for use by subclasses.  These are very handy
+    // for implementing add, roll, and computeFields.
+    //-------------------------------------------------------------------------
+
+    /**
+     * Adjust the specified field so that it is within
+     * the allowable range for the date to which this calendar is set.
+     * For example, in a Gregorian calendar pinning the {@link #DAY_OF_MONTH DAY_OF_MONTH}
+     * field for a calendar set to April 31 would cause it to be set
+     * to April 30.
+     * <p>
+     * <b>Subclassing:</b>
+     * <br>
+     * This utility method is intended for use by subclasses that need to implement
+     * their own overrides of {@link #roll roll} and {@link #add add}.
+     * <p>
+     * <b>Note:</b>
+     * <code>pinField</code> is implemented in terms of
+     * {@link #getActualMinimum getActualMinimum}
+     * and {@link #getActualMaximum getActualMaximum}.  If either of those methods uses
+     * a slow, iterative algorithm for a particular field, it would be
+     * unwise to attempt to call <code>pinField</code> for that field.  If you
+     * really do need to do so, you should override this method to do
+     * something more efficient for that field.
+     * <p>
+     * @param field The calendar field whose value should be pinned.
+     *
+     * @see #getActualMinimum
+     * @see #getActualMaximum
+     * @stable ICU 2.0
+     */
+    virtual void pinField(UCalendarDateFields field, UErrorCode& status);
+
+    /**
+     * Return the week number of a day, within a period. This may be the week number in
+     * a year or the week number in a month. Usually this will be a value >= 1, but if
+     * some initial days of the period are excluded from week 1, because
+     * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} is > 1, then
+     * the week number will be zero for those
+     * initial days. This method requires the day number and day of week for some
+     * known date in the period in order to determine the day of week
+     * on the desired day.
+     * <p>
+     * <b>Subclassing:</b>
+     * <br>
+     * This method is intended for use by subclasses in implementing their
+     * {@link #computeTime computeTime} and/or {@link #computeFields computeFields} methods.
+     * It is often useful in {@link #getActualMinimum getActualMinimum} and
+     * {@link #getActualMaximum getActualMaximum} as well.
+     * <p>
+     * This variant is handy for computing the week number of some other
+     * day of a period (often the first or last day of the period) when its day
+     * of the week is not known but the day number and day of week for some other
+     * day in the period (e.g. the current date) <em>is</em> known.
+     * <p>
+     * @param desiredDay    The {@link #DAY_OF_YEAR DAY_OF_YEAR} or
+     *              {@link #DAY_OF_MONTH DAY_OF_MONTH} whose week number is desired.
+     *              Should be 1 for the first day of the period.
+     *
+     * @param knownDayOfPeriod   The {@link #DAY_OF_YEAR DAY_OF_YEAR}
+     *              or {@link #DAY_OF_MONTH DAY_OF_MONTH} for a day in the period whose
+     *              {@link #DAY_OF_WEEK DAY_OF_WEEK} is specified by the
+     *              <code>knownDayOfWeek</code> parameter.
+     *              Should be 1 for first day of period.
+     *
+     * @param knownDayOfWeek  The {@link #DAY_OF_WEEK DAY_OF_WEEK} for the day
+     *              corresponding to the <code>knownDayOfPeriod</code> parameter.
+     *              1-based with 1=Sunday.
+     *
+     * @return      The week number (one-based), or zero if the day falls before
+     *              the first week because
+     *              {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek}
+     *              is more than one.
+     */
+    int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
+
+
+    /**
+     * Return the week number of a day, within a period. This may be the week number in
+     * a year, or the week number in a month. Usually this will be a value >= 1, but if
+     * some initial days of the period are excluded from week 1, because
+     * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} is > 1,
+     * then the week number will be zero for those
+     * initial days. This method requires the day of week for the given date in order to
+     * determine the result.
+     * <p>
+     * <b>Subclassing:</b>
+     * <br>
+     * This method is intended for use by subclasses in implementing their
+     * {@link #computeTime computeTime} and/or {@link #computeFields computeFields} methods.
+     * It is often useful in {@link #getActualMinimum getActualMinimum} and
+     * {@link #getActualMaximum getActualMaximum} as well.
+     * <p>
+     * @param dayOfPeriod   The {@link #DAY_OF_YEAR DAY_OF_YEAR} or
+     *                      {@link #DAY_OF_MONTH DAY_OF_MONTH} whose week number is desired.
+     *                      Should be 1 for the first day of the period.
+     *
+     * @param dayofWeek     The {@link #DAY_OF_WEEK DAY_OF_WEEK} for the day
+     *                      corresponding to the <code>dayOfPeriod</code> parameter.
+     *                      1-based with 1=Sunday.
+     *
+     * @return      The week number (one-based), or zero if the day falls before
+     *              the first week because
+     *              {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek}
+     *              is more than one.
+     * @internal
+     */
+    inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
+
+    /**
+     * returns the local DOW, valid range 0..6
+     * @internal
+     */
+    int32_t getLocalDOW();
+
 private:
 
-    // The next available value for stampp[]
+    /**
+     * The next available value for fStamp[]
+     */
     int32_t fNextStamp;// = MINIMUM_USER_STAMP;
 
     /**
@@ -1430,6 +1885,122 @@
      * The resource tag where the default calendar is stored.
      */
     static const char kDefaultCalendar[];
+    
+    
+    /**
+     * The Gregorian year, as computed by computeGregorianFields() and
+     * returned by getGregorianYear().
+     */
+    int32_t fGregorianYear;
+
+    /**
+     * The Gregorian month, as computed by computeGregorianFields() and
+     * returned by getGregorianMonth().
+     */
+    int32_t fGregorianMonth;
+
+    /**
+     * The Gregorian day of the year, as computed by
+     * computeGregorianFields() and returned by getGregorianDayOfYear().
+     */
+    int32_t fGregorianDayOfYear;
+
+    /**
+     * The Gregorian day of the month, as computed by
+     * computeGregorianFields() and returned by getGregorianDayOfMonth().
+     */
+    int32_t fGregorianDayOfMonth;
+
+    /* calculations */
+
+    /**
+     * Compute the Gregorian calendar year, month, and day of month from
+     * the given Julian day.  These values are not stored in fields, but in
+     * member variables gregorianXxx.  Also compute the DAY_OF_WEEK and
+     * DOW_LOCAL fields.
+     */
+    void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
+
+    /**
+     * Compute the Gregorian calendar year, month, and day of month from the
+     * Julian day.  These values are not stored in fields, but in member
+     * variables gregorianXxx.  They are used for time zone computations and by
+     * subclasses that are Gregorian derivatives.  Subclasses may call this
+     * method to perform a Gregorian calendar millis->fields computation.
+     * To perform a Gregorian calendar fields->millis computation, call
+     * computeGregorianMonthStart().
+     * @see #computeGregorianMonthStart
+     */
+    void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
+
+    /**
+     * Compute the fields WEEK_OF_YEAR, YEAR_WOY, WEEK_OF_MONTH,
+     * DAY_OF_WEEK_IN_MONTH, and DOW_LOCAL from EXTENDED_YEAR, YEAR,
+     * DAY_OF_WEEK, and DAY_OF_YEAR.  The latter fields are computed by the
+     * subclass based on the calendar system.
+     *
+     * <p>The YEAR_WOY field is computed simplistically.  It is equal to YEAR
+     * most of the time, but at the year boundary it may be adjusted to YEAR-1
+     * or YEAR+1 to reflect the overlap of a week into an adjacent year.  In
+     * this case, a simple increment or decrement is performed on YEAR, even
+     * though this may yield an invalid YEAR value.  For instance, if the YEAR
+     * is part of a calendar system with an N-year cycle field CYCLE, then
+     * incrementing the YEAR may involve incrementing CYCLE and setting YEAR
+     * back to 0 or 1.  This is not handled by this code, and in fact cannot be
+     * simply handled without having subclasses define an entire parallel set of
+     * fields for fields larger than or equal to a year.  This additional
+     * complexity is not warranted, since the intention of the YEAR_WOY field is
+     * to support ISO 8601 notation, so it will typically be used with a
+     * proleptic Gregorian calendar, which has no field larger than a year.
+     */
+    void computeWeekFields(UErrorCode &ec);
+
+
+    /**
+     * Ensure that each field is within its valid range by calling {@link
+     * #validateField(int)} on each field that has been set.  This method
+     * should only be called if this calendar is not lenient.
+     * @see #isLenient
+     * @see #validateField(int)
+     * @internal
+     */
+    void validateFields(UErrorCode &status);
+
+    /**
+     * Validate a single field of this calendar.  Subclasses should
+     * override this method to validate any calendar-specific fields.
+     * Generic fields can be handled by
+     * <code>Calendar.validateField()</code>.
+     * @see #validateField(int, int, int)
+     * @internal
+     */
+    virtual void validateField(UCalendarDateFields field, UErrorCode &status);
+
+    /**
+     * Validate a single field of this calendar given its minimum and
+     * maximum allowed value.  If the field is out of range, 
+     * <code>U_ILLEGAL_ARGUMENT_ERROR</code> will be set.  Subclasses may
+     * use this method in their implementation of {@link
+     * #validateField(int)}.
+     * @internal
+     */
+    void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
+
+ protected:
+    /**
+     * Convert a quasi Julian date to the day of the week. The Julian date used here is
+     * not a true Julian date, since it is measured from midnight, not noon. Return
+     * value is one-based.
+     *
+     * @param julian  The given Julian date number.
+     * @return   Day number from 1..7 (SUN..SAT).
+     * @internal
+     */
+    static uint8_t julianDayToDayOfWeek(double julian);
+
+ private:
+    char validLocale[ULOC_FULLNAME_CAPACITY];
+    char actualLocale[ULOC_FULLNAME_CAPACITY];
 
  public:
     /** 
@@ -1501,6 +2072,22 @@
      */
     virtual int32_t defaultCenturyStartYear() const = 0;
     
+    /** Get the locale for this calendar object. You can choose between valid and actual locale.
+     *  @param type type of the locale we're looking for (valid or actual) 
+     *  @param status error code for the operation
+     *  @return the locale
+     *  @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
+     */
+    Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const;
+
+    /** Get the locale for this calendar object. You can choose between valid and actual locale.
+     *  @param type type of the locale we're looking for (valid or actual) 
+     *  @param status error code for the operation
+     *  @return the locale
+     *  @internal
+     */
+    const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
+
 };
 
 // -------------------------------------
@@ -1526,6 +2113,7 @@
     roll((UCalendarDateFields) field, up, status);
 }
 
+
 // -------------------------------------
 
 /**
@@ -1537,6 +2125,8 @@
 Calendar::internalSet(UCalendarDateFields field, int32_t value)
 {
     fFields[field] = value;
+    fStamp[field] = kInternallySet;
+    fIsSet[field]     = TRUE; // Remove later
 }
 
 inline void
@@ -1544,6 +2134,22 @@
 {
     internalSet((UCalendarDateFields) field, value);
 }
+
+inline uint8_t Calendar::julianDayToDayOfWeek(double julian)
+{
+  // If julian is negative, then julian%7 will be negative, so we adjust
+  // accordingly.  We add 1 because Julian day 0 is Monday.
+  int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7);
+
+  uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7+UCAL_SUNDAY ) : UCAL_SUNDAY));
+  return result;
+}
+
+inline int32_t  Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek)
+{
+  return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
+}
+
 
 U_NAMESPACE_END
 

Index: choicfmt.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/choicfmt.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- choicfmt.h	10 Sep 2003 02:42:25 -0000	1.3
+++ choicfmt.h	6 Apr 2004 10:08:57 -0000	1.4
@@ -493,6 +493,22 @@
     virtual UnicodeString& format(int32_t number,
                                   UnicodeString& appendTo,
                                   FieldPosition& pos) const;
+
+    /**
+     * Format an int64_t number using this object's choices.
+     *
+     * @param number    The value to be formatted.
+     * @param appendTo  Output parameter to receive result.
+     *                  Result is appended to existing contents.
+     * @param pos       On input: an alignment field, if desired.
+     *                  On output: the offsets of the alignment field.
+     * @return          Reference to 'appendTo' parameter.
+     * @draft ICU 2.8
+     */
+    virtual UnicodeString& format(int64_t number,
+                                  UnicodeString& appendTo,
+                                  FieldPosition& pos) const;
+
     /**
      * Format an array of objects using this object's choices.
      *
@@ -642,7 +658,7 @@
      * @return          The class ID for all objects of this class.
      * @stable ICU 2.0
      */
-    static inline UClassID getStaticClassID(void);
+    static UClassID getStaticClassID(void);
 
 private:
     // static cache management (thread-safe)
@@ -666,13 +682,6 @@
      */
     static UnicodeString& dtos(double value, UnicodeString& string);
 
-    //static UMTX fgMutex;
-    //static NumberFormat* fgNumberFormat;
-    static const char fgClassID;
-
-    static const UChar fgPositiveInfinity[];
-    static const UChar fgNegativeInfinity[];
-
     ChoiceFormat(); // default constructor not implemented
 
     /**
@@ -734,18 +743,6 @@
     int32_t         fCount;
 };
  
-inline UClassID
-ChoiceFormat::getStaticClassID(void)
-{
-    return (UClassID)&fgClassID;
-}
-
-inline UClassID 
-ChoiceFormat::getDynamicClassID() const
-{ 
-    return ChoiceFormat::getStaticClassID(); 
-}
-
 inline UnicodeString&
 ChoiceFormat::format(const Formattable& obj,
                      UnicodeString& appendTo,

Index: coleitr.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/coleitr.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- coleitr.h	10 Sep 2003 02:42:25 -0000	1.4
+++ coleitr.h	6 Apr 2004 10:08:57 -0000	1.5
@@ -121,248 +121,235 @@
 class U_I18N_API CollationElementIterator : public UObject {
 public: 
 
-  // CollationElementIterator public data member ------------------------------
+    // CollationElementIterator public data member ------------------------------
 
-  /**
-  * NULLORDER indicates that an error has occured while processing
-  * @stable ICU 2.0
-  */
-  static int32_t const NULLORDER;
+    /**
+    * NULLORDER indicates that an error has occured while processing
+    * @stable ICU 2.0
+    */
+    static int32_t const NULLORDER;
 
-  // CollationElementIterator public constructor/destructor -------------------
+    // CollationElementIterator public constructor/destructor -------------------
 
-  /**
-  * Copy constructor.
-  *
-  * @param other    the object to be copied from
-  * @stable ICU 2.0
-  */
-  CollationElementIterator(const CollationElementIterator& other);
+    /**
+    * Copy constructor.
+    *
+    * @param other    the object to be copied from
+    * @stable ICU 2.0
+    */
+    CollationElementIterator(const CollationElementIterator& other);
 
-  /** 
-  * Destructor
-  * @stable ICU 2.0
-  */
-  ~CollationElementIterator();
-  
-  // CollationElementIterator public methods ----------------------------------
+    /** 
+    * Destructor
+    * @stable ICU 2.0
+    */
+    ~CollationElementIterator();
 
-  /**
-  * Returns true if "other" is the same as "this"
-  *
-  * @param other    the object to be compared
-  * @return         true if "other" is the same as "this"
-  * @stable ICU 2.0
-  */
-  UBool operator==(const CollationElementIterator& other) const;
+    // CollationElementIterator public methods ----------------------------------
 
-  /**
-  * Returns true if "other" is not the same as "this".
-  *
-  * @param other    the object to be compared
-  * @return         true if "other" is not the same as "this"
-  * @stable ICU 2.0
-  */
-  UBool operator!=(const CollationElementIterator& other) const;
+    /**
+    * Returns true if "other" is the same as "this"
+    *
+    * @param other    the object to be compared
+    * @return         true if "other" is the same as "this"
+    * @stable ICU 2.0
+    */
+    UBool operator==(const CollationElementIterator& other) const;
 
-  /**
-  * Resets the cursor to the beginning of the string.
-  * @stable ICU 2.0
-  */
-  void reset(void);
-    
-  /**
-  * Gets the ordering priority of the next character in the string.
-  * @param status the error code status.
-  * @return the next character's ordering. otherwise returns NULLORDER if an 
-  *         error has occured or if the end of string has been reached
-  * @stable ICU 2.0
-  */
-  int32_t next(UErrorCode& status);
+    /**
+    * Returns true if "other" is not the same as "this".
+    *
+    * @param other    the object to be compared
+    * @return         true if "other" is not the same as "this"
+    * @stable ICU 2.0
+    */
+    UBool operator!=(const CollationElementIterator& other) const;
 
-  /**
-  * Get the ordering priority of the previous collation element in the string.
-  * @param status the error code status.
-  * @return the previous element's ordering. otherwise returns NULLORDER if an 
-  *         error has occured or if the start of string has been reached
-  * @stable ICU 2.0
-  */
-  int32_t previous(UErrorCode& status);
+    /**
+    * Resets the cursor to the beginning of the string.
+    * @stable ICU 2.0
+    */
+    void reset(void);
 
-  /**
-  * Gets the primary order of a collation order.
-  * @param order the collation order
-  * @return the primary order of a collation order.
-  * @stable ICU 2.0
-  */
-  static int32_t primaryOrder(int32_t order);
+    /**
+    * Gets the ordering priority of the next character in the string.
+    * @param status the error code status.
+    * @return the next character's ordering. otherwise returns NULLORDER if an 
+    *         error has occured or if the end of string has been reached
+    * @stable ICU 2.0
+    */
+    int32_t next(UErrorCode& status);
 
-  /**
-  * Gets the secondary order of a collation order.
-  * @param order the collation order
-  * @return the secondary order of a collation order.
-  * @stable ICU 2.0
-  */
-  static int32_t secondaryOrder(int32_t order);
+    /**
+    * Get the ordering priority of the previous collation element in the string.
+    * @param status the error code status.
+    * @return the previous element's ordering. otherwise returns NULLORDER if an 
+    *         error has occured or if the start of string has been reached
+    * @stable ICU 2.0
+    */
+    int32_t previous(UErrorCode& status);
 
-  /**
-  * Gets the tertiary order of a collation order.
-  * @param order the collation order
-  * @return the tertiary order of a collation order.
-  * @stable ICU 2.0
-  */
-  static int32_t tertiaryOrder(int32_t order);
+    /**
+    * Gets the primary order of a collation order.
+    * @param order the collation order
+    * @return the primary order of a collation order.
+    * @stable ICU 2.0
+    */
+    static int32_t primaryOrder(int32_t order);
 
-  /**
-  * Return the maximum length of any expansion sequences that end with the 
-  * specified comparison order.
-  * @param order a collation order returned by previous or next.
-  * @return maximum size of the expansion sequences ending with the collation 
-  *         element or 1 if collation element does not occur at the end of any 
-  *         expansion sequence
-  * @stable ICU 2.0
-  */
-  int32_t getMaxExpansion(int32_t order) const;
+    /**
+    * Gets the secondary order of a collation order.
+    * @param order the collation order
+    * @return the secondary order of a collation order.
+    * @stable ICU 2.0
+    */
+    static int32_t secondaryOrder(int32_t order);
 
-  /**
-  * Gets the comparison order in the desired strength. Ignore the other
-  * differences.
-  * @param order The order value
-  * @stable ICU 2.0
-  */
-  int32_t strengthOrder(int32_t order) const;
+    /**
+    * Gets the tertiary order of a collation order.
+    * @param order the collation order
+    * @return the tertiary order of a collation order.
+    * @stable ICU 2.0
+    */
+    static int32_t tertiaryOrder(int32_t order);
 
-  /**
-  * Sets the source string.
-  * @param str the source string.
-  * @param status the error code status.
-  * @stable ICU 2.0
-  */
-  void setText(const UnicodeString& str, UErrorCode& status);
+    /**
+    * Return the maximum length of any expansion sequences that end with the 
+    * specified comparison order.
+    * @param order a collation order returned by previous or next.
+    * @return maximum size of the expansion sequences ending with the collation 
+    *         element or 1 if collation element does not occur at the end of any 
+    *         expansion sequence
+    * @stable ICU 2.0
+    */
+    int32_t getMaxExpansion(int32_t order) const;
 
-  /**
-  * Sets the source string.
-  * @param str the source character iterator.
-  * @param status the error code status.
-  * @stable ICU 2.0
-  */
-  void setText(CharacterIterator& str, UErrorCode& status);
+    /**
+    * Gets the comparison order in the desired strength. Ignore the other
+    * differences.
+    * @param order The order value
+    * @stable ICU 2.0
+    */
+    int32_t strengthOrder(int32_t order) const;
 
-  /**
-  * Checks if a comparison order is ignorable.
-  * @param order the collation order.
-  * @return TRUE if a character is ignorable, FALSE otherwise.
-  * @stable ICU 2.0
-  */
-  static UBool isIgnorable(int32_t order);
+    /**
+    * Sets the source string.
+    * @param str the source string.
+    * @param status the error code status.
+    * @stable ICU 2.0
+    */
+    void setText(const UnicodeString& str, UErrorCode& status);
 
-  /**
-  * Gets the offset of the currently processed character in the source string.
-  * @return the offset of the character.
-  * @stable ICU 2.0
-  */
-  int32_t getOffset(void) const;
+    /**
+    * Sets the source string.
+    * @param str the source character iterator.
+    * @param status the error code status.
+    * @stable ICU 2.0
+    */
+    void setText(CharacterIterator& str, UErrorCode& status);
 
-  /**
-  * Sets the offset of the currently processed character in the source string.
-  * @param newOffset the new offset.
-  * @param status the error code status.
-  * @return the offset of the character.
-  * @stable ICU 2.0
-  */
-  void setOffset(int32_t newOffset, UErrorCode& status);
+    /**
+    * Checks if a comparison order is ignorable.
+    * @param order the collation order.
+    * @return TRUE if a character is ignorable, FALSE otherwise.
+    * @stable ICU 2.0
+    */
+    static UBool isIgnorable(int32_t order);
 
-  /**
-   * ICU "poor man's RTTI", returns a UClassID for the actual class.
-   *
-   * @draft ICU 2.2
-   */
-  virtual inline UClassID getDynamicClassID() const;
+    /**
+    * Gets the offset of the currently processed character in the source string.
+    * @return the offset of the character.
+    * @stable ICU 2.0
+    */
+    int32_t getOffset(void) const;
 
-  /**
-   * ICU "poor man's RTTI", returns a UClassID for this class.
-   *
-   * @draft ICU 2.2
-   */
-  static inline UClassID getStaticClassID();
+    /**
+    * Sets the offset of the currently processed character in the source string.
+    * @param newOffset the new offset.
+    * @param status the error code status.
+    * @return the offset of the character.
+    * @stable ICU 2.0
+    */
+    void setOffset(int32_t newOffset, UErrorCode& status);
+
+    /**
+    * ICU "poor man's RTTI", returns a UClassID for the actual class.
+    *
+    * @stable ICU 2.2
+    */
+    virtual UClassID getDynamicClassID() const;
+
+    /**
+    * ICU "poor man's RTTI", returns a UClassID for this class.
+    *
+    * @stable ICU 2.2
+    */
+    static UClassID getStaticClassID();
 
 protected:
   
-  // CollationElementIterator protected constructors --------------------------
-  /**
-  * @stable ICU 2.0
-  */
-  friend class RuleBasedCollator;
+    // CollationElementIterator protected constructors --------------------------
+    /**
+    * @stable ICU 2.0
+    */
+    friend class RuleBasedCollator;
 
-  /**
-  * CollationElementIterator constructor. This takes the source string and the 
-  * collation object. The cursor will walk thru the source string based on the 
-  * predefined collation rules. If the source string is empty, NULLORDER will 
-  * be returned on the calls to next().
-  * @param sourceText    the source string.
-  * @param order         the collation object.
-  * @param status        the error code status.
-  * @stable ICU 2.0
-  */
-  CollationElementIterator(const UnicodeString& sourceText,
-                           const RuleBasedCollator* order, UErrorCode& status);
+    /**
+    * CollationElementIterator constructor. This takes the source string and the 
+    * collation object. The cursor will walk thru the source string based on the 
+    * predefined collation rules. If the source string is empty, NULLORDER will 
+    * be returned on the calls to next().
+    * @param sourceText    the source string.
+    * @param order         the collation object.
+    * @param status        the error code status.
+    * @stable ICU 2.0
+    */
+    CollationElementIterator(const UnicodeString& sourceText,
+        const RuleBasedCollator* order, UErrorCode& status);
 
-  /**
-  * CollationElementIterator constructor. This takes the source string and the 
-  * collation object.  The cursor will walk thru the source string based on the 
-  * predefined collation rules.  If the source string is empty, NULLORDER will 
-  * be returned on the calls to next().
-  * @param sourceText    the source string.
-  * @param order         the collation object.
-  * @param status        the error code status.
-  * @stable ICU 2.0
-  */
-  CollationElementIterator(const CharacterIterator& sourceText,
-                           const RuleBasedCollator* order, UErrorCode& status);
-  
-  // CollationElementIterator protected methods -------------------------------
+    /**
+    * CollationElementIterator constructor. This takes the source string and the 
+    * collation object.  The cursor will walk thru the source string based on the 
+    * predefined collation rules.  If the source string is empty, NULLORDER will 
+    * be returned on the calls to next().
+    * @param sourceText    the source string.
+    * @param order         the collation object.
+    * @param status        the error code status.
+    * @stable ICU 2.0
+    */
+    CollationElementIterator(const CharacterIterator& sourceText,
+        const RuleBasedCollator* order, UErrorCode& status);
 
-  /**
-  * Assignment operator
-  *
-  * @param other    the object to be copied
-  * @stable ICU 2.0
-  */
-  const CollationElementIterator&
-                              operator=(const CollationElementIterator& other);
+    // CollationElementIterator protected methods -------------------------------
+
+    /**
+    * Assignment operator
+    *
+    * @param other    the object to be copied
+    * @stable ICU 2.0
+    */
+    const CollationElementIterator&
+        operator=(const CollationElementIterator& other);
 
 private:
-  CollationElementIterator(); // default constructor not implemented
+    CollationElementIterator(); // default constructor not implemented
 
-  // CollationElementIterator private data members ----------------------------
+    // CollationElementIterator private data members ----------------------------
 
-  /**
-  * Data wrapper for collation elements
-  */
-  UCollationElements *m_data_;
+    /**
+    * Data wrapper for collation elements
+    */
+    UCollationElements *m_data_;
 
-  /**
-  * Indicates if m_data_ belongs to this object.
-  */
-  UBool isDataOwned_;
+    /**
+    * Indicates if m_data_ belongs to this object.
+    */
+    UBool isDataOwned_;
 
-  /**
-   * The address of this static class variable serves as this class's ID
-   * for ICU "poor man's RTTI".
-   */
-  static const char fgClassID;
 };
 
 // CollationElementIterator inline method defination --------------------------
 
-inline UClassID
-CollationElementIterator::getStaticClassID()
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-CollationElementIterator::getDynamicClassID() const
-{ return CollationElementIterator::getStaticClassID(); }
-
 /**
 * Get the primary order of a collation order.
 * @param order the collation order
@@ -370,8 +357,8 @@
 */
 inline int32_t CollationElementIterator::primaryOrder(int32_t order)
 {
-  order &= RuleBasedCollator::PRIMARYORDERMASK;
-  return (order >> RuleBasedCollator::PRIMARYORDERSHIFT);
+    order &= RuleBasedCollator::PRIMARYORDERMASK;
+    return (order >> RuleBasedCollator::PRIMARYORDERSHIFT);
 }
 
 /**
@@ -381,8 +368,8 @@
 */
 inline int32_t CollationElementIterator::secondaryOrder(int32_t order)
 {
-  order = order & RuleBasedCollator::SECONDARYORDERMASK;
-  return (order >> RuleBasedCollator::SECONDARYORDERSHIFT);
+    order = order & RuleBasedCollator::SECONDARYORDERMASK;
+    return (order >> RuleBasedCollator::SECONDARYORDERSHIFT);
 }
 
 /**
@@ -392,17 +379,17 @@
 */
 inline int32_t CollationElementIterator::tertiaryOrder(int32_t order)
 {
-  return (order &= RuleBasedCollator::TERTIARYORDERMASK);
+    return (order &= RuleBasedCollator::TERTIARYORDERMASK);
 }
 
 inline int32_t CollationElementIterator::getMaxExpansion(int32_t order) const
 {
-  return ucol_getMaxExpansion(m_data_, (uint32_t)order);
+    return ucol_getMaxExpansion(m_data_, (uint32_t)order);
 }
 
 inline UBool CollationElementIterator::isIgnorable(int32_t order)
 {
-  return (primaryOrder(order) == RuleBasedCollator::PRIMIGNORABLE);
+    return (primaryOrder(order) == RuleBasedCollator::PRIMIGNORABLE);
 }
 
 U_NAMESPACE_END

Index: coll.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/coll.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- coll.h	10 Sep 2003 02:42:25 -0000	1.4
+++ coll.h	6 Apr 2004 10:08:57 -0000	1.5
@@ -175,608 +175,607 @@
 class U_I18N_API Collator : public UObject {
 public:
 
-  // Collator public enums -----------------------------------------------
-
-  /**
-  * Base letter represents a primary difference. Set comparison level to 
-  * PRIMARY to ignore secondary and tertiary differences.<br>
-  * Use this to set the strength of a Collator object.<br>
-  * Example of primary difference, "abc" &lt; "abd"
-  * 
[...1301 lines suppressed...]
-{
-  return (UBool)(this == &other);
-}
-
-inline UBool Collator::operator!=(const Collator& other) const
-{
-  return (UBool)!(*this == other);
-}
-
-inline UnicodeSet *Collator::getTailoredSet(UErrorCode &status) const
-{
-  if(U_FAILURE(status)) {
-    return NULL;
-  }
-  // everything can be changed
-  return new UnicodeSet(0, 0x10FFFF);
-}
 
 /*
 synwee : removed since there's no attribute to be retrieved here

Index: datefmt.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/datefmt.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- datefmt.h	10 Sep 2003 02:42:25 -0000	1.4
+++ datefmt.h	6 Apr 2004 10:08:57 -0000	1.5
@@ -167,7 +167,9 @@
         kTimezoneField,      // TIMEZONE field alignment.
         kYearWOYField,   // Corrected year for week representation
         kDOWLocalField, // localized day of week
-
+        kExtendedYearField,
+        kJulianDayField,
+        kMillisecondsInDayField,
         
         
     /**
@@ -600,7 +602,6 @@
      */
     virtual void setTimeZone(const TimeZone& zone);
 
-    
 protected:
     /**
      * Default constructor.  Creates a DateFormat with no Calendar or NumberFormat

Index: dcfmtsym.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/dcfmtsym.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- dcfmtsym.h	10 Sep 2003 02:42:25 -0000	1.4
+++ dcfmtsym.h	6 Apr 2004 10:08:57 -0000	1.5
@@ -183,7 +183,7 @@
      * @return    the format symbols by the param 'symbol'
      * @stable ICU 2.0
      */
-    UnicodeString getSymbol(ENumberFormatSymbol symbol) const;
+    inline UnicodeString getSymbol(ENumberFormatSymbol symbol) const;
 
     /**
      * Set one of the format symbols by its enum constant.
@@ -203,18 +203,25 @@
     inline Locale getLocale() const;
 
     /**
+     * Returns the locale for this object. Two flavors are available:
+     * valid and actual locale.
+     * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
+     */
+    Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
+
+    /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    virtual inline UClassID getDynamicClassID() const;
+    virtual UClassID getDynamicClassID() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for this class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    static inline UClassID getStaticClassID();
+    static UClassID getStaticClassID();
 
 private:
     DecimalFormatSymbols(); // default constructor not implemented
@@ -287,41 +294,32 @@
 
     Locale locale;
 
-    static const char fgNumberElements[];
-
-    /**
-     * The address of this static class variable serves as this class's ID
-     * for ICU "poor man's RTTI".
-     */
-    static const char fgClassID;
+    char actualLocale[ULOC_FULLNAME_CAPACITY];
+    char validLocale[ULOC_FULLNAME_CAPACITY];
 };
 
-inline UClassID
-DecimalFormatSymbols::getStaticClassID()
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-DecimalFormatSymbols::getDynamicClassID() const
-{ return DecimalFormatSymbols::getStaticClassID(); }
-
 // -------------------------------------
 
 inline UnicodeString
 DecimalFormatSymbols::getSymbol(ENumberFormatSymbol symbol) const {
-    if(symbol<kFormatSymbolCount) {
-        return fSymbols[symbol];
+    const UnicodeString *strPtr;
+    if(symbol < kFormatSymbolCount) {
+        strPtr = &fSymbols[symbol];
     } else {
-        return UnicodeString();
+        strPtr = &fNoSymbol;
     }
+    return *strPtr;
 }
 
 inline const UnicodeString &
 DecimalFormatSymbols::getConstSymbol(ENumberFormatSymbol symbol) const {
-    if(symbol<kFormatSymbolCount) {
-        return fSymbols[symbol];
+    const UnicodeString *strPtr;
+    if(symbol < kFormatSymbolCount) {
+        strPtr = &fSymbols[symbol];
     } else {
-        return fNoSymbol;
+        strPtr = &fNoSymbol;
     }
+    return *strPtr;
 }
 
 // -------------------------------------

Index: decimfmt.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/decimfmt.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- decimfmt.h	10 Sep 2003 02:42:25 -0000	1.7
+++ decimfmt.h	6 Apr 2004 10:08:57 -0000	1.8
@@ -375,6 +375,21 @@
                                   UnicodeString& appendTo,
                                   FieldPosition& pos) const;
     /**
+     * Format an int64 number using base-10 representation.
+     *
+     * @param number    The value to be formatted.
+     * @param appendTo  Output parameter to receive result.
+     *                  Result is appended to existing contents.
+     * @param pos       On input: an alignment field, if desired.
+     *                  On output: the offsets of the alignment field.
+     * @return          Reference to 'appendTo' parameter.
+     * @draft ICU 2.8
+     */
+    virtual UnicodeString& format(int64_t number,
+                                  UnicodeString& appendTo,
+                                  FieldPosition& pos) const;
+
+	/**
      * Format a Formattable using base-10 representation.
      *
      * @param obj       The value to be formatted.
@@ -433,6 +448,19 @@
     UnicodeString& format(int32_t number,
                           UnicodeString& appendTo) const;
 
+    /**
+     * Redeclared NumberFormat method.
+     * Format an int64 number. These methods call the NumberFormat
+     * pure virtual format() methods with the default FieldPosition.
+     *
+     * @param number    The value to be formatted.
+     * @param appendTo  Output parameter to receive result.
+     *                  Result is appended to existing contents.
+     * @return          Reference to 'appendTo' parameter.
+     * @draft ICU 2.8
+     */
+    UnicodeString& format(int64_t number,
+                          UnicodeString& appendTo) const;
    /**
     * Parse the given string using this object's choices. The method
     * does string comparisons to try to find an optimal match.
@@ -752,7 +780,11 @@
     virtual UBool isScientificNotation(void);
 
     /**
-     * Set whether or not scientific notation is used.
+     * Set whether or not scientific notation is used. When scientific notation
+     * is used, the effective maximum number of integer digits is <= 8.  If the
+     * maximum number of integer digits is set to more than 8, the effective
+     * maximum will be 1.  This allows this call to generate a 'default' scientific
+     * number format without additional changes.
      * @param useScientific TRUE if this object formats and parses scientific
      * notation
      * @see #isScientificNotation
@@ -1064,7 +1096,7 @@
      * currency format through the application of a new pattern.
      * @param theCurrency a 3-letter ISO code indicating new currency
      * to use.  It need not be null-terminated.
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
     virtual void setCurrency(const UChar* theCurrency);
 
@@ -1088,7 +1120,7 @@
      * @return          The class ID for all objects of this class.
      * @stable ICU 2.0
      */
-    static inline UClassID getStaticClassID(void);
+    static UClassID getStaticClassID(void);
 
     /**
      * Returns a unique class ID POLYMORPHICALLY.  Pure virtual override.
@@ -1104,10 +1136,10 @@
     virtual UClassID getDynamicClassID(void) const;
 
 private:
-    static const char fgClassID;
-
     DecimalFormat(); // default constructor not implemented
 
+	int32_t precision(UBool isIntegral) const;
+
     /**
      * Do real work of constructing a new DecimalFormat.
      */
@@ -1287,48 +1319,6 @@
     int32_t                 fFormatWidth;
     EPadPosition            fPadPosition;
 
-    // Constants for characters used in programmatic (unlocalized) patterns.
-#ifdef __BORLANDC__
-    static const UChar    kPatternZeroDigit           = 0x0030 /*'0'*/;
-    static const UChar    kPatternGroupingSeparator   = 0x002C /*','*/;
-    static const UChar    kPatternDecimalSeparator    = 0x002E /*'.'*/;
-    static const UChar    kPatternPerMill             = 0x2030;
-    static const UChar    kPatternPercent             = 0x0025 /*'%'*/;
-    static const UChar    kPatternDigit               = 0x0023 /*'#'*/;
-    static const UChar    kPatternSeparator           = 0x003B /*';'*/;
-    static const UChar    kPatternExponent            = 0x0045 /*'E'*/;
-    static const UChar    kPatternPlus                = 0x002B /*'+'*/;
-    static const UChar    kPatternMinus               = 0x002D /*'-'*/;
-    static const UChar    kPatternPadEscape           = 0x002A /*'*'*/;
-#else
-    static const UChar    kPatternZeroDigit;
-    static const UChar    kPatternGroupingSeparator;
-    static const UChar    kPatternDecimalSeparator;
-    static const UChar    kPatternPerMill;
-    static const UChar    kPatternPercent;
-    static const UChar    kPatternDigit;
-    static const UChar    kPatternSeparator;
-    static const UChar    kPatternExponent;
-    static const UChar    kPatternPlus;
-    static const UChar    kPatternMinus;
-    static const UChar    kPatternPadEscape;
-#endif
-
-    /**
-     * The CURRENCY_SIGN is the standard Unicode symbol for currency.  It
-     * is used in patterns and substitued with either the currency symbol,
-     * or if it is doubled, with the international currency symbol.  If the
-     * CURRENCY_SIGN is seen in a pattern, then the decimal separator is
-     * replaced with the monetary decimal separator.
-     */
-#ifdef __BORLANDC__
-    static const UChar    kCurrencySign               = 0x00A4;
-    static const UChar    kQuote                      = 0x0027 /*'\''*/;
-#else
-    static const UChar    kCurrencySign;
-    static const UChar    kQuote;
-#endif
-
 protected:
   /** number of integer digits 
    * @draft ICU 2.4
@@ -1338,15 +1328,18 @@
    * @draft ICU 2.4
    */  
     static const int32_t  kDoubleFractionDigits;
-};
 
-inline UClassID
-DecimalFormat::getStaticClassID(void)
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-DecimalFormat::getDynamicClassID(void) const
-{ return DecimalFormat::getStaticClassID(); }
+    /**
+     * When someone turns on scientific mode, we assume that more than this
+     * number of digits is due to flipping from some other mode that didn't
+     * restrict the maximum, and so we force 1 integer digit.  We don't bother
+     * to track and see if someone is using exponential notation with more than
+     * this number, it wouldn't make sense anyway, and this is just to make sure
+     * that someone turning on scientific mode with default settings doesn't
+     * end up with lots of zeroes.
+     */
+	static const int32_t  kMaxScientificIntegerDigits;
+};
 
 inline UnicodeString&
 DecimalFormat::format(const Formattable& obj,
@@ -1368,7 +1361,7 @@
 DecimalFormat::format(int32_t number,
                       UnicodeString& appendTo) const {
     FieldPosition pos(0);
-    return format(number, appendTo, pos);
+    return format((int64_t)number, appendTo, pos);
 }
 
 inline const UnicodeString &

Index: dtfmtsym.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/dtfmtsym.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- dtfmtsym.h	10 Sep 2003 02:42:25 -0000	1.3
+++ dtfmtsym.h	6 Apr 2004 10:08:58 -0000	1.4
@@ -311,32 +311,27 @@
     void setLocalPatternChars(const UnicodeString& newLocalPatternChars);
 
     /**
+     * Returns the locale for this object. Two flavors are available:
+     * valid and actual locale.
+     * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
+     */
+    Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
+
+    /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    virtual inline UClassID getDynamicClassID() const;
+    virtual UClassID getDynamicClassID() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for this class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    static inline UClassID getStaticClassID();
+    static UClassID getStaticClassID();
 
 private:
-    /**
-     * Tag names used by this class.
-     */
-    static const char fgErasTag[];   // resource bundle tag for era names
-    static const char fgMonthNamesTag[]; // resource bundle tag for month names
-    static const char fgMonthAbbreviationsTag[]; // resource bundle tag for month abbreviations
-    static const char fgDayNamesTag[];   // resource bundle tag for day names
-    static const char fgDayAbbreviationsTag[];   // resource bundle tag for day abbreviations
-    static const char fgAmPmMarkersTag[];    // resource bundle tag for AM/PM strings
-
-    static const char fgZoneStringsTag[];    // resource bundle tag for time zone names
-    static const char fgLocalPatternCharsTag[];  // resource bundle tag for localized pattern characters
 
     friend class SimpleDateFormat;
     friend class DateFormatSymbolsSingleSetter; // see udat.cpp
@@ -389,13 +384,13 @@
      */
     UnicodeString   fLocalPatternChars;
 
-    /**
-     * The address of this static class variable serves as this class's ID
-     * for ICU "poor man's RTTI".
+private:
+    /** valid/actual locale information 
+     *  these are always ICU locales, so the length should not be a problem
      */
-    static const char fgClassID;
+    char validLocale[ULOC_FULLNAME_CAPACITY];
+    char actualLocale[ULOC_FULLNAME_CAPACITY];
 
-private:
 
     /* Sizes for the last resort string arrays */
     typedef enum LastResortSize {
@@ -417,7 +412,7 @@
 
     DateFormatSymbols(); // default constructor not implemented
 
-    void initField(UnicodeString **field, int32_t& length, const ResourceBundle data, UErrorCode &status);
+    void initField(UnicodeString **field, int32_t& length, const ResourceBundle &data, UErrorCode &status);
     void initField(UnicodeString **field, int32_t& length, const UChar *data, LastResortSize numStr, LastResortSize strLen, UErrorCode &status);
 
     /**
@@ -509,14 +504,6 @@
      */
     void disposeZoneStrings(void);
 };
-
-inline UClassID
-DateFormatSymbols::getStaticClassID()
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-DateFormatSymbols::getDynamicClassID() const
-{ return DateFormatSymbols::getStaticClassID(); }
 
 U_NAMESPACE_END
 

Index: fieldpos.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/fieldpos.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- fieldpos.h	10 Sep 2003 02:42:25 -0000	1.3
+++ fieldpos.h	6 Apr 2004 10:08:58 -0000	1.4
@@ -50,6 +50,8 @@
  * to perform partial formatting or to get information about the
  * formatted output (such as the position of a field).
  *
+ * The FieldPosition class is not suitable for subclassing.
+ *
  * <p>
  * Below is an example of using <code>FieldPosition</code> to aid
  * alignment of an array of formatted floating-point numbers on
@@ -94,7 +96,7 @@
  *                     1.234
  *  \endcode
  * </pre>
-*/
+ */
 class U_I18N_API FieldPosition : public UObject {
 public:
     /**
@@ -136,7 +138,7 @@
      * Destructor
      * @stable ICU 2.0
      */
-    ~FieldPosition() {}
+    ~FieldPosition();
 
     /**
      * Assignment operator
@@ -162,6 +164,19 @@
     UBool              operator!=(const FieldPosition& that) const;
 
     /**
+     * Clone this object.
+     * Clones can be used concurrently in multiple threads.
+     * If an error occurs, then NULL is returned.
+     * The caller must delete the clone.
+     *
+     * @return a clone of this object
+     *
+     * @see getDynamicClassID
+     * @draft ICU 2.8
+     */
+    FieldPosition *clone() const;
+
+    /**
      * Retrieve the field identifier.
      * @return    the field identifier.
      * @stable ICU 2.0
@@ -208,16 +223,16 @@
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    virtual inline UClassID getDynamicClassID() const;
+    virtual UClassID getDynamicClassID() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for this class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    static inline UClassID getStaticClassID();
+    static UClassID getStaticClassID();
 
 private:
     /**
@@ -237,19 +252,7 @@
      * If the field does not occur in the text, 0 is returned.
      */
     int32_t fEndIndex;
-
-    /**
-     * The address of this static class variable serves as this class's ID
-     * for ICU "poor man's RTTI".
-     */
-    static const char fgClassID;
 };
-
-inline UClassID FieldPosition::getStaticClassID()
-{ return (UClassID)&fgClassID; }
-    
-inline UClassID FieldPosition::getDynamicClassID() const
-{ return FieldPosition::getStaticClassID(); }
 
 inline FieldPosition&
 FieldPosition::operator=(const FieldPosition& copy)

Index: fmtable.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/fmtable.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- fmtable.h	10 Sep 2003 02:42:25 -0000	1.3
+++ fmtable.h	6 Apr 2004 10:08:58 -0000	1.4
@@ -15,14 +15,11 @@
 #ifndef FMTABLE_H
 #define FMTABLE_H
 
-
 #include "unicode/utypes.h"
+#include "unicode/unistr.h"
 
 #if !UCONFIG_NO_FORMATTING
 
-#include "unicode/uobject.h"
-#include "unicode/unistr.h"
-
 U_NAMESPACE_BEGIN
 
 /**
@@ -40,6 +37,8 @@
  * class of a genuine hierarchy, and that would clean up the code that
  * currently must explicitly check for type, but that seems like overkill at
  * this point.
+ *
+ * The Formattable class is not suitable for subclassing.
  */
 class U_I18N_API Formattable : public UObject {
 public:
@@ -59,6 +58,7 @@
      * @draft ICU 2.4
      */
     Formattable(); // Type kLong, value 0
+
     /**
      * Creates a Formattable object with a UDate instance.
      * @param d the UDate instance.
@@ -66,18 +66,28 @@
      * @stable ICU 2.0  
      */
     Formattable(UDate d, ISDATE flag);
+
     /**
      * Creates a Formattable object with a double number.
      * @param d the double number.
      * @stable ICU 2.0
      */
     Formattable(double d);
+
     /**
      * Creates a Formattable object with a long number.
      * @param l the long number.
      * @stable ICU 2.0
      */
     Formattable(int32_t l);
+
+    /**
+     * Creates a Formattable object with an int64_t number
+     * @param ll the int64_t number.
+     * @draft ICU 2.8
+     */
+    Formattable(int64_t ll);
+
     /**
      * Creates a Formattable object with a char string pointer.
      * Assumes that the char string is null terminated.
@@ -85,18 +95,21 @@
      * @stable ICU 2.0
      */
     Formattable(const char* strToCopy);
+
     /**
      * Creates a Formattable object with a UnicodeString object to copy from.
      * @param strToCopy the UnicodeString string.
      * @stable ICU 2.0
      */
     Formattable(const UnicodeString& strToCopy);
+
     /**
      * Creates a Formattable object with a UnicodeString object to adopt from.
      * @param strToAdopt the UnicodeString string.
      * @stable ICU 2.0
      */
     Formattable(UnicodeString* strToAdopt);
+
     /**
      * Creates a Formattable object with an array of Formattable objects.
      * @param arrayToCopy the Formattable object array.
@@ -110,12 +123,14 @@
      * @stable ICU 2.0
      */
     Formattable(const Formattable&);
+
     /**
      * Assignment operator.
      * @param rhs   The Formattable object to copy into this object.
      * @stable ICU 2.0
      */
     Formattable&    operator=(const Formattable &rhs);
+
     /**
      * Equality comparison.
      * @param other    the object to be compared with.
@@ -139,17 +154,37 @@
      */
     virtual         ~Formattable();
 
+    /**
+     * Clone this object.
+     * Clones can be used concurrently in multiple threads.
+     * If an error occurs, then NULL is returned.
+     * The caller must delete the clone.
+     *
+     * @return a clone of this object
+     *
+     * @see getDynamicClassID
+     * @draft ICU 2.8
+     */
+    Formattable *clone() const;
+
     /** 
      * The list of possible data types of this Formattable object.
      * @draft ICU 2.4
      */
     enum Type {
+                /** @draft ICU 2.4 */
         kDate,      // Date
+                /** @draft ICU 2.4 */
         kDouble,    // double
+                /** @draft ICU 2.4 */
         kLong,      // long
+                /** @draft ICU 2.4 */
         kString,    // UnicodeString
-        kArray      // Formattable[]
-    };
+                /** @draft ICU 2.4 */
+        kArray,     // Formattable[]
+                /** @draft ICU 2.8 */
+                kInt64      // int64
+   };
 
     /**
      * Gets the data type of this Formattable object.
@@ -164,18 +199,73 @@
      * @stable ICU 2.0
      */ 
     double          getDouble(void) const { return fValue.fDouble; }
+
+    /**
+     * Gets the double value of this object.  This converts from long or
+     * int64 values as required (conversion from int64 can lose precision).
+     * If the type is not a numeric type, 0 is returned and the status
+     * is set to U_INVALID_FORMAT_ERROR.
+     * @param status the error code
+     * @return    the double value of this object.
+     * @draft ICU 2.8
+     */ 
+    double          getDouble(UErrorCode* status) const;
+
     /**
      * Gets the long value of this object.
      * @return    the long value of this object.
      * @stable ICU 2.0
      */ 
-    int32_t            getLong(void) const { return fValue.fLong; }
+    int32_t         getLong(void) const { return (int32_t)fValue.fInt64; }
+
+    /**
+     * Gets the long value of this object.  This converts from double or
+     * int64 values as required.  If the magnitude is too large to fit in a long,
+     * the maximum or minimum long value, as appropriate, is returned and
+     * the status is set to U_INVALID_FORMAT_ERROR.
+     * If the type is not a numeric type, 0 is returned and the status 
+     * is set to U_INVALID_FORMAT_ERROR.
+     * @param status the error code
+     * @return    the long value of this object.
+     * @stable ICU 2.0
+     */ 
+    int32_t         getLong(UErrorCode* status) const;
+
+    /**
+     * Gets the int64 value of this object.
+     * @return    the int64 value of this object.
+     * @draft ICU 2.8
+     */ 
+    int64_t         getInt64(void) const { return fValue.fInt64; }
+
+    /**
+     * Gets the int64 value of this object.  This converts from double or
+     * int64 values as required.  If the value value won't fit in an int64,
+     * the maximum or minimum in64 value, as appropriate, is returned and
+     * the status is set to U_INVALID_FORMAT_ERROR.
+     * If the type is not a numeric type, 0 is returned and the status 
+     * is set to U_INVALID_FORMAT_ERROR.
+     * @param status the error code
+     * @return    the int64 value of this object.
+     * @draft ICU 2.8
+     */ 
+    int64_t         getInt64(UErrorCode* status) const;
+
     /**
      * Gets the Date value of this object.
      * @return    the Date value of this object.
      * @stable ICU 2.0
      */ 
-    UDate            getDate(void) const { return fValue.fDate; }
+    UDate           getDate() const { return fValue.fDate; }
+
+    /**
+     * Gets the Date value of this object.
+     * @param status the error code.  If the type is not a date, status
+     * is set to U_INVALID_FORMAT_ERROR and the return value is undefined.
+     * @return    the Date value of this object.
+     * @draft ICU 2.8
+     */ 
+     UDate          getDate(UErrorCode* status) const;
 
     /**
      * Gets the string value of this object.
@@ -187,6 +277,16 @@
       { result=*fValue.fString; return result; }
 
     /**
+     * Gets the string value of this object.
+     * @param result    Output param to receive the Date value of this object.
+     * @param status    the error code.  If the type is not a string, status
+     * is set to U_INVALID_FORMAT_ERROR and the result is set to bogus.
+     * @return          A reference to 'result'.
+     * @draft ICU 2.8
+     */ 
+    UnicodeString&  getString(UnicodeString& result, UErrorCode* status) const;
+
+    /**
      * Gets a const reference to the string value of this object.
      * @return   a const reference to the string value of this object.
      * @stable ICU 2.0
@@ -194,6 +294,15 @@
     inline const UnicodeString& getString(void) const;
 
     /**
+     * Gets a const reference to the string value of this object.
+     * @param status    the error code.  If the type is not a string, status
+     * is set to U_INVALID_FORMAT_ERROR and the result is a bogus string.
+     * @return   a const reference to the string value of this object.
+     * @draft ICU 2.8
+     */
+    const UnicodeString& getString(UErrorCode* status) const;
+
+    /**
      * Gets a reference to the string value of this object.
      * @return   a reference to the string value of this object.
      * @stable ICU 2.0
@@ -201,6 +310,15 @@
     inline UnicodeString& getString(void);
 
     /**
+     * Gets a reference to the string value of this object.
+     * @param status    the error code.  If the type is not a string, status
+     * is set to U_INVALID_FORMAT_ERROR and the result is a bogus string.
+     * @return   a reference to the string value of this object.
+     * @draft ICU 2.8
+     */
+    UnicodeString& getString(UErrorCode* status);
+
+    /**
      * Gets the array value and count of this object.
      * @param count    fill-in with the count of this object.
      * @return         the array value of this object.
@@ -210,6 +328,16 @@
       { count=fValue.fArrayAndCount.fCount; return fValue.fArrayAndCount.fArray; }
 
     /**
+     * Gets the array value and count of this object.
+     * @param count    fill-in with the count of this object.
+     * @param status the error code.  If the type is not an array, status
+     * is set to U_INVALID_FORMAT_ERROR, count is set to 0, and the result is NULL.
+     * @return         the array value of this object.
+     * @draft ICU 2.8
+     */ 
+    const Formattable* getArray(int32_t& count, UErrorCode* status) const;
+
+    /**
      * Accesses the specified element in the array value of this Formattable object.
      * @param index the specified index.
      * @return the accessed element in the array.
@@ -223,24 +351,35 @@
      * @stable ICU 2.0
      */ 
     void            setDouble(double d);
+
     /**
      * Sets the long value of this object.
      * @param l    the new long value to be set.
      * @stable ICU 2.0
      */ 
     void            setLong(int32_t l);
+
+    /**
+     * Sets the int64 value of this object.
+     * @param ll    the new int64 value to be set.
+     * @draft ICU 2.8
+     */ 
+    void            setInt64(int64_t ll);
+
     /**
      * Sets the Date value of this object.
      * @param d    the new Date value to be set.
      * @stable ICU 2.0
      */ 
     void            setDate(UDate d);
+
     /**
      * Sets the string value of this object.
      * @param stringToCopy    the new string value to be set.
      * @stable ICU 2.0
      */ 
     void            setString(const UnicodeString& stringToCopy);
+
     /**
      * Sets the array value and count of this object.
      * @param array    the array value.
@@ -248,12 +387,14 @@
      * @stable ICU 2.0
      */ 
     void            setArray(const Formattable* array, int32_t count);
+
     /**
      * Sets and adopts the string value and count of this object.
      * @param stringToAdopt    the new string value to be adopted.
      * @stable ICU 2.0
      */ 
     void            adoptString(UnicodeString* stringToAdopt);
+
     /**
      * Sets and adopts the array value and count of this object.
      * @stable ICU 2.0
@@ -263,16 +404,16 @@
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    virtual inline UClassID getDynamicClassID() const;
+    virtual UClassID getDynamicClassID() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for this class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    static inline UClassID getStaticClassID();
+    static UClassID getStaticClassID();
 
 private:
     /**
@@ -290,42 +431,41 @@
      */
     static Formattable* createArrayCopy(const Formattable* array, int32_t count);
 
+    UnicodeString* getBogus() const;
+
     // Note: For now, we do not handle unsigned long and unsigned
     // double types.  Smaller unsigned types, such as unsigned
     // short, can fit within a long.
     union {
         UnicodeString*  fString;
         double          fDouble;
-        int32_t            fLong;
-        UDate            fDate;
+        int64_t         fInt64;
+        UDate           fDate;
         struct
         {
-          Formattable*  fArray;
-          int32_t          fCount;
+            Formattable*  fArray;
+            int32_t       fCount;
         }               fArrayAndCount;
     }                   fValue;
 
     Type                fType;
-
-    /**
-     * The address of this static class variable serves as this class's ID
-     * for ICU "poor man's RTTI".
-     */
-    static const char fgClassID;
+    UnicodeString       fBogus; // Bogus string when it's needed.
 };
 
-inline UClassID Formattable::getStaticClassID()
-{ return (UClassID)&fgClassID; }
-        
-inline UClassID Formattable::getDynamicClassID() const
-{ return Formattable::getStaticClassID(); }
-
 inline Formattable*
 Formattable::createArrayCopy(const Formattable* array, int32_t count)
 {
     Formattable *result = new Formattable[count];
     for (int32_t i=0; i<count; ++i) result[i] = array[i]; // Don't memcpy!
     return result;
+}
+
+inline UDate Formattable::getDate(UErrorCode* status) const {
+    if (status && U_SUCCESS(*status) && fType != kDate) {
+      *status = U_INVALID_FORMAT_ERROR;
+      return 0;
+    }
+    return fValue.fDate;
 }
 
 inline const UnicodeString& Formattable::getString(void) const {

Index: format.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/format.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- format.h	10 Sep 2003 02:42:25 -0000	1.3
+++ format.h	6 Apr 2004 10:08:58 -0000	1.4
@@ -31,8 +31,12 @@
 #include "unicode/fieldpos.h"
 #include "unicode/parsepos.h"
 #include "unicode/parseerr.h" 
+#include "unicode/locid.h"
 
 U_NAMESPACE_BEGIN
+
+class ResourceBundle;
+
 /**
  * Base class for all formats.  This is an abstract base class which
  * specifies the protocol for classes which convert other objects or
@@ -221,12 +225,7 @@
      * This method is to implement a simple version of RTTI, since not all
      * C++ compilers support genuine RTTI.  Polymorphic operator==() and
      * clone() methods call this method.
-     * <P>
      * Concrete subclasses of Format must implement getDynamicClassID()
-     * and also a static method and data member:
-     *
-     *      static UClassID getStaticClassID() { return (UClassID)&fgClassID; }
-     *      static char fgClassID;
      *
      * @return          The class ID for this object. All objects of a
      *                  given class have the same class ID.  Objects of
@@ -235,6 +234,28 @@
      */
     virtual UClassID getDynamicClassID() const = 0;
 
+    /** Get the locale for this format object. You can choose between valid and actual locale.
+     *  @param type type of the locale we're looking for (valid or actual) 
+     *  @param status error code for the operation
+     *  @return the locale
+     *  @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
+     */
+    Locale getLocale(ULocDataLocaleType type, UErrorCode& status) const;
+
+    /** Get the locale for this format object. You can choose between valid and actual locale.
+     *  @param type type of the locale we're looking for (valid or actual) 
+     *  @param status error code for the operation
+     *  @return the locale
+     *  @internal
+     */
+    const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
+
+ protected:
+    
+    void setLocales(const ResourceBundle& res);
+
+    void setLocaleIDs(const char* valid, const char* actual);
+
 protected:
     /**
      * Default constructor for subclass use only.  Does nothing.
@@ -264,6 +285,10 @@
     static void syntaxError(const UnicodeString& pattern,
                             int32_t pos,
                             UParseError& parseError);
+
+ private:
+    char actualLocale[ULOC_FULLNAME_CAPACITY];
+    char validLocale[ULOC_FULLNAME_CAPACITY];
 };
 
 U_NAMESPACE_END

Index: gregocal.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/gregocal.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- gregocal.h	10 Sep 2003 02:42:25 -0000	1.4
+++ gregocal.h	6 Apr 2004 10:08:58 -0000	1.5
@@ -16,6 +16,7 @@
 *                           Added documentation of WEEK_OF_YEAR computation.
 *   10/15/99    aliu        Fixed j32, cannot set date to Feb 29 2000 AD.
 *                           {JDK bug 4210209 4209272}
+*   11/07/2003  srl         Update, clean up documentation.
 ********************************************************************************
 */
 
@@ -66,10 +67,10 @@
  * <pre>
  * \code
  *     // get the supported ids for GMT-08:00 (Pacific Standard Time)
- *     int32_t idsCount;
- *     const UnicodeString** ids = TimeZone::createAvailableIDs(-8 * 60 * 60 * 1000, idsCount);
+ *     UErrorCode success = U_ZERO_ERROR;
+ *     const StringEnumeration *ids = TimeZone::createEnumeration(-8 * 60 * 60 * 1000);
  *     // if no ids were returned, something is wrong. get out.
- *     if (idsCount == 0) {
+ *     if (ids == 0 || ids->count(success) == 0) {
  *         return;
  *     }
  *
@@ -77,7 +78,7 @@
  *     cout << "Current Time" << endl;
  *
  *     // create a Pacific Standard Time time zone
- *     SimpleTimeZone* pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, *(ids[0]));
+ *     SimpleTimeZone* pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids->unext(NULL, success)));
  *
  *     // set up rules for daylight savings time
  *     pdt->setStartRule(Calendar::APRIL, 1, Calendar::SUNDAY, 2 * 60 * 60 * 1000);
@@ -85,7 +86,6 @@
  *
  *     // create a GregorianCalendar with the Pacific Daylight time zone
  *     // and the current date and time
- *     UErrorCode success = U_ZERO_ERROR;
  *     Calendar* calendar = new GregorianCalendar( pdt, success );
  *
  *     // print out a bunch of interesting things
@@ -130,7 +130,11 @@
  *     cout << "ZONE_OFFSET: " << (calendar->get( Calendar::ZONE_OFFSET, success )/(60*60*1000)) << endl; // in hours
  *     cout << "DST_OFFSET: " << (calendar->get( Calendar::DST_OFFSET, success )/(60*60*1000)) << endl; // in hours
  *
- *     delete[] ids;
+ *     if (U_FAILURE(success)) {
+ *         cout << "An error occured. success=" << u_errorName(success) << endl;
+ *     }
+ *
+ *     delete ids;
  *     delete calendar; // also deletes pdt
  * \endcode
  * </pre>
@@ -339,34 +343,6 @@
     virtual UBool isEquivalentTo(const Calendar& other) const;
 
     /**
-     * (Overrides Calendar) UDate Arithmetic function. Adds the specified (signed) amount
-     * of time to the given time field, based on the calendar's rules.  For more
-     * information, see the documentation for Calendar::add().
-     *
-     * @param field   The time field.
-     * @param amount  The amount of date or time to be added to the field.
-     * @param status  Output param set to success/failure code on exit. If any value
-     *                previously set in the time field is invalid, this will be set to
-     *                an error status.
-     * @deprecated ICU 2.6. Use add(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead.
-     */
-    virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
-
-    /**
-     * (Overrides Calendar) UDate Arithmetic function. Adds the specified (signed) amount
-     * of time to the given time field, based on the calendar's rules.  For more
-     * information, see the documentation for Calendar::add().
-     *
-     * @param field   The time field.
-     * @param amount  The amount of date or time to be added to the field.
-     * @param status  Output param set to success/failure code on exit. If any value
-     *                previously set in the time field is invalid, this will be set to
-     *                an error status.
-     * @draft ICU 2.6.
-     */
-    virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
-
-    /**
      * (Overrides Calendar) Rolls up or down by the given amount in the specified field.
      * For more information, see the documentation for Calendar::roll().
      *
@@ -393,82 +369,6 @@
     virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
 
     /**
-     * (Overrides Calendar) Returns minimum value for the given field. e.g. for
-     * Gregorian DAY_OF_MONTH, 1.
-     * @param field    the time field.
-     * @return         minimum value for the given field
-     * @deprecated ICU 2.6. Use getMinimum(UCalendarDateFields field) instead.
-     */
-    virtual int32_t getMinimum(EDateFields field) const;
-
-    /**
-     * (Overrides Calendar) Returns minimum value for the given field. e.g. for
-     * Gregorian DAY_OF_MONTH, 1.
-     * @param field    the time field.
-     * @return         minimum value for the given field
-     * @draft ICU 2.6.
-     */
-    virtual int32_t getMinimum(UCalendarDateFields field) const;
-
-    /**
-     * (Overrides Calendar) Returns maximum value for the given field. e.g. for
-     * Gregorian DAY_OF_MONTH, 31.
-     * @param field    the time field.
-     * @return         maximum value for the given field
-     * @deprecated ICU 2.6. Use getMaximum(UCalendarDateFields field) instead.
-     */
-    virtual int32_t getMaximum(EDateFields field) const;
-
-    /**
-     * (Overrides Calendar) Returns maximum value for the given field. e.g. for
-     * Gregorian DAY_OF_MONTH, 31.
-     * @param field    the time field.
-     * @return         maximum value for the given field
-     * @draft ICU 2.6.
-     */
-    virtual int32_t getMaximum(UCalendarDateFields field) const;
-
-    /**
-     * (Overrides Calendar) Returns highest minimum value for the given field if varies.
-     * Otherwise same as getMinimum(). For Gregorian, no difference.
-     * @param field    the time field.
-     * @return         highest minimum value for the given field if varies.
-     *                 Otherwise same as getMinimum().
-     * @deprecated ICU 2.6. Use getGreatestMinimum(UCalendarDateFields field) instead.
-     */
-    virtual int32_t getGreatestMinimum(EDateFields field) const;
-
-    /**
-     * (Overrides Calendar) Returns highest minimum value for the given field if varies.
-     * Otherwise same as getMinimum(). For Gregorian, no difference.
-     * @param field    the time field.
-     * @return         highest minimum value for the given field if varies.
-     *                 Otherwise same as getMinimum().
-     * @draft ICU 2.6.
-     */
-    virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
-
-    /**
-     * (Overrides Calendar) Returns lowest maximum value for the given field if varies.
-     * Otherwise same as getMaximum(). For Gregorian DAY_OF_MONTH, 28.
-     * @param field    the time field.
-     * @return         lowest maximum value for the given field if varies.
-     *                 Otherwise same as getMaximum(). 
-     * @deprecated ICU 2.6. Use getLeastMaximum(UCalendarDateFields field) instead.
-     */
-    virtual int32_t getLeastMaximum(EDateFields field) const;
-
-    /**
-     * (Overrides Calendar) Returns lowest maximum value for the given field if varies.
-     * Otherwise same as getMaximum(). For Gregorian DAY_OF_MONTH, 28.
-     * @param field    the time field.
-     * @return         lowest maximum value for the given field if varies.
-     *                 Otherwise same as getMaximum(). 
-     * @draft ICU 2.6.
-     */
-    virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
-
-    /**
      * Return the minimum value that this field could have, given the current date.
      * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum().
      * @param field    the time field.
@@ -504,9 +404,9 @@
      * for some years the actual maximum for MONTH is 12, and for others 13.
      * @param field    the time field.
      * @return         the maximum value that this field could have, given the current date.
-     * @draft ICU 2.6.
+     * @draft ICU 2.6
      */
-    int32_t getActualMaximum(UCalendarDateFields field) const;
+    virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
 
     /**
      * (Overrides Calendar) Return true if the current date for this Calendar is in
@@ -544,7 +444,7 @@
      * @return   The class ID for all objects of this class.
      * @stable ICU 2.0
      */
-    static inline UClassID getStaticClassID(void);
+    static UClassID getStaticClassID(void);
 
     /**
      * Get the calendar type, "gregorian", for use in DateFormatSymbols.
@@ -557,56 +457,66 @@
 protected:
 
     /**
-     * Called by computeFields. Converts calendar's year into Gregorian Extended Year (where negative = BC)
-     * @return Current year in Gregorian years,  where  -3  means 4 BC (1-bcyear) 
-     * @internal
+     * (Overrides Calendar) Converts GMT as milliseconds to time field values.
+     * @param status Fill-in parameter which receives the status of this operation.
+     * @stable ICU 2.0
      */
-    virtual int32_t getGregorianYear(UErrorCode &status) const;
 
+ private:
+    GregorianCalendar(); // default constructor not implemented
+
+ protected:
     /**
-     * Called by computeJulianDay.  Returns the default month (0-based) for the year,
-     * taking year and era into account.  Defaults to 0 for Gregorian, which doesn't care.
+     * Return the ERA.  We need a special method for this because the
+     * default ERA is AD, but a zero (unset) ERA is BC.
+     * @return    the ERA.
      * @internal
      */
-    virtual inline int32_t getDefaultMonthInYear() const { return 0; }
-
+    virtual int32_t internalGetEra() const;
 
     /**
-     * Called by computeJulianDay.  Returns the default day (1-based) for the month,
-     * taking currently-set year and era into account.  Defaults to 1 for Gregorian, which doesn't care. 
+     * Return the Julian day number of day before the first day of the
+     * given month in the given extended year.  Subclasses should override
+     * this method to implement their calendar system.
+     * @param eyear the extended year
+     * @param month the zero-based month, or 0 if useMonth is false
+     * @param useMonth if false, compute the day before the first day of
+     * the given year, otherwise, compute the day before the first day of
+     * the given month
+     * @param return the Julian day number of the day before the first
+     * day of the given month and year
      * @internal
      */
-    virtual inline int32_t getDefaultDayInMonth(int32_t /*month*/) const { return 1; }
+    virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
+                                                   UBool useMonth) const;
 
     /**
-     * (Overrides Calendar) Converts GMT as milliseconds to time field values.
-     * @param status Fill-in parameter which receives the status of this operation.
-     * @stable ICU 2.0
+     * Subclasses may override this.  This method calls
+     * handleGetMonthLength() to obtain the calendar-specific month
+     * length.
+     * @param bestField which field to use to calculate the date 
+     * @return julian day specified by calendar fields.
+     * @internal
      */
-    virtual void computeFields(UErrorCode& status);
+    virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField)  ;
 
     /**
-     * (Overrides Calendar) Converts Calendar's time field values to GMT as
-     * milliseconds.
-     *
-     * @param status  Output param set to success/failure code on exit. If any value
-     *                previously set in the time field is invalid, this will be set to
-     *                an error status.
-     * @stable ICU 2.0
+     * Return the number of days in the given month of the given extended
+     * year of this calendar system.  Subclasses should override this
+     * method if they can provide a more correct or more efficient
+     * implementation than the default implementation in Calendar.
+     * @internal
      */
-    virtual void computeTime(UErrorCode& status);
-
- private:
-    GregorianCalendar(); // default constructor not implemented
+    virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const;
 
- protected:
     /**
-     * Return the ERA.  We need a special method for this because the
-     * default ERA is AD, but a zero (unset) ERA is BC.
-     * @return    the ERA.
-     * @internal
+     * Return the number of days in the given extended year of this
+     * calendar system.  Subclasses should override this method if they can
+     * provide a more correct or more efficient implementation than the
+     * default implementation in Calendar.
+     * @stable ICU 2.0
      */
-    virtual int32_t internalGetEra() const;
+    virtual int32_t handleGetYearLength(int32_t eyear) const;
 
     /**
      * return the length of the given month.
@@ -659,17 +569,64 @@
     virtual UDate getEpochDay(UErrorCode& status);
 
     /**
-     * Compute the date-based fields given the milliseconds since the epoch start. Do
-     * not compute the time-based fields (HOUR, MINUTE, etc.).
+     * Subclass API for defining limits of different types.
+     * Subclasses must implement this method to return limits for the
+     * following fields:
      *
-     * @param theTime the time in wall millis (either Standard or DST),
-     * whichever is in effect
-     * @param quick if true, only compute the ERA, YEAR, MONTH, DATE,
-     * DAY_OF_WEEK, and DAY_OF_YEAR.
-     * @param status Fill-in parameter which receives the status of this operation.
+     * <pre>UCAL_ERA
+     * UCAL_YEAR
+     * UCAL_MONTH
+     * UCAL_WEEK_OF_YEAR
+     * UCAL_WEEK_OF_MONTH
+     * UCAL_DATE (DAY_OF_MONTH on Java)
+     * UCAL_DAY_OF_YEAR
+     * UCAL_DAY_OF_WEEK_IN_MONTH
+     * UCAL_YEAR_WOY
+     * UCAL_EXTENDED_YEAR</pre>
+     *
+     * @param field one of the above field numbers
+     * @param limitType one of <code>MINIMUM</code>, <code>GREATEST_MINIMUM</code>,
+     * <code>LEAST_MAXIMUM</code>, or <code>MAXIMUM</code>
      * @internal
      */
-    virtual void timeToFields(UDate theTime, UBool quick, UErrorCode& status);
+    virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const;
+
+    /**
+     * Return the extended year defined by the current fields.  This will
+     * use the UCAL_EXTENDED_YEAR field or the UCAL_YEAR and supra-year fields (such
+     * as UCAL_ERA) specific to the calendar system, depending on which set of
+     * fields is newer.
+     * @return the extended year
+     * @internal
+     */
+    virtual int32_t handleGetExtendedYear();
+
+    /** 
+     * Subclasses may override this to convert from week fields 
+     * (YEAR_WOY and WEEK_OF_YEAR) to an extended year in the case
+     * where YEAR, EXTENDED_YEAR are not set.
+     * The Gregorian implementation assumes a yearWoy in gregorian format, according to the current era.
+     * @return the extended year, UCAL_EXTENDED_YEAR
+     */
+    virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
+
+
+    /**
+     * Subclasses may override this method to compute several fields
+     * specific to each calendar system.  These are:
+     *
+     * <ul><li>ERA
+     * <li>YEAR
+     * <li>MONTH
+     * <li>DAY_OF_MONTH
+     * <li>DAY_OF_YEAR
+     * <li>EXTENDED_YEAR</ul>
+     *
+     * <p>The GregorianCalendar implementation implements
+     * a calendar with the specified Julian/Gregorian cutover date.
+     * @internal
+     */
+    virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
 
  private:
     /**
@@ -683,59 +640,6 @@
                                          UBool& isLeap);
     
     /**
-     * Compute the day of week, relative to the first day of week, from
-     * 0..6, of the current DOW_LOCAL or DAY_OF_WEEK fields.  This is
-     * equivalent to get(DOW_LOCAL) - 1.
-     * @return    the day of week, relative to the first day of week.
-     */
-    int32_t computeRelativeDOW() const;
-    
-    /**
-     * Compute the day of week, relative to the first day of week,
-     * from 0..6 of the given julian day.
-     * @param julianDay    the given julian day.
-     * @return             the day of week, relative to the first day of week.
-     */
-    int32_t computeRelativeDOW(double julianDay) const;
-
-    /**
-     * Compute the DOY using the WEEK_OF_YEAR field and the julian day
-     * of the day BEFORE January 1 of a year (a return value from
-     * computeJulianDayOfYear).
-     * @param julianDayOfYear  the given julian day of the day BEFORE 
-     *                         January 1 of a year.
-     * @return the DOY using the WEEK_OF_YEAR field.
-     */
-    int32_t computeDOYfromWOY(double julianDayOfYear) const;
-
-    /**
-     * Compute the Julian day number under either the Gregorian or the
-     * Julian calendar, using the given year and the remaining fields.
-     * @param isGregorian if true, use the Gregorian calendar
-     * @param year the adjusted year number, with 0 indicating the
-     * year 1 BC, -1 indicating 2 BC, etc.
-     * @return the Julian day number
-     */
-    double computeJulianDay(UBool isGregorian, int32_t year);
-
-
-    /**
-     * Return the week number of a day, within a period. This may be the week number in
-     * a year, or the week number in a month. Usually this will be a value >= 1, but if
-     * some initial days of the period are excluded from week 1, because
-     * minimalDaysInFirstWeek is > 1, then the week number will be zero for those
-     * initial days. Requires the day of week for the given date in order to determine
-     * the day of week of the first day of the period.
-     *
-     * @param date  Day-of-year or day-of-month. Should be 1 for first day of period.
-     * @param day   Day-of-week for given dayOfPeriod. 1-based with 1=Sunday.
-     * @return      Week number, one-based, or zero if the day falls in part of the
-     *              month before the first week, when there are days before the first
-     *              week because the minimum days in the first week is more than one.
-     */
-    int32_t weekNumber(int32_t date, int32_t day);
-
-    /**
      * Validates the values of the set time fields.  True if they're all valid.
      * @return    True if the set time fields are all valid.
      */
@@ -762,12 +666,17 @@
      * milliseconds from the standard epoch.  Default is October 15, 1582
      * (Gregorian) 00:00:00 UTC, that is, October 4, 1582 (Julian) is followed
      * by October 15, 1582 (Gregorian).  This corresponds to Julian day number
-     * 2299161.
+     * 2299161. This is measured from the standard epoch, not in Julian Days.
+     * @internal
      */
-    // This is measured from the standard epoch, not in Julian Days.
     UDate                fGregorianCutover;
 
     /**
+     * Julian day number of the Gregorian cutover
+     */
+    int32_t             fCutoverJulianDay;
+
+    /**
      * Midnight, local time (using this Calendar's TimeZone) at or before the
      * gregorianCutover. This is a pure date value with no time of day or
      * timezone component.
@@ -780,7 +689,11 @@
      */
     int32_t fGregorianCutoverYear;// = 1582;
 
-    static const char fgClassID;
+    /**
+     * The year of the gregorianCutover, with 0 representing
+     * 1 BC, -1 representing 2 BC, etc.
+     */
+    int32_t fGregorianCutoverJulianDay;// = 2299161;
 
     /**
      * Converts time as milliseconds to Julian date. The Julian date used here is not a
@@ -801,70 +714,18 @@
     static UDate julianDayToMillis(double julian);
 
     /**
-     * Convert a quasi Julian date to the day of the week. The Julian date used here is
-     * not a true Julian date, since it is measured from midnight, not noon. Return
-     * value is one-based.
-     *
-     * @param julian  The given Julian date number.
-     * @return   Day number from 1..7 (SUN..SAT).
-     */
-    static uint8_t julianDayToDayOfWeek(double julian);
-
-    /**
-     * Divide two long integers, returning the floor of the quotient.
-     * <p>
-     * Unlike the built-in division, this is mathematically well-behaved.
-     * E.g., <code>-1/4</code> => 0
-     * but <code>floorDivide(-1,4)</code> => -1.
-     * @param numerator the numerator
-     * @param denominator a divisor which must be > 0
-     * @return the floor of the quotient.
-     */
-    static double floorDivide(double numerator, double denominator);
-
-    /**
-     * Divide two integers, returning the floor of the quotient.
-     * <p>
-     * Unlike the built-in division, this is mathematically well-behaved.
-     * E.g., <code>-1/4</code> => 0
-     * but <code>floorDivide(-1,4)</code> => -1.
-     * @param numerator the numerator
-     * @param denominator a divisor which must be > 0
-     * @return the floor of the quotient.
+     * Used by handleComputeJulianDay() and handleComputeMonthStart().
+     * Temporary field indicating whether the calendar is currently Gregorian as opposed to Julian.
      */
-    static int32_t floorDivide(int32_t numerator, int32_t denominator);
+    UBool fIsGregorian;
 
     /**
-     * Divide two integers, returning the floor of the quotient, and
-     * the modulus remainder.
-     * <p>
-     * Unlike the built-in division, this is mathematically well-behaved.
-     * E.g., <code>-1/4</code> => 0 and <code>-1%4</code> => -1,
-     * but <code>floorDivide(-1,4)</code> => -1 with <code>remainder[0]</code> => 3.
-     * @param numerator the numerator
-     * @param denominator a divisor which must be > 0
-     * @param remainder an array of at least one element in which the value
-     * <code>numerator mod denominator</code> is returned. Unlike <code>numerator
-     * % denominator</code>, this will always be non-negative.
-     * @return the floor of the quotient.
+     * Used by handleComputeJulianDay() and handleComputeMonthStart().
+     * Temporary field indicating that the sense of the gregorian cutover should be inverted
+     * to handle certain calculations on and around the cutover date.
      */
-    static int32_t floorDivide(int32_t numerator, int32_t denominator, int32_t remainder[]);
+    UBool fInvertGregorian;
 
-    /**
-     * Divide two integers, returning the floor of the quotient, and
-     * the modulus remainder.
-     * <p>
-     * Unlike the built-in division, this is mathematically well-behaved.
-     * E.g., <code>-1/4</code> => 0 and <code>-1%4</code> => -1,
-     * but <code>floorDivide(-1,4)</code> => -1 with <code>remainder[0]</code> => 3.
-     * @param numerator the numerator
-     * @param denominator a divisor which must be > 0
-     * @param remainder an array of at least one element in which the value
-     * <code>numerator mod denominator</code> is returned. Unlike <code>numerator
-     * % denominator</code>, this will always be non-negative.
-     * @return the floor of the quotient.
-     */
-    static int32_t floorDivide(double numerator, int32_t denominator, int32_t remainder[]);
 
  public: // internal implementation
 
@@ -906,9 +767,9 @@
     static const int32_t    fgSystemDefaultCenturyYear;
 
     /**
-     * TODO: (ICU 2.8) use this value instead of SimpleDateFormat::fgSystemDefaultCentury
+     * Default value that indicates the UDate of the beginning of the system default century
      */
-    //static const UDate        fgSystemDefaultCentury;
+    static const UDate        fgSystemDefaultCentury;
 
     /**
      * Returns the beginning date of the 100-year window that dates with 2-digit years
@@ -933,24 +794,6 @@
     static void  initializeSystemDefaultCentury(void);
 
 };
-
-inline UClassID
-GregorianCalendar::getStaticClassID(void)
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-GregorianCalendar::getDynamicClassID(void) const
-{ return GregorianCalendar::getStaticClassID(); }
-
-inline uint8_t GregorianCalendar::julianDayToDayOfWeek(double julian)
-{
-  // If julian is negative, then julian%7 will be negative, so we adjust
-  // accordingly.  We add 1 because Julian day 0 is Monday.
-  int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7);
-
-  uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7 + UCAL_SUNDAY) : UCAL_SUNDAY));
-  return result;
-}
 
 U_NAMESPACE_END
 

Index: msgfmt.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/msgfmt.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- msgfmt.h	10 Sep 2003 02:42:25 -0000	1.3
+++ msgfmt.h	6 Apr 2004 10:08:58 -0000	1.4
@@ -593,10 +593,9 @@
      * @return          The class ID for all objects of this class.
      * @stable ICU 2.0
      */
-    static inline UClassID getStaticClassID(void);
+    static UClassID getStaticClassID(void);
     
 private:
-    static const char fgClassID;
 
     Locale              fLocale;
     UnicodeString       fPattern;
@@ -605,7 +604,7 @@
 
     MessageFormat(); // default constructor not implemented
 
-    /**
+    /*
      * A structure representing one subformat of this MessageFormat.
      * Each subformat has a Format object, an offset into the plain
      * pattern text fPattern, and an argument number.  The argument
@@ -768,15 +767,6 @@
     friend class MessageFormatAdapter; // getFormatTypeList() access
 };
 
-inline UClassID
-MessageFormat::getStaticClassID(void)
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-MessageFormat::getDynamicClassID() const
-{ return MessageFormat::getStaticClassID(); }
-
-
 inline UnicodeString&
 MessageFormat::format(const Formattable& obj,
                       UnicodeString& appendTo,
@@ -789,3 +779,4 @@
 
 #endif // _MSGFMT
 //eof
+

Index: numfmt.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/numfmt.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- numfmt.h	10 Sep 2003 02:42:25 -0000	1.4
+++ numfmt.h	6 Apr 2004 10:08:58 -0000	1.5
@@ -248,6 +248,19 @@
                             UnicodeString& appendTo) const;
 
     /**
+     * Format an int64 number. These methods call the NumberFormat
+     * pure virtual format() methods with the default FieldPosition.
+     *
+     * @param number    The value to be formatted.
+     * @param appendTo  Output parameter to receive result.
+     *                  Result is appended to existing contents.
+     * @return          Reference to 'appendTo' parameter.
+     * @draft ICU 2.8
+     */
+    UnicodeString& format(  int64_t number,
+                            UnicodeString& appendTo) const;
+
+    /**
      * Format a double number. Concrete subclasses must implement
      * these pure virtual methods.
      *
@@ -279,6 +292,22 @@
                                   FieldPosition& pos) const = 0;
 
     /**
+     * Format an int64 number. (Not abstract to retain compatibility
+	 * with earlier releases, however subclasses should override this
+	 * method as it just delegates to format(int32_t number...);
+     *
+     * @param number    The value to be formatted.
+     * @param appendTo  Output parameter to receive result.
+     *                  Result is appended to existing contents.
+     * @param pos       On input: an alignment field, if desired.
+     *                  On output: the offsets of the alignment field.
+     * @return          Reference to 'appendTo' parameter.
+     * @draft ICU 2.8
+    */
+    virtual UnicodeString& format(int64_t number,
+                                  UnicodeString& appendTo,
+                                  FieldPosition& pos) const;
+    /**
      * Redeclared Format method.
      * @param obj       The object to be formatted.
      * @param appendTo  Output parameter to receive result.
@@ -590,19 +619,6 @@
 public:
 
     /**
-     * Return the class ID for this class.  This is useful only for
-     * comparing to a return value from getDynamicClassID().  For example:
-     * <pre>
-     * .   Base* polymorphic_pointer = createPolymorphicObject();
-     * .   if (polymorphic_pointer->getDynamicClassID() ==
-     * .       Derived::getStaticClassID()) ...
-     * </pre>
-     * @return The class ID for all objects of this class.
-     * @stable ICU 2.0
-     */
-    static inline UClassID getStaticClassID(void);
-
-    /**
      * Returns a unique class ID POLYMORPHICALLY.  Pure virtual override.
      * This method is to implement a simple version of RTTI, since not all
      * C++ compilers support genuine RTTI.  Polymorphic operator==() and
@@ -640,7 +656,6 @@
     static const int32_t fgMinIntegerDigits;
 
 private:
-    static const char fgClassID;
 
     enum EStyles {
         kNumberStyle,
@@ -682,8 +697,8 @@
     // ISO currency code
     UChar      currency[4];
 
-	friend class ICUNumberFormatFactory; // access to makeInstance, EStyles
-	friend class ICUNumberFormatService;
+    friend class ICUNumberFormatFactory; // access to makeInstance, EStyles
+    friend class ICUNumberFormatService;
 };
 
 /**
@@ -710,7 +725,7 @@
      * is returned in count;
      * @draft ICU 2.6
      */
-    virtual const UnicodeString * const getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
+    virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const = 0;
 
     /**
      * Return a number format of the appropriate type.  If the locale
@@ -760,7 +775,7 @@
     /**
      * @draft ICU 2.6
      */
-    virtual const UnicodeString * const getSupportedIDs(int32_t &count, UErrorCode& status) const 
+    virtual const UnicodeString * getSupportedIDs(int32_t &count, UErrorCode& status) const 
       {
         if (U_SUCCESS(status)) {
           count = 1;
@@ -773,10 +788,6 @@
 
 
 // -------------------------------------
-
-inline UClassID
-NumberFormat::getStaticClassID(void)
-{ return (UClassID)&fgClassID; }
 
 inline UBool
 NumberFormat::isParseIntegerOnly() const

Index: rbnf.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/rbnf.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- rbnf.h	10 Sep 2003 02:42:25 -0000	1.4
+++ rbnf.h	6 Apr 2004 10:08:58 -0000	1.5
@@ -787,31 +787,39 @@
    */
   virtual void setDefaultRuleSet(const UnicodeString& ruleSetName, UErrorCode& status);
 
-private:
-  RuleBasedNumberFormat(); // default constructor not implemented
+public:
+    /**
+     * ICU "poor man's RTTI", returns a UClassID for this class.
+     *
+     * @stable ICU 2.8
+     */
+    static UClassID getStaticClassID(void);
 
-  void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
-  void dispose();
-  void stripWhitespace(UnicodeString& src);
-  void initDefaultRuleSet();
-  void format(double number, NFRuleSet& ruleSet);
-  NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
+    /**
+     * ICU "poor man's RTTI", returns a UClassID for the actual class.
+     *
+     * @stable ICU 2.8
+     */
+    virtual UClassID getDynamicClassID(void) const;
 
-  /* friend access */
-  friend class NFSubstitution;
-  friend class NFRule;
-  friend class FractionalPartSubstitution;
+private:
+    RuleBasedNumberFormat(); // default constructor not implemented
 
-  inline NFRuleSet * getDefaultRuleSet() const;
-  Collator * getCollator() const;
-  DecimalFormatSymbols * getDecimalFormatSymbols() const;
+    void init(const UnicodeString& rules, UParseError& perror, UErrorCode& status);
+    void dispose();
+    void stripWhitespace(UnicodeString& src);
+    void initDefaultRuleSet();
+    void format(double number, NFRuleSet& ruleSet);
+    NFRuleSet* findRuleSet(const UnicodeString& name, UErrorCode& status) const;
 
-private:
-    static const char fgClassID;
+    /* friend access */
+    friend class NFSubstitution;
+    friend class NFRule;
+    friend class FractionalPartSubstitution;
 
-public:
-    static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
-    virtual UClassID getDynamicClassID(void) const { return getStaticClassID(); }
+    inline NFRuleSet * getDefaultRuleSet() const;
+    Collator * getCollator() const;
+    DecimalFormatSymbols * getDecimalFormatSymbols() const;
 
 private:
     NFRuleSet **ruleSets;

Index: regex.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/regex.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- regex.h	10 Sep 2003 02:42:25 -0000	1.1
+++ regex.h	6 Apr 2004 10:08:58 -0000	1.2
@@ -16,6 +16,7 @@
 #ifndef REGEX_H
 #define REGEX_H
 
+// #define REGEX_DEBUG
 
 /**
  * \file
@@ -50,11 +51,14 @@
 // Forward Declarations...
 
 class RegexMatcher;
+class RegexPattern;
 class UVector;
 class UVector32;
 class UnicodeSet;
 struct REStackFrame;
 struct Regex8BitSet;
+class  RuleBasedBreakIterator;
+
 
 
 /**
@@ -79,11 +83,34 @@
       *    If set, recognize line terminators within string,
       *    otherwise, match only at start and end of input string.
       *   @draft ICU 2.4 */
-    UREGEX_MULTILINE        = 8
+    UREGEX_MULTILINE        = 8,
+
+    /**  Unicode word boundaries.
+      *     If set, \b uses the Unicode TR 29 definition of word boundaries.
+      *     Warning: Unicode word boundaries are quite different from
+      *     traditional regular expression word boundaries.  See
+      *     http://unicode.org/reports/tr29/#Word_Boundaries
+      *     @draft ICU 2.8
+      */
+    UREGEX_UWORD            = 256
 };
 
 
 
+
+/**
+ *   RBBIPatternDump   Debug function, displays the compiled form of a pattern.
+ *   @internal
+ */
+#ifdef REGEX_DEBUG
+U_CAPI void U_EXPORT2
+    RegexPatternDump(const RegexPattern *pat);
+#else
+    #define RegexPatternDump(pat)
+#endif
+
+
+
 /**
   * Class <code>RegexPattern</code> represents a compiled regular expression.  It includes
   * factory methods for creating a RegexPattern object from the source (string) form
@@ -326,26 +353,19 @@
         UErrorCode       &status) const;
 
 
-
-    /**
-     *   dump   Debug function, displays the compiled form of a pattern.
-     *   @internal
-     */
-    void dump() const;
-
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
      *
      * @draft ICU 2.4
      */
-    virtual inline UClassID getDynamicClassID() const; 
+    virtual UClassID getDynamicClassID() const; 
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for this class.
      *
      * @draft ICU 2.4
      */
-    static inline UClassID getStaticClassID(); 
+    static UClassID getStaticClassID(); 
 
 private:
     //
@@ -395,12 +415,6 @@
     UChar32         fInitialChar;
     Regex8BitSet   *fInitialChars8;
 
-    /**
-     * The address of this static class variable serves as this class's ID
-     * for ICU "poor man's RTTI".
-     */
-    static const char fgClassID;
-
     friend class RegexCompile;
     friend class RegexMatcher;
 
@@ -409,19 +423,15 @@
     //
     void        init();            // Common initialization, for use by constructors.
     void        zap();             // Common cleanup
+#ifdef REGEX_DEBUG
     void        dumpOp(int32_t index) const;
-
+    friend     void RegexPatternDump(const RegexPattern *);
+#endif
 
 };
 
 
 
-
-
-
-
-
-
 /**
  *  class RegexMatcher bundles together a reular expression pattern and
  *  input text to which the expression can be applied.  It includes methods
@@ -485,6 +495,17 @@
     */
     virtual UBool matches(UErrorCode &status);
 
+   /**
+    *   Attempts to match the input string, beginning at startIndex, against the pattern.
+    *   The match must extend to the end of the input string.
+    *    @param   startIndex The input string index at which to begin matching.
+    *    @param   status     A reference to a UErrorCode to receive any errors.
+    *    @return TRUE if there is a match
+    *    @draft ICU 2.8
+    */
+    virtual UBool matches(int32_t startIndex, UErrorCode &status);
+
+
 
 
    /**
@@ -502,6 +523,21 @@
     virtual UBool lookingAt(UErrorCode &status);
 
 
+  /**
+    *   Attempts to match the input string, starting from the specified index, against the pattern.
+    *   The match may be of any length, and is not required to extend to the end
+    *   of the input string.  Contrast with match().
+    *
+    *   <p>If the match succeeds then more information can be obtained via the <code>start()</code>,
+    *     <code>end()</code>, and <code>group()</code> functions.</p>
+    *
+    *    @param   startIndex The input string index at which to begin matching.
+    *    @param   status     A reference to a UErrorCode to receive any errors.
+    *    @return  TRUE if there is a match.
+    *    @draft ICU 2.8
+    */
+    virtual UBool lookingAt(int32_t startIndex, UErrorCode &status);
+
    /**
     *  Find the next pattern match in the input string.
     *  The find begins searching the input at the location following the end of
@@ -630,6 +666,18 @@
 
 
    /**
+    *   Resets this matcher, and set the current input position.
+    *   The effect is to remove any memory of previous matches,
+    *       and to cause subsequent find() operations to begin at 
+    *       the specified position in the input string.
+    *
+    *   @return this RegexMatcher.
+    *   @draft ICU 2.8
+    */
+    virtual RegexMatcher &reset(int32_t index, UErrorCode &status);
+
+
+   /**
     *   Resets this matcher with a new input string.  This allows instances of RegexMatcher
     *     to be reused, which is more efficient than creating a new RegexMatcher for
     *     each input string to be processed.
@@ -784,16 +832,16 @@
     /**
     * ICU "poor man's RTTI", returns a UClassID for this class.
     *
-    * @draft ICU 2.2
+    * @stable ICU 2.2
     */
-    static inline UClassID getStaticClassID();
+    static UClassID getStaticClassID();
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    virtual inline UClassID getDynamicClassID() const;
+    virtual UClassID getDynamicClassID() const;
 
 private:
     // Constructors and other object boilerplate are private.
@@ -811,7 +859,8 @@
     //
     void                 MatchAt(int32_t startIdx, UErrorCode &status);
     inline void          backTrack(int32_t &inputIdx, int32_t &patIdx);
-    UBool                isWordBoundary(int32_t pos);         // perform the \b test
+    UBool                isWordBoundary(int32_t pos);         // perform Perl-like  \b test
+    UBool                isUWordBoundary(int32_t pos);        // perform RBBI based \b test
     REStackFrame        *resetStack();
     inline REStackFrame *StateSave(REStackFrame *fp, int32_t savePatIdx,
                                    int32_t frameSize, UErrorCode &status);
@@ -840,21 +889,9 @@
     UErrorCode          fDeferredStatus;   // Save error state if that cannot be immediately
                                            //   reported, or that permanently disables this matcher.
 
-    /**
-     * The address of this static class variable serves as this class's ID
-     * for ICU "poor man's RTTI".
-     */
-    static const char   fgClassID;
-
+    RuleBasedBreakIterator  *fWordBreakItr;
 
 };
-
-inline UClassID RegexPattern::getStaticClassID() { return (UClassID)&fgClassID; }
-inline UClassID RegexPattern::getDynamicClassID() const { return getStaticClassID(); }
-
-inline UClassID RegexMatcher::getStaticClassID() { return (UClassID)&fgClassID; }
-inline UClassID RegexMatcher::getDynamicClassID() const { return getStaticClassID(); }
-
 
 U_NAMESPACE_END
 #endif  // UCONFIG_NO_REGULAR_EXPRESSIONS

Index: search.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/search.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- search.h	10 Sep 2003 02:42:25 -0000	1.5
+++ search.h	6 Apr 2004 10:08:58 -0000	1.6
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (C) 2001 IBM and others. All rights reserved.
+*   Copyright (C) 2001-2003 IBM and others. All rights reserved.
 **********************************************************************
 *   Date        Name        Description
 *  03/22/2000   helena      Creation.
@@ -100,7 +100,7 @@
      * string accordingly without checking if the index is pointing to a 
      * valid starting point to begin searching. 
      * @param position within the text to be set. If position is less
-     * 			than or greater than the text range for searching, 
+     *             than or greater than the text range for searching, 
      *          an U_INDEX_OUTOFBOUNDS_ERROR will be returned
      * @param status for errors if it occurs
      * @stable ICU 2.0
@@ -307,7 +307,7 @@
      * <tt>USEARCH_DONE</tt> will be returned and the iterator will be 
      * adjusted to the index USEARCH_DONE
      * @param  position where search if to start from. If position is less
-     * 			than or greater than the text range for searching, 
+     *             than or greater than the text range for searching, 
      *          an U_INDEX_OUTOFBOUNDS_ERROR will be returned
      * @param  status for errors if it occurs
      * @return The character index of the first match following 
@@ -341,7 +341,7 @@
      * <tt>USEARCH_DONE</tt> will be returned and the iterator will be 
      * adjusted to the index USEARCH_DONE
      * @param  position where search is to start from. If position is less
-     * 			than or greater than the text range for searching, 
+     *             than or greater than the text range for searching, 
      *          an U_INDEX_OUTOFBOUNDS_ERROR will be returned
      * @param  status for errors if it occurs
      * @return The character index of the first match preceding 
@@ -440,7 +440,7 @@
      *                is <tt>NULL</tt>, no break detection is attempted.  
      * @see #handleNext
      * @see #handlePrev
-	 * @stable ICU 2.0
+     * @stable ICU 2.0
      */
     SearchIterator(const UnicodeString &text, 
                          BreakIterator *breakiter = NULL);
@@ -462,7 +462,7 @@
      *                is <tt>NULL</tt>, no break detection is attempted.
      * @see #handleNext
      * @see #handlePrev
-	 * @stable ICU 2.0
+     * @stable ICU 2.0
      */
     SearchIterator(CharacterIterator &text, BreakIterator *breakiter = NULL);
 
@@ -472,7 +472,7 @@
      * Assignment operator. Sets this iterator to have the same behavior,
      * and iterate over the same text, as the one passed in.
      * @param that instance to be copied.
-	 * @stable ICU 2.0
+     * @stable ICU 2.0
      */
     SearchIterator & operator=(const SearchIterator &that);
 
@@ -493,7 +493,7 @@
      * @return index at which the match starts, else if match is not found 
      *         USEARCH_DONE is returned
      * @see #setMatchLength
-	 * @stable ICU 2.0
+     * @stable ICU 2.0
      */
     virtual int32_t handleNext(int32_t position, UErrorCode &status) 
                                                                          = 0;
@@ -515,7 +515,7 @@
      * @return index at which the match starts, else if match is not found 
      *         USEARCH_DONE is returned
      * @see #setMatchLength
-	 * @stable ICU 2.0
+     * @stable ICU 2.0
      */
      virtual int32_t handlePrev(int32_t position, UErrorCode &status) 
                                                                          = 0;
@@ -528,7 +528,7 @@
      * @param length length of the matched text.
      * @see #handleNext
      * @see #handlePrev
-	 * @stable ICU 2.0
+     * @stable ICU 2.0
      */
     virtual void setMatchLength(int32_t length);
 
@@ -540,7 +540,7 @@
      * @param position start offset of the matched text.
      * @see #handleNext
      * @see #handlePrev
-	 * @stable ICU 2.0
+     * @stable ICU 2.0
      */
     virtual void setMatchStart(int32_t position);
 

Index: simpletz.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/simpletz.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- simpletz.h	10 Sep 2003 02:42:25 -0000	1.3
+++ simpletz.h	6 Apr 2004 10:08:59 -0000	1.4
@@ -29,13 +29,8 @@
 
 #include "unicode/timezone.h"
 
-struct StandardZone;
-struct DSTZone;
-
 U_NAMESPACE_BEGIN
 
-class TimeZone;
-
 /**
  * <code>SimpleTimeZone</code> is a concrete subclass of <code>TimeZone</code>
  * that represents a time zone for use with a Gregorian calendar. This
@@ -599,6 +594,14 @@
                               UErrorCode& status) const;
 
     /**
+     * Redeclared TimeZone method.  This implementation simply calls
+     * the base class method, which otherwise would be hidden.
+     * @draft ICU 2.8
+     */
+    virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
+                           int32_t& dstOffset, UErrorCode& ec) const;
+
+    /**
      * Returns the TimeZone's raw GMT offset (i.e., the number of milliseconds to add
      * to GMT to get local time, before taking daylight savings time into account).
      *
@@ -715,17 +718,9 @@
         DOW_LE_DOM_MODE
     };
 
-    friend class TimeZone; // for access to these 2 constructors:
-
     SimpleTimeZone(); // default constructor not implemented
 
     /**
-     * Construct from memory-mapped data.
-     */
-    SimpleTimeZone(const StandardZone& stdZone, const UnicodeString& id);
-    SimpleTimeZone(const DSTZone& dstZone, const UnicodeString& id);
-
-    /**
      * Internal construction method.
      * @param rawOffsetGMT    The new SimpleTimeZone's raw GMT offset
      * @param startMonth      the month DST starts
@@ -785,8 +780,6 @@
     void decodeStartRule(UErrorCode& status);
     void decodeEndRule(UErrorCode& status);
 
-    static const char     fgClassID;
-
     int8_t startMonth, startDay, startDayOfWeek;   // the month, day, DOW, and time DST starts
     int32_t startTime;
     TimeMode startTimeMode, endTimeMode; // Mode for startTime, endTime; see TimeMode
@@ -795,7 +788,7 @@
     int32_t startYear;  // the year these DST rules took effect
     int32_t rawOffset;  // the TimeZone's raw GMT offset
     UBool useDaylight; // flag indicating whether this TimeZone uses DST
-    static const int8_t staticMonthLength[12]; // lengths of the months
+    static const int8_t STATICMONTHLENGTH[12]; // lengths of the months
     EMode startMode, endMode;   // flags indicating what kind of rules the DST rules are
 
     /**
@@ -805,14 +798,6 @@
     int32_t dstSavings;
 };
 
-inline UClassID
-SimpleTimeZone::getStaticClassID(void)
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-SimpleTimeZone::getDynamicClassID(void) const
-{ return SimpleTimeZone::getStaticClassID(); }
-
 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfWeekInMonth,
                                          int32_t dayOfWeek,
                                          int32_t time, UErrorCode& status) {
@@ -845,6 +830,12 @@
 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
                                        int32_t time, UBool after, UErrorCode& status) {
     setEndRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status);
+}
+
+inline void
+SimpleTimeZone::getOffset(UDate date, UBool local, int32_t& rawOffsetRef,
+                          int32_t& dstOffsetRef, UErrorCode& ec) const {
+    TimeZone::getOffset(date, local, rawOffsetRef, dstOffsetRef, ec);
 }
 
 U_NAMESPACE_END

Index: smpdtfmt.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/smpdtfmt.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- smpdtfmt.h	10 Sep 2003 02:42:25 -0000	1.4
+++ smpdtfmt.h	6 Apr 2004 10:08:59 -0000	1.5
@@ -557,7 +557,7 @@
      * @return          The class ID for all objects of this class.
      * @stable ICU 2.0
      */
-    static inline UClassID getStaticClassID(void);
+    static UClassID getStaticClassID(void);
 
     /**
      * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
@@ -584,12 +584,6 @@
     virtual void adoptCalendar(Calendar* calendarToAdopt);
 
 private:
-    static const char fgClassID;
-
-    static const char fgDateTimePatternsTag[];   // resource bundle tag for default date and time patterns
-
-    static const UChar fgDefaultPattern[];    // date/time pattern of last resort
-
     friend class DateFormat;
 
     void initializeDefaultCentury(void);
@@ -762,16 +756,6 @@
      */
     void         parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
 
-
-    /**
-     * Last-resort string to use for "GMT" when constructing time zone strings.
-     */
-    // For time zones that have no names, use strings GMT+minutes and
-    // GMT-minutes. For instance, in France the time zone is GMT+60.
-    static const UChar fgGmtPlus[];
-    static const UChar fgGmtMinus[];
-    static const UChar fgGmt[];
-
     /**
      * Used to map pattern characters to Calendar field identifiers.
      */
@@ -814,25 +798,7 @@
     /*transient*/ int32_t   fDefaultCenturyStartYear;
     
     UBool fHaveDefaultCentury;
-
-public:
-    /**
-     * If a start date is set to this value, that indicates that the system default
-     * start is in effect for this instance.
-     * @internal
-     * @obsolete ICU 2.8 Use parseAmbiguousDatesAsAfter instead, since this member will be removed in that release.
-     */
-    static const UDate        fgSystemDefaultCentury;
-    // TODO Not supposed to be public: make it private in 2.8!
 };
-
-inline UClassID
-SimpleDateFormat::getStaticClassID(void)
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-SimpleDateFormat::getDynamicClassID(void) const
-{ return SimpleDateFormat::getStaticClassID(); }
 
 inline UDate
 SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const

Index: sortkey.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/sortkey.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- sortkey.h	10 Sep 2003 02:42:25 -0000	1.4
+++ sortkey.h	6 Apr 2004 10:08:59 -0000	1.5
@@ -86,6 +86,7 @@
  * @see          RuleBasedCollator
  * @version      1.3 12/18/96
  * @author       Helena Shih
+ * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
  */
 class U_I18N_API CollationKey : public UObject {
 public:
@@ -94,7 +95,7 @@
     * collation key contains no sorting information.  When comparing two empty
     * collation keys, the result is Collator::EQUAL.  Comparing empty collation key
     * with non-empty collation key is always Collator::LESS.
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     CollationKey();
 
@@ -104,7 +105,7 @@
     * @param values the collation key values
     * @param count number of collation key values, including trailing nulls.
     * @see #createBits
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     CollationKey(const  uint8_t*    values,
                 int32_t     count);
@@ -112,20 +113,20 @@
     /**
     * Copy constructor.
     * @param other    the object to be copied.
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     CollationKey(const CollationKey& other);
 
     /**
     * Sort key destructor.
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     ~CollationKey();
 
     /**
     * Assignment operator
     * @param other    the object to be copied.
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     const   CollationKey&   operator=(const CollationKey& other);
 
@@ -133,7 +134,7 @@
     * Compare if two collation keys are the same.
     * @param source the collation key to compare to.
     * @return Returns true if two collation keys are equal, false otherwise.
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     UBool                   operator==(const CollationKey& source) const;
 
@@ -141,7 +142,7 @@
     * Compare if two collation keys are not the same.
     * @param source the collation key to compare to.
     * @return Returns TRUE if two collation keys are different, FALSE otherwise.
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     UBool                   operator!=(const CollationKey& source) const;
 
@@ -150,7 +151,7 @@
     * Test to see if the key is in an invalid state. The key will be in an
     * invalid state if it couldn't allocate memory for some operation.
     * @return Returns TRUE if the key is in an invalid, FALSE otherwise.
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     UBool                   isBogus(void) const;
 
@@ -161,7 +162,7 @@
     * @param count the output parameter of number of collation key values,
     * including any trailing nulls.
     * @return a pointer to the collation key values.
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     const    uint8_t*       getByteArray(int32_t& count) const;
 
@@ -195,7 +196,7 @@
     * @return Returns UCOL_LESS if sourceKey &lt; targetKey,
     * UCOL_GREATER if sourceKey > targetKey and UCOL_EQUAL
     * otherwise.
-    * @draft ICU 2.6
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     UCollationResult compareTo(const CollationKey& target, UErrorCode &status) const;
 
@@ -217,23 +218,21 @@
     * </pre>
     * @return the hash value based on the string's collation order.
     * @see UnicodeString#hashCode
-    * @stable ICU 2.0
+    * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
     */
     int32_t                 hashCode(void) const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
-     *
-     * @draft ICU 2.2
+     * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
      */
-    virtual inline UClassID getDynamicClassID() const;
+    virtual UClassID getDynamicClassID() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for this class.
-     *
-     * @draft ICU 2.2
+     * @deprecated ICU 2.8 Use Collator::getSortKey(...) instead
      */
-    static inline UClassID getStaticClassID();
+    static UClassID getStaticClassID();
 
 private:
     /**
@@ -249,64 +248,51 @@
     * Creates a collation key with a string.
     */
 
-	/**
-	* If this CollationKey has capacity less than newSize,
-	* its internal capacity will be increased to newSize.
-	* @param newSize minimum size this CollationKey has to have
-	* @return this CollationKey
-	*/
+    /**
+    * If this CollationKey has capacity less than newSize,
+    * its internal capacity will be increased to newSize.
+    * @param newSize minimum size this CollationKey has to have
+    * @return this CollationKey
+    */
     CollationKey&           ensureCapacity(int32_t newSize);
-	/**
-	* Set the CollationKey to a "bogus" or invalid state
-	* @return this CollationKey
-	*/
+    /**
+    * Set the CollationKey to a "bogus" or invalid state
+    * @return this CollationKey
+    */
     CollationKey&           setToBogus(void);
-	/**
-	* Resets this CollationKey to an empty state
-	* @return this CollationKey
-	*/
+    /**
+    * Resets this CollationKey to an empty state
+    * @return this CollationKey
+    */
     CollationKey&           reset(void);
-	
-	/**
-	* Allow private access to RuleBasedCollator
-	*/
+    
+    /**
+    * Allow private access to RuleBasedCollator
+    */
     friend  class           RuleBasedCollator;
-	/**
-	* Bogus status
-	*/
+    /**
+    * Bogus status
+    */
     UBool                   fBogus;
-	/**
-	* Size of fBytes used to store the sortkey. i.e. up till the 
-	* null-termination.
-	*/
+    /**
+    * Size of fBytes used to store the sortkey. i.e. up till the 
+    * null-termination.
+    */
     int32_t                 fCount;
-	/**
-	* Full size of the fBytes
-	*/
+    /**
+    * Full size of the fBytes
+    */
     int32_t                 fCapacity;
-	/**
-	* Unique hash value of this CollationKey
-	*/
+    /**
+    * Unique hash value of this CollationKey
+    */
     int32_t                 fHashCode;
-	/**
-	* Array to store the sortkey
-	*/
+    /**
+    * Array to store the sortkey
+    */
     uint8_t*                fBytes;
 
-    /**
-     * The address of this static class variable serves as this class's ID
-     * for ICU "poor man's RTTI".
-     */
-    static const char fgClassID;
 };
-
-inline UClassID
-CollationKey::getStaticClassID()
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-CollationKey::getDynamicClassID() const
-{ return CollationKey::getStaticClassID(); }
 
 inline UBool
 CollationKey::operator!=(const CollationKey& other) const

Index: stsearch.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/stsearch.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- stsearch.h	10 Sep 2003 02:42:25 -0000	1.5
+++ stsearch.h	6 Apr 2004 10:08:59 -0000	1.6
@@ -261,6 +261,19 @@
     */
     virtual ~StringSearch(void);
 
+    /**
+     * Clone this object.
+     * Clones can be used concurrently in multiple threads.
+     * If an error occurs, then NULL is returned.
+     * The caller must delete the clone.
+     *
+     * @return a clone of this object
+     *
+     * @see getDynamicClassID
+     * @draft ICU 2.8
+     */
+    StringSearch *clone() const;
+
     // operator overloading ---------------------------------------------
 
     /**
@@ -291,7 +304,7 @@
      * string accordingly without checking if the index is pointing to a 
      * valid starting point to begin searching. 
      * @param position within the text to be set. If position is less
-     * 			than or greater than the text range for searching, 
+     *          than or greater than the text range for searching, 
      *          an U_INDEX_OUTOFBOUNDS_ERROR will be returned
      * @param status for errors if it occurs
      * @stable ICU 2.0
@@ -341,8 +354,8 @@
      * Gets the collator used for the language rules.
      * <p>
      * Caller may modify but <b>must not</b> delete the <tt>RuleBasedCollator</tt>!
-	 * Modifications to this collator will affect the original collator passed in to 
-	 * the <tt>StringSearch>/tt> constructor or to setCollator, if any.
+     * Modifications to this collator will affect the original collator passed in to 
+     * the <tt>StringSearch>/tt> constructor or to setCollator, if any.
      * @return collator used for string search
      * @stable ICU 2.0
      */
@@ -403,16 +416,16 @@
     /**
      * ICU "poor man's RTTI", returns a UClassID for the actual class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    virtual inline UClassID getDynamicClassID() const;
+    virtual UClassID getDynamicClassID() const;
 
     /**
      * ICU "poor man's RTTI", returns a UClassID for this class.
      *
-     * @draft ICU 2.2
+     * @stable ICU 2.2
      */
-    static inline UClassID getStaticClassID();
+    static UClassID getStaticClassID();
 
 protected:
 
@@ -492,20 +505,7 @@
     */
     UStringSearch     *m_strsrch_;
 
-    /**
-     * The address of this static class variable serves as this class's ID
-     * for ICU "poor man's RTTI".
-     */
-    static const char fgClassID;
 };
-
-inline UClassID
-StringSearch::getStaticClassID()
-{ return (UClassID)&fgClassID; }
-
-inline UClassID
-StringSearch::getDynamicClassID() const
-{ return StringSearch::getStaticClassID(); }
 
 U_NAMESPACE_END
 

Index: tblcoll.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/tblcoll.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- tblcoll.h	10 Sep 2003 02:42:25 -0000	1.4
+++ tblcoll.h	6 Apr 2004 10:08:59 -0000	1.5
@@ -108,720 +108,698 @@
 
   // constructor -------------------------------------------------------------
 
-  /**
-   * RuleBasedCollator constructor. This takes the table rules and builds a
-   * collation table out of them. Please see RuleBasedCollator class
-   * description for more details on the collation rule syntax.
-   * @param rules the collation rules to build the collation table from.
-   * @param status reporting a success or an error.
-   * @see Locale
-   * @stable ICU 2.0
[...1376 lines suppressed...]
-    return UCOL_QUATERNARY;
-  default :
-    return UCOL_IDENTICAL;
-  }
+    switch (strength)
+    {
+    case Collator::PRIMARY :
+        return UCOL_PRIMARY;
+    case Collator::SECONDARY :
+        return UCOL_SECONDARY;
+    case Collator::TERTIARY :
+        return UCOL_TERTIARY;
+    case Collator::QUATERNARY :
+        return UCOL_QUATERNARY;
+    default :
+        return UCOL_IDENTICAL;
+    }
 }
 
 U_NAMESPACE_END

Index: timezone.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/timezone.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- timezone.h	10 Sep 2003 02:42:25 -0000	1.4
+++ timezone.h	6 Apr 2004 10:08:59 -0000	1.5
@@ -32,6 +32,7 @@
 
 #include "unicode/uobject.h"
 #include "unicode/unistr.h"
+#include "unicode/ures.h"
 
 U_NAMESPACE_BEGIN
 
@@ -177,6 +178,7 @@
      */
     static StringEnumeration* createEnumeration(const char* country);
 
+#ifdef U_USE_TIMEZONE_OBSOLETE_2_8
     /**
      * Returns a list of time zone IDs, one for each time zone with a given GMT offset.
      * The return value is a list because there may be several times zones with the same
@@ -240,6 +242,7 @@
      * @obsolete ICU 2.8.  Use createEnumeration(void) instead since this API will be removed in that release.
      */
     static const UnicodeString** createAvailableIDs(int32_t& numIDs);
+#endif
 
     /**
      * Returns the number of IDs in the equivalency group that
@@ -343,14 +346,18 @@
      * that is returned (in other words, what is the adjusted GMT offset in this time zone
      * at this particular date and time?).  For the time zones produced by createTimeZone(),
      * the reference data is specified according to the Gregorian calendar, and the date
-     * and time fields are in GMT, NOT local time.
+     * and time fields are local standard time.
+     *
+     * <p>Note: Don't call this method. Instead, call the getOffset(UDate...) overload,
+     * which returns both the raw and the DST offset for a given time. This method
+     * is retained only for backward compatibility.
      *
      * @param era        The reference date's era
      * @param year       The reference date's year
      * @param month      The reference date's month (0-based; 0 is January)
      * @param day        The reference date's day-in-month (1-based)
      * @param dayOfWeek  The reference date's day-of-week (1-based; 1 is Sunday)
-     * @param millis     The reference date's milliseconds in day, UTT (NOT local time).
+     * @param millis     The reference date's milliseconds in day, local standard time
      * @param status     Output param to filled in with a success or an error.
      * @return           The offset in milliseconds to add to GMT to get local time.
      * @stable ICU 2.0
@@ -361,6 +368,11 @@
     /**
      * Gets the time zone offset, for current date, modified in case of
      * daylight savings. This is the offset to add *to* UTC to get local time.
+     *
+     * <p>Note: Don't call this method. Instead, call the getOffset(UDate...) overload,
+     * which returns both the raw and the DST offset for a given time. This method
+     * is retained only for backward compatibility.
+     *
      * @param era the era of the given date.
      * @param year the year in the given date.
      * @param month the month in the given date.
@@ -378,6 +390,32 @@
                            int32_t monthLength, UErrorCode& status) const = 0;
 
     /**
+     * Returns the time zone raw and GMT offset for the given moment
+     * in time.  Upon return, local-millis = GMT-millis + rawOffset +
+     * dstOffset.  All computations are performed in the proleptic
+     * Gregorian calendar.  The default implementation in the TimeZone
+     * class delegates to the 8-argument getOffset().
+     *
+     * @param date moment in time for which to return offsets, in
+     * units of milliseconds from January 1, 1970 0:00 GMT, either GMT
+     * time or local wall time, depending on `local'.
+     * @param local if true, `date' is local wall time; otherwise it
+     * is in GMT time.
+     * @param rawOffset output parameter to receive the raw offset, that
+     * is, the offset not including DST adjustments
+     * @param dstOffset output parameter to receive the DST offset,
+     * that is, the offset to be added to `rawOffset' to obtain the
+     * total offset between local and GMT time. If DST is not in
+     * effect, this value is zero; otherwise it is a positive value,
+     * typically one hour.
+     * @param ec input-output error code
+     *
+     * @draft ICU 2.8
+     */
+    virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
+                           int32_t& dstOffset, UErrorCode& ec) const;
+
+    /**
      * Sets the TimeZone's raw GMT offset (i.e., the number of milliseconds to add
      * to GMT to get local time, before taking daylight savings time into account).
      *
@@ -537,19 +575,6 @@
     virtual TimeZone* clone(void) const = 0;
 
     /**
-     * Return the class ID for this class.  This is useful only for
-     * comparing to a return value from getDynamicClassID().  For example:
-     * <pre>
-     * .   Base* polymorphic_pointer = createPolymorphicObject();
-     * .   if (polymorphic_pointer->getDynamicClassID() ==
-     * .       Derived::getStaticClassID()) ...
-     * </pre>
-     * @return The class ID for all objects of this class.
-     * @stable ICU 2.0
-     */
-    static inline UClassID getStaticClassID(void);
-
-    /**
      * Returns a unique class ID POLYMORPHICALLY. Pure virtual method. This method is to
      * implement a simple version of RTTI, since not all C++ compilers support genuine
      * RTTI. Polymorphic operator==() and clone() methods call this method.
@@ -595,9 +620,18 @@
      */
     TimeZone& operator=(const TimeZone& right);
 
-private:
-    static const char fgClassID;
+    /**
+     * Utility function. For internally loading rule data.
+     * @param top Top resource bundle for tz data
+     * @param ruleid ID of rule to load
+     * @param oldbundle Old bundle to reuse or NULL
+     * @param status Status parameter
+     * @return either a new bundle or *oldbundle
+     * @internal
+     */
+    static UResourceBundle* loadRule(const UResourceBundle* top, const UnicodeString& ruleid, UResourceBundle* oldbundle, UErrorCode&status);
 
+private:
     static TimeZone*        createCustomTimeZone(const UnicodeString&); // Creates a time zone based on the string.
 
     /**
@@ -620,10 +654,6 @@
     UnicodeString           fID;    // this time zone's ID
 };
 
-
-inline UClassID
-TimeZone::getStaticClassID(void)
-{ return (UClassID)&fgClassID; }
 
 // -------------------------------------
 

Index: translit.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/translit.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- translit.h	10 Sep 2003 02:42:25 -0000	1.5
+++ translit.h	6 Apr 2004 10:09:00 -0000	1.6
@@ -325,7 +325,7 @@
      * @draft ICU 2.4
      */
     Transliterator& operator=(const Transliterator&);
-    
+
     /**
      * Create a transliterator from a basic ID.  This is an ID
      * containing only the forward direction source, target, and
@@ -541,7 +541,7 @@
      * incremental and non-incremental transliteration.  Let
      * <code>originalStart</code> refer to the value of
      * <code>pos.start</code> upon entry.
-     * 
+     *
      * <ul>
      *  <li>If <code>incremental</code> is false, then this method
      *  should transliterate all characters between
@@ -561,7 +561,7 @@
      *  transliterator and characters [<code>pos.start</code>,
      *  <code>pos.limit</code>) are unchanged.</li>
      * </ul>
-     * 
+     *
      * <p>Implementations of this method should also obey the
      * following invariants:</p>
      *
@@ -584,13 +584,13 @@
      *  <li>Text before <code>pos.contextStart</code> and text after
      *  <code> pos.contextLimit</code> should be ignored.</li>
      * </ul>
-     *    
+     *
      * <p>Subclasses may safely assume that all characters in
      * [<code>pos.start</code>, <code>pos.limit</code>) are filtered.
      * In other words, the filter has already been applied by the time
      * this method is called.  See
      * <code>filteredTransliterate()</code>.
-     *    
+     *
      * <p>This method is <b>not</b> for public consumption.  Calling
      * this method directly will transliterate
      * [<code>pos.start</code>, <code>pos.limit</code>) without
@@ -598,19 +598,19 @@
      * transliterate()</code> instead of this method. Subclass code
      * should call <code>filteredTransliterate()</code> instead of
      * this method.<p>
-     * 
+     *
      * @param text the buffer holding transliterated and
      * untransliterated text
-     * 
+     *
      * @param pos the indices indicating the start, limit, context
      * start, and context limit of the text.
-     * 
+     *
      * @param incremental if true, assume more text may be inserted at
      * <code>pos.limit</code> and act accordingly.  Otherwise,
      * transliterate all text between <code>pos.start</code> and
      * <code>pos.limit</code> and move <code>pos.start</code> up to
      * <code>pos.limit</code>.
-     * 
+     *
      * @see #transliterate
      * @draft ICU 2.4
      */
@@ -644,7 +644,7 @@
      * public API methods eventually call this method with a rollback argument
      * of TRUE.  Other entities may call this method but rollback should be
      * FALSE.
-     * 
+     *
      * <p>If this transliterator has a filter, break up the input text into runs
      * of unfiltered characters.  Pass each run to
      * <subclass>.handleTransliterate().
@@ -808,7 +808,7 @@
      *
      * @param ID a valid ID, as enumerated by <code>getAvailableIDs()</code>
      * @param dir        either FORWARD or REVERSE.
-     * @param parseError Struct to recieve information on position 
+     * @param parseError Struct to recieve information on position
      *                   of error if an error is encountered
      * @param status     Output param to filled in with a success or an error.
      * @return A <code>Transliterator</code> object with the given ID
@@ -845,7 +845,7 @@
      * @param ID            the id for the transliterator.
      * @param rules         rules, separated by ';'
      * @param dir           either FORWARD or REVERSE.
-     * @param parseError    Struct to recieve information on position 
+     * @param parseError    Struct to recieve information on position
      *                      of error if an error is encountered
      * @param status        Output param set to success/failure code.
      * @stable ICU 2.0
@@ -1034,7 +1034,7 @@
      * Return the number of IDs currently registered with the system.
      * To retrieve the actual IDs, call getAvailableID(i) with
      * i from 0 to countAvailableIDs() - 1.
-     * @return the number of IDs currently registered with the system. 
+     * @return the number of IDs currently registered with the system.
      * @stable ICU 2.0
      */
     static int32_t countAvailableIDs(void);
@@ -1057,7 +1057,7 @@
      * @stable ICU 2.0
      */
     static int32_t countAvailableSources(void);
-    
+
     /**
      * Return a registered source specifier.
      * @param index which specifier to return, from 0 to n-1, where
@@ -1069,7 +1069,7 @@
      */
     static UnicodeString& getAvailableSource(int32_t index,
                                              UnicodeString& result);
-    
+
     /**
      * Return the number of registered target specifiers for a given
      * source specifier.
@@ -1079,7 +1079,7 @@
      * @stable ICU 2.0
      */
     static int32_t countAvailableTargets(const UnicodeString& source);
-    
+
     /**
      * Return a registered target specifier for a given source.
      * @param index which specifier to return, from 0 to n-1, where
@@ -1094,7 +1094,7 @@
     static UnicodeString& getAvailableTarget(int32_t index,
                                              const UnicodeString& source,
                                              UnicodeString& result);
-    
+
     /**
      * Return the number of registered variant specifiers for a given
      * source-target pair.
@@ -1104,7 +1104,7 @@
      */
     static int32_t countAvailableVariants(const UnicodeString& source,
                                           const UnicodeString& target);
-    
+
     /**
      * Return a registered variant specifier for a given source-target
      * pair.
@@ -1130,43 +1130,43 @@
      * @internal
      */
     static int32_t _countAvailableSources(void);
-    
+
     /**
      * Non-mutexed internal method
      * @internal
      */
     static UnicodeString& _getAvailableSource(int32_t index,
-					      UnicodeString& result);
-    
+                                              UnicodeString& result);
+
     /**
      * Non-mutexed internal method
      * @internal
      */
     static int32_t _countAvailableTargets(const UnicodeString& source);
-    
+
     /**
      * Non-mutexed internal method
      * @internal
      */
     static UnicodeString& _getAvailableTarget(int32_t index,
-					      const UnicodeString& source,
-					      UnicodeString& result);
-    
+                                              const UnicodeString& source,
+                                              UnicodeString& result);
+
     /**
      * Non-mutexed internal method
      * @internal
      */
     static int32_t _countAvailableVariants(const UnicodeString& source,
-					   const UnicodeString& target);
-    
+                                           const UnicodeString& target);
+
     /**
      * Non-mutexed internal method
      * @internal
      */
     static UnicodeString& _getAvailableVariant(int32_t index,
-					       const UnicodeString& source,
-					       const UnicodeString& target,
-					       UnicodeString& result);
+                                               const UnicodeString& source,
+                                               const UnicodeString& target,
+                                               UnicodeString& result);
 
 protected:
 
@@ -1181,32 +1181,14 @@
 public:
 
     /**
-     * Return the class ID for this class.  This is useful only for
-     * comparing to a return value from getDynamicClassID().  For example:
-     * <pre>
-     * .      Base* polymorphic_pointer = createPolymorphicObject();
-     * .      if (polymorphic_pointer->getDynamicClassID() ==
-     * .          Derived::getStaticClassID()) ...
-     * </pre>
-     * @return          The class ID for all objects of this class.
-     * @stable ICU 2.0
-     */
-    static inline UClassID getStaticClassID(void);
-
-    /**
      * Returns a unique class ID <b>polymorphically</b>.  This method
      * is to implement a simple version of RTTI, since not all C++
      * compilers support genuine RTTI.  Polymorphic operator==() and
      * clone() methods call this method.
-     * 
+     *
      * <p>Concrete subclasses of Transliterator that wish clients to
      * be able to identify them should implement getDynamicClassID()
      * and also a static method and data member:
-     * 
-     * <pre>
-     * static UClassID getStaticClassID() { return (UClassID)&fgClassID; }
-     * static char fgClassID;
-     * </pre>
      *
      * Subclasses that do not implement this method will have a
      * dynamic class ID of Transliterator::getStatisClassID().
@@ -1219,28 +1201,18 @@
     virtual UClassID getDynamicClassID(void) const = 0;
 
 private:
-
-    /**
-     * Class identifier for subclasses of Transliterator that do not
-     * define their class (anonymous subclasses).
-     */
-    static const char fgClassID;
-
-private:
     static UBool initializeRegistry(void);
 
 };
 
-inline UClassID
-Transliterator::getStaticClassID(void)
-{ return (UClassID)&fgClassID; }
-
 inline int32_t Transliterator::getMaximumContextLength(void) const {
     return maximumContextLength;
 }
 
 inline void Transliterator::setID(const UnicodeString& id) {
     ID = id;
+    // NUL-terminate the ID string
+    ID.getTerminatedBuffer();
 }
 
 inline Transliterator::Token Transliterator::integerToken(int32_t i) {

Index: ucal.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/ucal.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- ucal.h	10 Sep 2003 02:42:25 -0000	1.4
+++ ucal.h	6 Apr 2004 10:09:01 -0000	1.5
@@ -8,6 +8,7 @@
 
 #include "unicode/utypes.h"
 #include "unicode/uenum.h"
+#include "unicode/uloc.h"
 
 #if !UCONFIG_NO_FORMATTING
 
@@ -159,46 +160,127 @@
  * @stable ICU 2.0
  */
 enum UCalendarDateFields {
-  /** Era field */
+  /** 
+   * Era field
+   * @stable ICU 2.6 
+   */
   UCAL_ERA,
-  /** Year field */
+  /**
+   * Year field
+   * @stable ICU 2.6 
+   */
   UCAL_YEAR,
-  /** Month field */
+  /**
+   * Month field
+   * @stable ICU 2.6 
+   */
   UCAL_MONTH,
-  /** Week of year field */
+  /**
+   * Week of year field
+   * @stable ICU 2.6 
+   */
   UCAL_WEEK_OF_YEAR,
-  /** Week of month field */
+  /**
+   * Week of month field
+   * @stable ICU 2.6 
+   */
   UCAL_WEEK_OF_MONTH,
-  /** Date field */
+  /**
+   * Date field
+   * @stable ICU 2.6 
+   */
   UCAL_DATE,
-  /** Day of year field */
+  /**
+   * Day of year field
+   * @stable ICU 2.6 
+   */
   UCAL_DAY_OF_YEAR,
-  /** Day of week field */
+  /**
+   * Day of week field
+   * @stable ICU 2.6 
+   */
   UCAL_DAY_OF_WEEK,
-  /** Day of week in month field */
+  /**
+   * Day of week in month field
+   * @stable ICU 2.6 
+   */
   UCAL_DAY_OF_WEEK_IN_MONTH,
-  /** AM/PM field */
+  /**
+   * AM/PM field
+   * @stable ICU 2.6 
+   */
   UCAL_AM_PM,
-  /** Hour field */
+  /**
+   * Hour field
+   * @stable ICU 2.6 
+   */
   UCAL_HOUR,
-  /** Hour of day field */
+  /**
+   * Hour of day field
+   * @stable ICU 2.6 
+   */
   UCAL_HOUR_OF_DAY,
-  /** Minute field */
+  /**
+   * Minute field
+   * @stable ICU 2.6 
+   */
   UCAL_MINUTE,
-  /** Second field */
+  /**
+   * Second field
+   * @stable ICU 2.6 
+   */
   UCAL_SECOND,
-  /** Millisecond field */
+  /**
+   * Millisecond field
+   * @stable ICU 2.6 
+   */
   UCAL_MILLISECOND,
-  /** Zone offset field */
+  /**
+   * Zone offset field
+   * @stable ICU 2.6 
+   */
   UCAL_ZONE_OFFSET,
-  /** DST offset field */
+  /**
+   * DST offset field
+   * @stable ICU 2.6 
+   */
   UCAL_DST_OFFSET,
-  /** Year / week of year */
+  /**
+   * Year / week of year 
+   * @stable ICU 2.6
+   */
   UCAL_YEAR_WOY,
-  /** Day of week, localized (1..7) */
+  /**
+   * Day of week, localized (1..7) 
+   * @stable ICU 2.6
+   */
   UCAL_DOW_LOCAL,
-  /** Field count */
-  UCAL_FIELD_COUNT
+  /**
+   * Year of this calendar system, encompassing all supra-year fields. For example, in Gregorian/Julian calendars, positive Extended Year values indicate years AD,  1 BC = 0 extended, 2 BC = -1 extended, and so on. 
+   * @draft ICU 2.8 
+   */
+  UCAL_EXTENDED_YEAR,       
+  /**
+   * Modified Julian day number, encompassing all date-related fields.  Demarcates at local midnight.
+   * @draft ICU 2.8
+   */
+  UCAL_JULIAN_DAY, 
+  /**
+   * Ranges from 0 to 23:59:59.999 (regardless of DST).  This field behaves <em>exactly</em> like a composite of all time-related fields, not including the zone fields.  As such, it also reflects discontinuities of those fields on DST transition days.  On a day of DST onset, it will jump forward.  On a day of DST cessation, it will jump backward.  This reflects the fact that is must be combined with the DST_OFFSET field to obtain a unique local time value.
+   * @draft ICU 2.8
+   */
+  UCAL_MILLISECONDS_IN_DAY,
+  /**
+   * Field count
+   * @stable ICU 2.6
+   */
+  UCAL_FIELD_COUNT,
+
+  /**
+   * Synonym for UCAL_DATE
+   * @draft ICU 2.8
+   **/
+  UCAL_DAY_OF_MONTH=UCAL_DATE
 };
 
 /** @stable ICU 2.0 */
@@ -802,6 +884,7 @@
               UCalendarLimitType   type,
               UErrorCode*          status);
 
+#ifdef U_USE_UCAL_OBSOLETE_2_8
 /**
  * Get an available TimeZone ID.
  * A Timezone ID is a string of the form "America/Los Angeles".
@@ -828,6 +911,17 @@
  */
 U_CAPI int32_t U_EXPORT2 
 ucal_countAvailableTZIDs(int32_t rawOffset);
+#endif
+
+/** Get the locale for this calendar object. You can choose between valid and actual locale.
+ *  @param cal The calendar object
+ *  @param type type of the locale we're looking for (valid or actual) 
+ *  @param status error code for the operation
+ *  @return the locale name
+ * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
+ */
+U_CAPI const char * U_EXPORT2
+ucal_getLocaleByType(const UCalendar *cal, ULocDataLocaleType type, UErrorCode* status);
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
 

Index: ucol.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/ucol.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- ucol.h	10 Sep 2003 02:42:25 -0000	1.5
+++ ucol.h	6 Apr 2004 10:09:01 -0000	1.6
@@ -228,7 +228,13 @@
       * non-ignorables on quaternary level
       * This is a sneaky way to produce JIS
       * sort order */     
-     UCOL_HIRAGANA_QUATERNARY_MODE, 
+     UCOL_HIRAGANA_QUATERNARY_MODE,
+     /** when turned on, this attribute 
+      * generates a collation key
+      * for the numeric value of substrings
+      * of digits. This is a way to get '100' 
+      * to sort AFTER '2'.*/          
+     UCOL_NUMERIC_COLLATION, 
      UCOL_ATTRIBUTE_COUNT
 } UColAttribute;
 
@@ -605,6 +611,15 @@
 U_CAPI void U_EXPORT2
 ucol_getVersion(const UCollator* coll, UVersionInfo info);
 
+/**
+ * Gets the UCA version information for a Collator. Version is the
+ * UCA version number (3.1.1, 4.0).
+ * @param coll The UCollator to query.
+ * @param info the version # information, the result will be filled in
+ * @draft ICU 2.8
+ */
+U_CAPI void U_EXPORT2
+ucol_getUCAVersion(const UCollator* coll, UVersionInfo info);
 
 /** 
  * Merge two sort keys. The levels are merged with their corresponding counterparts
@@ -771,13 +786,30 @@
  * @return real locale name from which the collation data comes. 
  *         If the collator was instantiated from rules, returns
  *         NULL.
- * @stable ICU 2.1
+ * @deprecated ICU 2.8 Use ucol_getLocaleByType instead
  */
 U_CAPI const char * U_EXPORT2
 ucol_getLocale(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status);
 
 
 /**
+ * gets the locale name of the collator. If the collator
+ * is instantiated from the rules, then this function returns
+ * NULL.
+ * @param coll The UCollator for which the locale is needed
+ * @param type You can choose between requested, valid and actual
+ *             locale. For description see the definition of
+ *             ULocDataLocaleType in uloc.h
+ * @param status error code of the operation
+ * @return real locale name from which the collation data comes. 
+ *         If the collator was instantiated from rules, returns
+ *         NULL.
+ * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
+ */
+U_CAPI const char * U_EXPORT2
+ucol_getLocaleByType(const UCollator *coll, ULocDataLocaleType type, UErrorCode *status);
+
+/**
  * Get an Unicode set that contains all the characters and sequences tailored in 
  * this collator. The result must be disposed of by using uset_close.
  * @param coll        The UCollator for which we want to get tailored chars
@@ -793,3 +825,4 @@
 #endif /* #if !UCONFIG_NO_COLLATION */
 
 #endif
+

Index: ucoleitr.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/ucoleitr.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- ucoleitr.h	10 Sep 2003 02:42:25 -0000	1.4
+++ ucoleitr.h	6 Apr 2004 10:09:01 -0000	1.5
@@ -25,7 +25,7 @@
  * to be returned.
  * @stable ICU 2.0
  */
-#define UCOL_NULLORDER        0xFFFFFFFF
+#define UCOL_NULLORDER        ((int32_t)0xFFFFFFFF)
 
 #include "unicode/ucol.h"
 

Index: ucurr.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/ucurr.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- ucurr.h	10 Sep 2003 02:42:25 -0000	1.1
+++ ucurr.h	6 Apr 2004 10:09:01 -0000	1.2
@@ -34,16 +34,24 @@
  */
 
 /**
- * Returns a currency code for the default currency in the given
- * locale.
- * @param locale the locale for which to retrieve a currency code
+ * Finds a currency code for the given locale.
+ * @param locale the locale for which to retrieve a currency code. 
+ *               Currency can be specified by the "currency" keyword
+ *               in which case it overrides the default currency code
+ * @param buff   fill in buffer. Can be NULL for preflighting.
+ * @param buffCapacity capacity of the fill in buffer. Can be 0 for
+ *               preflighting. If it is non-zero, the buff parameter
+ *               must not be NULL.
  * @param ec error code
- * @return a pointer to a 3-character ISO 4217 currency code, or
- * NULL if none is found.
- * @draft ICU 2.2
+ * @return length of the currency string. It should always be 3. If 0,
+ *                currency couldn't be found or the input values are 
+ *                invalid. 
+ * @draft ICU 2.8
  */
-U_CAPI const UChar* U_EXPORT2
+U_CAPI int32_t U_EXPORT2
 ucurr_forLocale(const char* locale,
+                UChar* buff,
+                int32_t buffCapacity,
                 UErrorCode* ec);
 
 /**
@@ -127,7 +135,7 @@
  * @param currency null-terminated 3-letter ISO 4217 code
  * @return a non-negative number of fraction digits to be
  * displayed
- * @draft ICU 2.2
+ * @draft ICU 2.2 Not stable yet, see Jitterbug 3399.
  */
 U_CAPI int32_t U_EXPORT2
 ucurr_getDefaultFractionDigits(const UChar* currency);
@@ -137,7 +145,7 @@
  * rounding is done by the currency.
  * @param currency null-terminated 3-letter ISO 4217 code
  * @return the non-negative rounding increment, or 0.0 if none
- * @draft ICU 2.2
+ * @draft ICU 2.2 Not stable yet, see Jitterbug 3399.
  */
 U_CAPI double U_EXPORT2
 ucurr_getRoundingIncrement(const UChar* currency);

Index: udat.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/udat.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- udat.h	10 Sep 2003 02:42:25 -0000	1.5
+++ udat.h	6 Apr 2004 10:09:01 -0000	1.6
@@ -528,24 +528,19 @@
                     int32_t                 valueLength,
                     UErrorCode              *status);
 
-/********************* Obsolete API ************************************/
 /**
- * TODO: Remove after Aug 2002
+ * Get the locale for this date format object.
+ * You can choose between valid and actual locale.
+ * @param fmt The formatter to get the locale from
+ * @param type type of the locale we're looking for (valid or actual) 
+ * @param status error code for the operation
+ * @return the locale name
+ * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
  */
-#ifdef U_USE_DEPRECATED_FORMAT_API
-#if ((U_ICU_VERSION_MAJOR_NUM != 2) || (U_ICU_VERSION_MINOR_NUM != 2))
-#   error "ICU version has changed. Please redefine the macros under U_USE_DEPRECATED_FORMAT_API pre-processor definition"
-#else 
-    static UDateFormat*
-    udat_openPattern(const UChar* pattern,int32_t patternLength,const char* locale,UErrorCode *status)
-    {
-        return udat_open(UDAT_IGNORE,UDAT_IGNORE,locale,NULL,0,pattern,patternLength,status);
-    }
-
-#   define udat_open_2_2(timeStyle,dateStyle,locale,tzId,tzIdLength,status) udat_open(timeStyle,dateStyle,locale,tzId,tzIdLength,NULL,0,status)
-#endif
-#endif
-/********************* End **********************************************/
+U_CAPI const char* U_EXPORT2
+udat_getLocaleByType(const UDateFormat *fmt,
+                     ULocDataLocaleType type,
+                     UErrorCode* status); 
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
 

Index: umsg.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/umsg.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- umsg.h	10 Sep 2003 02:42:25 -0000	1.4
+++ umsg.h	6 Apr 2004 10:09:01 -0000	1.5
@@ -22,6 +22,7 @@
 
 #if !UCONFIG_NO_FORMATTING
 
+#include "unicode/uloc.h"
 #include "unicode/parseerr.h"
 #include <stdarg.h>
 /**
@@ -593,6 +594,21 @@
             int32_t        *count,
             va_list        ap,
             UErrorCode     *status);
+
+
+/**
+ * Get the locale for this message format object.
+ * You can choose between valid and actual locale.
+ * @param fmt The formatter to get the locale from
+ * @param type type of the locale we're looking for (valid or actual) 
+ * @param status error code for the operation
+ * @return the locale name
+ * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
+ */
+U_CAPI const char* U_EXPORT2
+umsg_getLocaleByType(const UMessageFormat *fmt,
+                     ULocDataLocaleType type,
+                     UErrorCode* status); 
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
 

Index: unifltlg.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/unifltlg.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- unifltlg.h	10 Sep 2003 02:42:25 -0000	1.4
+++ unifltlg.h	6 Apr 2004 10:09:01 -0000	1.5
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-* Copyright (C) 1999, International Business Machines Corporation and others. All Rights Reserved.
+* Copyright (C) 1999-2003, International Business Machines Corporation and others. All Rights Reserved.
 **********************************************************************
 *   Date        Name        Description
 *   11/17/99    aliu        Creation.
@@ -21,7 +21,7 @@
 
 #include "unicode/utypes.h"
 
-#if !UCONFIG_NO_TRANSLITERATION
+#if !UCONFIG_NO_TRANSLITERATION && defined(U_USE_UNICODE_FILTER_LOGIC_OBSOLETE_2_8)
 
 #include "unicode/uobject.h"
 

Index: unirepl.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/unirepl.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- unirepl.h	10 Sep 2003 02:42:25 -0000	1.1
+++ unirepl.h	6 Apr 2004 10:09:01 -0000	1.2
@@ -1,6 +1,6 @@
 /*
 **********************************************************************
-*   Copyright (c) 2002, International Business Machines Corporation
+*   Copyright (c) 2002-2003, International Business Machines Corporation
 *   and others.  All Rights Reserved.
 **********************************************************************
 *   Date        Name        Description
@@ -36,7 +36,7 @@
      * Destructor.
      * @draft ICU 2.4
      */
-    virtual inline ~UnicodeReplacer() {};
+    virtual ~UnicodeReplacer();
 
     /**
      * Replace characters in 'text' from 'start' to 'limit' with the

Index: unum.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/unum.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- unum.h	10 Sep 2003 02:42:25 -0000	1.5
+++ unum.h	6 Apr 2004 10:09:01 -0000	1.6
@@ -15,6 +15,7 @@
 
 #if !UCONFIG_NO_FORMATTING
 
+#include "unicode/uloc.h"
 #include "unicode/umisc.h"
 #include "unicode/parseerr.h"
 /**
@@ -227,8 +228,10 @@
 * a field exists.  This parameter may be NULL, in which case no field
 * @param status A pointer to an UErrorCode to receive any errors
 * @return The total buffer size needed; if greater than resultLength, the output was truncated.
+* @see unum_formatInt64
 * @see unum_formatDouble
 * @see unum_parse
+* @see unum_parseInt64
 * @see unum_parseDouble
 * @see UFieldPosition
 * @stable ICU 2.0
@@ -242,6 +245,35 @@
         UErrorCode*        status);
 
 /**
+* Format an int64 using a UNumberFormat.
+* The int64 will be formatted according to the UNumberFormat's locale.
+* @param fmt The formatter to use.
+* @param number The number to format.
+* @param result A pointer to a buffer to receive the formatted number.
+* @param resultLength The maximum size of result.
+* @param pos    A pointer to a UFieldPosition.  On input, position->field
+* is read.  On output, position->beginIndex and position->endIndex indicate
+* the beginning and ending indices of field number position->field, if such
+* a field exists.  This parameter may be NULL, in which case no field
+* @param status A pointer to an UErrorCode to receive any errors
+* @return The total buffer size needed; if greater than resultLength, the output was truncated.
+* @see unum_format
+* @see unum_formatDouble
+* @see unum_parse
+* @see unum_parseInt64
+* @see unum_parseDouble
+* @see UFieldPosition
+* @stable ICU 2.0
+*/
+U_CAPI int32_t U_EXPORT2 
+unum_formatInt64(const UNumberFormat *fmt,
+        int64_t         number,
+        UChar*          result,
+        int32_t         resultLength,
+        UFieldPosition *pos,
+        UErrorCode*     status);
+
+/**
 * Format a double using a UNumberFormat.
 * The double will be formatted according to the UNumberFormat's locale.
 * @param fmt The formatter to use.
@@ -255,7 +287,9 @@
 * @param status A pointer to an UErrorCode to receive any errors
 * @return The total buffer size needed; if greater than resultLength, the output was truncated.
 * @see unum_format
+* @see unum_formatInt64
 * @see unum_parse
+* @see unum_parseInt64
 * @see unum_parseDouble
 * @see UFieldPosition
 * @stable ICU 2.0
@@ -278,8 +312,10 @@
 * to begin parsing.  If not 0, on output the offset at which parsing ended.
 * @param status A pointer to an UErrorCode to receive any errors
 * @return The value of the parsed integer
+* @see unum_parseInt64
 * @see unum_parseDouble
 * @see unum_format
+* @see unum_formatInt64
 * @see unum_formatDouble
 * @stable ICU 2.0
 */
@@ -291,6 +327,30 @@
         UErrorCode      *status);
 
 /**
+* Parse a string into an int64 using a UNumberFormat.
+* The string will be parsed according to the UNumberFormat's locale.
+* @param fmt The formatter to use.
+* @param text The text to parse.
+* @param textLength The length of text, or -1 if null-terminated.
+* @param parsePos If not 0, on input a pointer to an integer specifying the offset at which
+* to begin parsing.  If not 0, on output the offset at which parsing ended.
+* @param status A pointer to an UErrorCode to receive any errors
+* @return The value of the parsed integer
+* @see unum_parse
+* @see unum_parseDouble
+* @see unum_format
+* @see unum_formatInt64
+* @see unum_formatDouble
+* @draft ICU 2.8
+*/
+U_CAPI int64_t U_EXPORT2 
+unum_parseInt64(const UNumberFormat*  fmt,
+        const UChar*  text,
+        int32_t       textLength,
+        int32_t       *parsePos /* 0 = start */,
+        UErrorCode    *status);
+
+/**
 * Parse a string into a double using a UNumberFormat.
 * The string will be parsed according to the UNumberFormat's locale.
 * @param fmt The formatter to use.
@@ -301,7 +361,9 @@
 * @param status A pointer to an UErrorCode to receive any errors
 * @return The value of the parsed double
 * @see unum_parse
+* @see unum_parseInt64
 * @see unum_format
+* @see unum_formatInt64
 * @see unum_formatDouble
 * @stable ICU 2.0
 */
@@ -633,27 +695,19 @@
                UErrorCode *status);
 
 
-/******************* Obsolete API ***************************/
 /**
- * TODO: Remove after Aug 2002
+ * Get the locale for this number format object.
+ * You can choose between valid and actual locale.
+ * @param fmt The formatter to get the locale from
+ * @param type type of the locale we're looking for (valid or actual) 
+ * @param status error code for the operation
+ * @return the locale name
+ * @draft ICU 2.8 likely to change in ICU 3.0, based on feedback
  */
-#ifdef U_USE_DEPRECATED_FORMAT_API
-
-#if ((U_ICU_VERSION_MAJOR_NUM != 2) || (U_ICU_VERSION_MINOR_NUM != 2))
-#   error "ICU version has changed. Please redefine the macros under U_USE_DEPRECATED_FORMAT_API pre-processor definition"
-#else 
-    static UNumberFormat* 
-    unum_openPattern(const UChar* pattern, int32_t patternLength,const char* locale,UErrorCode* status) 
-    {
-        return unum_open(0,pattern,patternLength,locale,NULL,status);
-    }
-
-#   define unum_open_2_2(style,locale,status) unum_open(style, NULL, 0, locale, NULL, status)
-#   define unum_applyPattern_2_2(format,localized,pattern,patternLength) unum_applyPattern(format,localized,pattern,patternLength,NULL,NULL)
-#endif
-
-#endif
-/******************** End ************************************/
+U_CAPI const char* U_EXPORT2
+unum_getLocaleByType(const UNumberFormat *fmt,
+                     ULocDataLocaleType type,
+                     UErrorCode* status); 
 
 #endif /* #if !UCONFIG_NO_FORMATTING */
 

Index: utrans.h
===================================================================
RCS file: /cvs/core/icu-sword/source/i18n/unicode/utrans.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- utrans.h	10 Sep 2003 02:42:25 -0000	1.5
+++ utrans.h	6 Apr 2004 10:09:02 -0000	1.6
@@ -17,6 +17,7 @@
 
 #include "unicode/urep.h"
 #include "unicode/parseerr.h"
+#include "unicode/uenum.h"
 
 /********************************************************************
  * General Notes
@@ -37,6 +38,18 @@
  * services are available to C code through this header.  In order to
  * access more complex transliteration services, refer to the C++
  * headers and documentation.
+ *
+ * There are two sets of functions for working with transliterator IDs:
+ *
+ * An old, deprecated set uses char * IDs, which works for true and pure
+ * identifiers that these APIs were designed for,
+ * for example "Cyrillic-Latin".
+ * It does not work when the ID contains filters ("[:Script=Cyrl:]")
+ * or even a complete set of rules because then the ID string contains more
+ * than just "invariant" characters (see utypes.h).
+ *
+ * A new set of functions replaces the old ones and uses UChar * IDs,
+ * paralleling the UnicodeString IDs in the C++ API. (New in ICU 2.8.)
  */
 
 /********************************************************************
@@ -155,29 +168,30 @@
  * Any non-NULL result from this function should later be closed with
  * utrans_close().
  *
- * @param id a valid ID, as returned by utrans_getAvailableID()
+ * @param id a valid transliterator ID
+ * @param idLength the length of the ID string, or -1 if NUL-terminated
  * @param dir the desired direction
- * @param rules the transliterator rules.  See the C++ header rbt.h
- * for rules syntax. If NULL then a system transliterator matching 
- * the ID is returned.
+ * @param rules the transliterator rules.  See the C++ header rbt.h for
+ *              rules syntax. If NULL then a system transliterator matching
+ *              the ID is returned.
  * @param rulesLength the length of the rules, or -1 if the rules
- * are zero-terminated.
- * @param dir the desired direction
- * @param parseError a pointer to a UParseError struct to receive the
- * details of any parsing errors. This parameter may be NULL if no
- * parsing error details are desired.
- * @param status a pointer to the UErrorCode
+ *                    are NUL-terminated.
+ * @param parseError a pointer to a UParseError struct to receive the details
+ *                   of any parsing errors. This parameter may be NULL if no
+ *                   parsing error details are desired.
+ * @param pErrorCode a pointer to the UErrorCode
  * @return a transliterator pointer that may be passed to other
- * utrans_xxx() functions, or NULL if the open call fails.
- * @stable ICU 2.0
+ *         utrans_xxx() functions, or NULL if the open call fails.
+ * @draft ICU 2.8
  */
-U_CAPI UTransliterator* U_EXPORT2 
-utrans_open(const char* id,
-            UTransDirection dir,
-            const UChar* rules,         /* may be Null */
-            int32_t rulesLength,        /* -1 if null-terminated */ 
-            UParseError* parseError,    /* may be Null */
-            UErrorCode* status);
+U_CAPI UTransliterator* U_EXPORT2
+utrans_openU(const UChar *id,
+             int32_t idLength,
+             UTransDirection dir,
+             const UChar *rules,
+             int32_t rulesLength,
+             UParseError *parseError,
+             UErrorCode *pErrorCode);
 
 /**
  * Open an inverse of an existing transliterator.  For this to work,
@@ -223,22 +237,20 @@
 
 /**
  * Return the programmatic identifier for this transliterator.
- * If this identifier is passed to utrans_open(), it will open
+ * If this identifier is passed to utrans_openU(), it will open
  * a transliterator equivalent to this one, if the ID has been
  * registered.
+ *
  * @param trans the transliterator to return the ID of.
- * @param buf the buffer in which to receive the ID.  This may be
- * NULL, in which case no characters are copied.
- * @param bufCapacity the capacity of the buffer.  Ignored if buf is
- * NULL.
- * @return the actual length of the ID, not including
- * zero-termination.  This may be greater than bufCapacity.
- * @stable ICU 2.0
+ * @param resultLength pointer to an output variable receiving the length
+ *        of the ID string; can be NULL
+ * @return the NUL-terminated ID string
+ *
+ * @draft ICU 2.8
  */
-U_CAPI int32_t U_EXPORT2 
-utrans_getID(const UTransliterator* trans,
-             char* buf,
-             int32_t bufCapacity);
+U_CAPI const UChar * U_EXPORT2
+utrans_getUnicodeID(const UTransliterator *trans,
+                    int32_t *resultLength);
 
 /**
  * Register an open transliterator with the system.  When
@@ -261,13 +273,14 @@
 /**
  * Unregister a transliterator from the system.  After this call the
  * system will no longer recognize the given ID when passed to
- * utrans_open().  If the id is invalid then nothing is done.
+ * utrans_open(). If the ID is invalid then nothing is done.
  *
- * @param id a zero-terminated ID
- * @stable ICU 2.0
+ * @param id an ID to unregister
+ * @param idLength the length of id, or -1 if id is zero-terminated
+ * @draft ICU 2.8
  */
-U_CAPI void U_EXPORT2 
-utrans_unregister(const char* id);
+U_CAPI void U_EXPORT2
+utrans_unregisterID(const UChar* id, int32_t idLength);
 
 /**
  * Set the filter used by a transliterator.  A filter can be used to
@@ -295,6 +308,8 @@
 
 /**
  * Return the number of system transliterators.
+ * It is recommended to use utrans_openIDs() instead.
+ *
  * @return the number of system transliterators.
  * @stable ICU 2.0
  */
@@ -302,26 +317,16 @@
 utrans_countAvailableIDs(void);
 
 /**
- * Return the ID of the index-th system transliterator.  The result
- * is placed in the given buffer.  If the given buffer is too small,
- * the initial substring is copied to buf.  The result in buf is
- * always zero-terminated.
+ * Return a UEnumeration for the available transliterators.
  *
- * @param index the number of the transliterator to return.  Must
- * satisfy 0 <= index < utrans_countAvailableIDs().  If index is out
- * of range then it is treated as if it were 0.
- * @param buf the buffer in which to receive the ID.  This may be
- * NULL, in which case no characters are copied.
- * @param bufCapacity the capacity of the buffer.  Ignored if buf is
- * NULL.
- * @return the actual length of the index-th ID, not including
- * zero-termination.  This may be greater than bufCapacity.
- * @stable ICU 2.0
+ * @param pErrorCode Pointer to the UErrorCode in/out parameter.
+ * @return UEnumeration for the available transliterators.
+ *         Close with uenum_close().
+ *
+ * @draft ICU 2.8
  */
-U_CAPI int32_t U_EXPORT2 
-utrans_getAvailableID(int32_t index,
-                      char* buf,
-                      int32_t bufCapacity);
+U_CAPI UEnumeration * U_EXPORT2
+utrans_openIDs(UErrorCode *pErrorCode);
 
 /********************************************************************
  * Transliteration API
@@ -482,32 +487,95 @@
                               UTransPosition* pos,
                               UErrorCode* status);
 
+/* deprecated API ----------------------------------------------------------- */
+
+/* see utrans.h documentation for why these functions are deprecated */
 
-/********************* Obsolete API ************************************/
 /**
- * TODO: Remove after Aug 2002
+ * Deprecated, use utrans_openU() instead.
+ * Open a custom transliterator, given a custom rules string 
+ * OR 
+ * a system transliterator, given its ID.  
+ * Any non-NULL result from this function should later be closed with
+ * utrans_close().
+ *
+ * @param id a valid ID, as returned by utrans_getAvailableID()
+ * @param dir the desired direction
+ * @param rules the transliterator rules.  See the C++ header rbt.h
+ * for rules syntax. If NULL then a system transliterator matching 
+ * the ID is returned.
+ * @param rulesLength the length of the rules, or -1 if the rules
+ * are zero-terminated.
+ * @param parseError a pointer to a UParseError struct to receive the
+ * details of any parsing errors. This parameter may be NULL if no
+ * parsing error details are desired.
+ * @param status a pointer to the UErrorCode
+ * @return a transliterator pointer that may be passed to other
+ * utrans_xxx() functions, or NULL if the open call fails.
+ * @deprecated ICU 2.8 Use utrans_openU() instead, see utrans.h
  */
+U_CAPI UTransliterator* U_EXPORT2 
+utrans_open(const char* id,
+            UTransDirection dir,
+            const UChar* rules,         /* may be Null */
+            int32_t rulesLength,        /* -1 if null-terminated */ 
+            UParseError* parseError,    /* may be Null */
+            UErrorCode* status);
 
-#ifdef U_USE_DEPRECATED_FORMAT_API
-
-#if ((U_ICU_VERSION_MAJOR_NUM != 2) || (U_ICU_VERSION_MINOR_NUM != 2))
-#   error "ICU version has changed. Please redefine the macros under U_USE_DEPRECATED_FORMAT_API pre-processor definition"
-#else 
-    U_CAPI UTransliterator* U_EXPORT2 
-    utrans_openRules(const char* id,
-                     const UChar* rules,
-                     int32_t rulesLength, /* -1 if null-terminated */
-                     UTransDirection dir,
-                     UParseError* parseErr, /* may be NULL */
-                     UErrorCode* status){
-        return utrans_open(id,dir,rules,rulesLength,parseErr,status);
-    }
+/**
+ * Deprecated, use utrans_getUnicodeID() instead.
+ * Return the programmatic identifier for this transliterator.
+ * If this identifier is passed to utrans_open(), it will open
+ * a transliterator equivalent to this one, if the ID has been
+ * registered.
+ * @param trans the transliterator to return the ID of.
+ * @param buf the buffer in which to receive the ID.  This may be
+ * NULL, in which case no characters are copied.
+ * @param bufCapacity the capacity of the buffer.  Ignored if buf is
+ * NULL.
+ * @return the actual length of the ID, not including
+ * zero-termination.  This may be greater than bufCapacity.
+ * @deprecated ICU 2.8 Use utrans_getUnicodeID() instead, see utrans.h
+ */
+U_CAPI int32_t U_EXPORT2 
+utrans_getID(const UTransliterator* trans,
+             char* buf,
+             int32_t bufCapacity);
 
-#   define utrans_open_2_2(id,dir,status) utrans_open(id,dir,NULL,0,NULL,status)
+/**
+ * Deprecated, use utrans_unregisterID() instead.
+ * Unregister a transliterator from the system.  After this call the
+ * system will no longer recognize the given ID when passed to
+ * utrans_open().  If the id is invalid then nothing is done.
+ *
+ * @param id a zero-terminated ID
+ * @deprecated ICU 2.8 Use utrans_unregisterID() instead, see utrans.h
+ */
+U_CAPI void U_EXPORT2 
+utrans_unregister(const char* id);
 
-#endif
-#endif
-/********************* End **********************************************/
+/**
+ * Deprecated, use utrans_openIDs() instead.
+ * Return the ID of the index-th system transliterator.  The result
+ * is placed in the given buffer.  If the given buffer is too small,
+ * the initial substring is copied to buf.  The result in buf is
+ * always zero-terminated.
+ *
+ * @param index the number of the transliterator to return.  Must
+ * satisfy 0 <= index < utrans_countAvailableIDs().  If index is out
+ * of range then it is treated as if it were 0.
+ * @param buf the buffer in which to receive the ID.  This may be
+ * NULL, in which case no characters are copied.
+ * @param bufCapacity the capacity of the buffer.  Ignored if buf is
+ * NULL.
+ * @return the actual length of the index-th ID, not including
+ * zero-termination.  This may be greater than bufCapacity.
+ * @deprecated ICU 2.8 Use utrans_openIDs() instead, see utrans.h
+ */
+U_CAPI int32_t U_EXPORT2 
+utrans_getAvailableID(int32_t index,
+                      char* buf,
+                      int32_t bufCapacity);
 
 #endif /* #if !UCONFIG_NO_TRANSLITERATION */