зеркало из https://github.com/mozilla/gecko-dev.git
491 строка
17 KiB
C
491 строка
17 KiB
C
|
/*
|
|||
|
*****************************************************************************************
|
|||
|
* *
|
|||
|
* COPYRIGHT: *
|
|||
|
* (C) Copyright Taligent, Inc., 1996, 1997 *
|
|||
|
* (C) Copyright International Business Machines Corporation, 1996, 1997 *
|
|||
|
* Licensed Material - Program-Property of IBM - All Rights Reserved. *
|
|||
|
* US Government Users Restricted Rights - Use, duplication, or disclosure *
|
|||
|
* restricted by GSA ADP Schedule Contract with IBM Corp. *
|
|||
|
* *
|
|||
|
*****************************************************************************************
|
|||
|
*
|
|||
|
* FILE NAME : PTYPES.H
|
|||
|
*
|
|||
|
* Date Name Description
|
|||
|
* 12/11/96 helena Creation.
|
|||
|
* 02/27/97 aliu Added typedefs for ClassID, int8, int16, int32, uint8, uint16,
|
|||
|
* and uint32.
|
|||
|
* 04/01/97 aliu Added XP_CPLUSPLUS and modified to work under C as well as C++.
|
|||
|
* Modified to use memcpy() for arrayCopy() fns.
|
|||
|
* 04/14/97 aliu Added TPlatformUtilities.
|
|||
|
* 05/07/97 aliu Added import/export specifiers (replacing the old broken
|
|||
|
* EXT_CLASS). Added version number for our code. Cleaned up
|
|||
|
* header.
|
|||
|
* 6/20/97 helena Java class name change.
|
|||
|
*****************************************************************************************
|
|||
|
*/
|
|||
|
|
|||
|
#ifndef _PTYPES
|
|||
|
#define _PTYPES
|
|||
|
|
|||
|
#include "nlsxp.h"
|
|||
|
#include <memory.h>
|
|||
|
#include <string.h>
|
|||
|
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* Analytics version number */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
/**
|
|||
|
* Analytic package code version number. This version number must be incremented if and
|
|||
|
* only if the code has changed in a binary incompatible way. For example, if the
|
|||
|
* algorithm for generating sort keys has changed, this code version must be incremented.
|
|||
|
*
|
|||
|
* This is for internal use only. Clients should use ResourceBundle::getVersionNumber().
|
|||
|
* ResourceBundle::getVersionNumber() returns a full version number for a resource,
|
|||
|
* which consists of this code version number concatenated with the ResourceBundle data
|
|||
|
* file version number.
|
|||
|
*/
|
|||
|
#define T_ANALYTIC_PACKAGE_VERSION "1"
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* Flags related to testing code coverage */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
#define TESTING_CODE_COVERAGE 1 /* defined when executing tests */
|
|||
|
/* with code coverage reporting */
|
|||
|
|
|||
|
/* #define EXTENDED_FUNCTIONALITY */ /* in general this is undefined */
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* Flags specifying host character set */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
#define USES_ISO_8859_1 1
|
|||
|
#define USES_EBCDIC 0
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* Platform/Language determination */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
#if defined(__OS2__) || defined (_AIX) || defined(__AS400__)
|
|||
|
#define USE_POSIX
|
|||
|
#endif
|
|||
|
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* Boolean data type */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
/* uncomment these lines on compilers that don't directly support "bool" */
|
|||
|
/* it may be necessary to change this for different platforms */
|
|||
|
/*
|
|||
|
typedef char bool;
|
|||
|
enum {
|
|||
|
true = 1,
|
|||
|
false = 0
|
|||
|
};
|
|||
|
*/
|
|||
|
/*Change the bool type to t_bool and true to TRUE and false to FALSE*/
|
|||
|
/*till all the files are corrected and tested,we will retain both
|
|||
|
definitions*/
|
|||
|
#ifdef TRUE
|
|||
|
#undef TRUE
|
|||
|
#endif
|
|||
|
|
|||
|
#ifdef FALSE
|
|||
|
#undef FALSE
|
|||
|
#endif
|
|||
|
|
|||
|
typedef char t_bool;
|
|||
|
enum {
|
|||
|
TRUE = 1,
|
|||
|
FALSE = 0
|
|||
|
};
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* Other generic data types */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
/** Unicode character */
|
|||
|
/*#if sizeof(wchar_t) < 2 */
|
|||
|
/*#ifndef _AIX / * AIX defines UniChar in /usr/include/sys/types.h */
|
|||
|
/* typedef unsigned short UniChar; */
|
|||
|
/*#endif */
|
|||
|
/*#else */
|
|||
|
/*typedef wchar_t UniChar; */
|
|||
|
/*#endif */
|
|||
|
|
|||
|
|
|||
|
/** Unicode string offset */
|
|||
|
typedef PRInt32 TextOffset;
|
|||
|
|
|||
|
/* Before compiling on a new platform, add a section for that platform, */
|
|||
|
/* defining the sized integral data types. */
|
|||
|
typedef PRInt8 t_int8;
|
|||
|
typedef PRUint8 t_uint8;
|
|||
|
typedef PRInt16 t_int16;
|
|||
|
typedef PRUint16 t_uint16;
|
|||
|
typedef PRInt32 t_int32;
|
|||
|
typedef PRUint32 t_uint32;
|
|||
|
#define T_INT32_MAX (LONG_MAX)
|
|||
|
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* Calendar/TimeZone data types */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
/* Date should be a 64-bit long integer. For systems/compilers */
|
|||
|
/* that do not support 64-bit long integer, use IEEE double. */
|
|||
|
/*#if sizeof(long) >= 64 */
|
|||
|
/*typedef long Date; */
|
|||
|
/*#else */
|
|||
|
typedef double Date;
|
|||
|
/*#endif */
|
|||
|
|
|||
|
/* Common time manipulation constants */
|
|||
|
#define kMillisPerSecond (PR_INT32(1000))
|
|||
|
#define kMillisPerMinute (PR_INT32(60) * kMillisPerSecond)
|
|||
|
#define kMillisPerHour (PR_INT32(60) * kMillisPerMinute)
|
|||
|
#define kMillisPerDay (PR_INT32(24) * kMillisPerHour)
|
|||
|
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* ClassID-based RTTI */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
/**
|
|||
|
* ClassID is used to identify classes without using RTTI, since RTTI
|
|||
|
* is not yet supported by all C++ compilers. Each class hierarchy which needs
|
|||
|
* to implement polymorphic clone() or operator==() defines two methods,
|
|||
|
* described in detail below. ClassID values can be compared using operator==().
|
|||
|
* Nothing else should be done with them.
|
|||
|
*
|
|||
|
* getDynamicClassID() is declared in the base class of the hierarchy as
|
|||
|
* a pure virtual. Each concrete subclass implements it in the same way:
|
|||
|
*
|
|||
|
* class Base {
|
|||
|
* public:
|
|||
|
* virtual ClassID getDynamicClassID() const = 0;
|
|||
|
* }
|
|||
|
*
|
|||
|
* class Derived {
|
|||
|
* public:
|
|||
|
* virtual ClassID getDynamicClassID() const
|
|||
|
* {
|
|||
|
* return Derived::getStaticClassID();
|
|||
|
* }
|
|||
|
* }
|
|||
|
*
|
|||
|
* Each concrete class implements getStaticClassID() as well, which allows
|
|||
|
* clients to test for a specific type.
|
|||
|
*
|
|||
|
* class Derived {
|
|||
|
* public:
|
|||
|
* static ClassID getStaticClassID();
|
|||
|
* private:
|
|||
|
* static char fgClassID;
|
|||
|
* }
|
|||
|
*
|
|||
|
* // In Derived.cpp:
|
|||
|
* ClassID Derived::getStaticClassID() { return (ClassID)&Derived::fgClassID; }
|
|||
|
* char Derived::fgClassID = 0; // Value is irrelevant
|
|||
|
*/
|
|||
|
|
|||
|
typedef void* ClassID;
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* DLL import-export API control */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
/**
|
|||
|
* Control of DLL import/export. We break the Analytic package into four DLLs;
|
|||
|
* the Utility, Format, Findword, and Collate DLLs. Each DLL defines the appropriate
|
|||
|
* compile-time symbol (e.g., T_UTILITY_IMPLEMENTATION) when building. Declarations
|
|||
|
* of exported API us the appropriate declarator (e.g., T_UTILITY_API).
|
|||
|
*
|
|||
|
* If new DLLs are added, this section must be expanded.
|
|||
|
*/
|
|||
|
|
|||
|
#define T_EXPORT NLSAPI_CLASS_EXPORT
|
|||
|
#define T_IMPORT NLSAPI_CLASS_IMPORT
|
|||
|
|
|||
|
#ifdef T_UTILITY_IMPLEMENTATION
|
|||
|
#define T_UTILITY_API T_EXPORT
|
|||
|
#define T_COLLATE_API T_IMPORT
|
|||
|
#define T_FORMAT_API T_IMPORT
|
|||
|
#define T_FINDWORD_API T_IMPORT
|
|||
|
#elif defined(T_FINDWORD_IMPLEMENTATION)
|
|||
|
#define T_UTILITY_API T_IMPORT
|
|||
|
#define T_COLLATE_API T_IMPORT
|
|||
|
#define T_FORMAT_API T_IMPORT
|
|||
|
#define T_FINDWORD_API T_EXPORT
|
|||
|
#elif defined(T_FORMAT_IMPLEMENTATION)
|
|||
|
#define T_UTILITY_API T_IMPORT
|
|||
|
#define T_COLLATE_API T_IMPORT
|
|||
|
#define T_FORMAT_API T_EXPORT
|
|||
|
#define T_FINDWORD_API T_IMPORT
|
|||
|
#elif defined(T_COLLATE_IMPLEMENTATION)
|
|||
|
#define T_UTILITY_API T_IMPORT
|
|||
|
#define T_COLLATE_API T_EXPORT
|
|||
|
#define T_FORMAT_API T_IMPORT
|
|||
|
#define T_FINDWORD_API T_IMPORT
|
|||
|
#else
|
|||
|
#define T_UTILITY_API T_IMPORT
|
|||
|
#define T_COLLATE_API T_IMPORT
|
|||
|
#define T_FORMAT_API T_IMPORT
|
|||
|
#define T_FINDWORD_API T_IMPORT
|
|||
|
#endif
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* ErrorCode */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
/** Error code to replace exception handling */
|
|||
|
enum _ErrorCode {
|
|||
|
ZERO_ERROR = 0,
|
|||
|
ILLEGAL_ARGUMENT_ERROR, /* Start of codes indicating failure */
|
|||
|
MISSING_RESOURCE_ERROR,
|
|||
|
INVALID_FORMAT_ERROR,
|
|||
|
FILE_ACCESS_ERROR,
|
|||
|
INTERNAL_PROGRAM_ERROR, /* Indicates a bug in the library code */
|
|||
|
MESSAGE_PARSE_ERROR,
|
|||
|
MEMORY_ALLOCATION_ERROR, /* Memory allocation error */
|
|||
|
INDEX_OUTOFBOUNDS_ERROR,
|
|||
|
PARSE_ERROR, /* Equivalent to Java ParseException */
|
|||
|
USING_FALLBACK_ERROR = -128, /* Start of information results (semantically successful) */
|
|||
|
USING_DEFAULT_ERROR
|
|||
|
};
|
|||
|
|
|||
|
|
|||
|
typedef int32 ErrorCode;
|
|||
|
|
|||
|
|
|||
|
/* Use the following to determine if an ErrorCode represents */
|
|||
|
/* operational success or failure. */
|
|||
|
#ifdef NLS_CPLUSPLUS
|
|||
|
inline t_bool SUCCESS(ErrorCode code) { return (t_bool)(code<=ZERO_ERROR); }
|
|||
|
inline t_bool FAILURE(ErrorCode code) { return (t_bool)(code>ZERO_ERROR); }
|
|||
|
#else
|
|||
|
#define SUCCESS(x) ((x)<=ZERO_ERROR)
|
|||
|
#define FAILURE(x) ((x)>ZERO_ERROR)
|
|||
|
#endif
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* TPlatformUtilities */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
#ifdef NLS_CPLUSPLUS
|
|||
|
/**
|
|||
|
* Platform utilities isolates the platform dependencies of the libarary. For
|
|||
|
* each platform which this code is ported to, these functions may have to
|
|||
|
* be re-implemented.
|
|||
|
*/
|
|||
|
|
|||
|
#ifdef NLS_MAC
|
|||
|
#pragma export on
|
|||
|
#endif
|
|||
|
|
|||
|
class T_UTILITY_API TPlatformUtilities
|
|||
|
{
|
|||
|
public:
|
|||
|
/* Floating point utilities */
|
|||
|
static t_bool isNaN(double);
|
|||
|
static t_bool isInfinite(double);
|
|||
|
static double getNaN();
|
|||
|
static double getInfinity();
|
|||
|
|
|||
|
/**
|
|||
|
* Time zone utilities
|
|||
|
*
|
|||
|
* Wrappers for C runtime library functions relating to timezones.
|
|||
|
* The t_tzset() function (similar to tzset) uses the current setting
|
|||
|
* of the environment variable TZ to assign values to three global
|
|||
|
* variables: daylight, timezone, and tzname. These variables have the
|
|||
|
* following meanings, and are declared in <time.h>.
|
|||
|
*
|
|||
|
* daylight Nonzero if daylight-saving-time zone (DST) is specified
|
|||
|
* in TZ; otherwise, 0. Default value is 1.
|
|||
|
* timezone Difference in seconds between coordinated universal
|
|||
|
* time and local time. E.g., -28,800 for PST (GMT-8hrs)
|
|||
|
* tzname(0) Three-letter time-zone name derived from TZ environment
|
|||
|
* variable. E.g., "PST".
|
|||
|
* tzname(1) Three-letter DST zone name derived from TZ environment
|
|||
|
* variable. E.g., "PDT". If DST zone is omitted from TZ,
|
|||
|
* tzname(1) is an empty string.
|
|||
|
*
|
|||
|
* Notes: For example, to set the TZ environment variable to correspond
|
|||
|
* to the current time zone in Germany, you can use one of the
|
|||
|
* following statements:
|
|||
|
*
|
|||
|
* set TZ=GST1GDT
|
|||
|
* set TZ=GST+1GDT
|
|||
|
*
|
|||
|
* If the TZ value is not set, t_tzset() attempts to use the time zone
|
|||
|
* information specified by the operating system. Under Windows NT
|
|||
|
* and Windows 95, this information is specified in the Control Panel<EFBFBD>s
|
|||
|
* Date/Time application.
|
|||
|
*/
|
|||
|
static void t_tzset();
|
|||
|
static t_int32 t_timezone();
|
|||
|
static char* t_tzname(int index);
|
|||
|
|
|||
|
/* Get system time in seconds since the epoch start (GMT 1/1/70). */
|
|||
|
static t_int32 time();
|
|||
|
|
|||
|
/* Return the default data directory for this platform. See Locale. */
|
|||
|
static const char* getDefaultDataDirectory();
|
|||
|
|
|||
|
/* complete a relative path to a full pathname, and convert to platform-specific syntax. */
|
|||
|
/* The character seperating directories for the relative path is '|'. */
|
|||
|
static void pathnameInContext( char* fullname, t_int32 maxsize, char* relpath );
|
|||
|
|
|||
|
/* Return the default locale ID string by querying ths system, or
|
|||
|
zero if one cannot be found. */
|
|||
|
static const char* getDefaultLocaleID();
|
|||
|
|
|||
|
/**
|
|||
|
* Retrun true if this platform is big-endian, that is, if the number
|
|||
|
* 0x1234 is stored 0x12, 0x34 in memory. Return false if this platform
|
|||
|
* is little-endian, and is, if 0x1234 is stored 0x34, 0x12 in memory.
|
|||
|
*/
|
|||
|
static t_bool isBigEndian();
|
|||
|
|
|||
|
/*
|
|||
|
* Finds the least double greater than d (if positive == true),
|
|||
|
* or the greatest double less than d (if positive == false).
|
|||
|
* If NaN, returns same value.
|
|||
|
*
|
|||
|
* Does not affect floating-point flags,
|
|||
|
*/
|
|||
|
static double nextDouble(double d, t_bool positive);
|
|||
|
|
|||
|
inline static t_uint8 mapHostTo8859_1(t_uint8 hostChar);
|
|||
|
inline static t_uint8 map8859_1toHost(t_uint8 latin1char);
|
|||
|
|
|||
|
private:
|
|||
|
static t_bool fgIsEndianismDetermined;
|
|||
|
static t_bool fgIsBigEndian;
|
|||
|
|
|||
|
/**
|
|||
|
* Return a pointer to the top N bytes of the given double. Used
|
|||
|
* internally by the NaN- and Infinity-related functions.
|
|||
|
*/
|
|||
|
static char* topNBytesOfDouble(double* d, int n);
|
|||
|
|
|||
|
static t_uint8 EBCDICtoLatin1[];
|
|||
|
static t_uint8 Latin1toEBCDIC[];
|
|||
|
|
|||
|
};
|
|||
|
|
|||
|
#ifdef NLS_MAC
|
|||
|
#pragma export off
|
|||
|
#endif
|
|||
|
|
|||
|
inline char*
|
|||
|
TPlatformUtilities::topNBytesOfDouble(double* d, int n)
|
|||
|
{
|
|||
|
return TPlatformUtilities::isBigEndian() ?
|
|||
|
(char*)d :
|
|||
|
(char*)(d + 1) - n;
|
|||
|
}
|
|||
|
|
|||
|
#endif
|
|||
|
|
|||
|
/*=====================================================================================*/
|
|||
|
/* Array copy utility functions */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
#ifdef NLS_CPLUSPLUS
|
|||
|
inline void arrayCopy(const double* src, double* dst, t_int32 count)
|
|||
|
{ memcpy(dst, src, (size_t)(count * sizeof(*src))); }
|
|||
|
|
|||
|
inline void arrayCopy(const double* src, t_int32 srcStart, double* dst, t_int32 dstStart, t_int32 count)
|
|||
|
{ memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); }
|
|||
|
|
|||
|
inline void arrayCopy(const t_bool* src, t_bool* dst, t_int32 count)
|
|||
|
{ memcpy(dst, src, (size_t)(count * sizeof(*src))); }
|
|||
|
|
|||
|
inline void arrayCopy(const t_bool* src, t_int32 srcStart, t_bool* dst, t_int32 dstStart, t_int32 count)
|
|||
|
{ memcpy(dst+dstStart, src+srcStart, (size_t)(count * sizeof(*src))); }
|
|||
|
#endif
|
|||
|
|
|||
|
/*------------------------------------------------------------------------------*/
|
|||
|
/* Host character set mappings */
|
|||
|
/* */
|
|||
|
/* We provide a mapping facility for 8-bit host character sets. We supply an */
|
|||
|
/* implementation for host EBCDIC, which we map to 8859-1 (Latin1). The source */
|
|||
|
/* of our data is RFC 1345; we use the charset IBM297 (aka ebcdic-cp-fr) as our */
|
|||
|
/* standard EBCDIC. */
|
|||
|
/*------------------------------------------------------------------------------*/
|
|||
|
|
|||
|
#ifdef NLS_CPLUSPLUS
|
|||
|
|
|||
|
inline t_uint8
|
|||
|
TPlatformUtilities::mapHostTo8859_1(t_uint8 hostChar)
|
|||
|
{
|
|||
|
#if USES_ISO_8859_1
|
|||
|
return hostChar;
|
|||
|
#elif USES_EBCDIC
|
|||
|
return EBCDICtoLatin1[hostChar];
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
inline t_uint8
|
|||
|
TPlatformUtilities::map8859_1toHost(t_uint8 latin1char)
|
|||
|
{
|
|||
|
#if USES_ISO_8859_1
|
|||
|
return latin1char;
|
|||
|
#elif USES_EBCDIC
|
|||
|
return Latin1toEBCDIC[latin1char];
|
|||
|
#endif
|
|||
|
}
|
|||
|
|
|||
|
#endif /* NLS_CPLUSPLUS */
|
|||
|
/*=====================================================================================*/
|
|||
|
/* Debugging */
|
|||
|
/*=====================================================================================*/
|
|||
|
|
|||
|
/* This function is useful for debugging; it returns the text name */
|
|||
|
/* of an ErrorCode result. This is not the most efficient way of */
|
|||
|
/* doing this but it's just for Debug builds anyway. */
|
|||
|
#if defined(_DEBUG) && defined(NLS_CPLUSPLUS)
|
|||
|
inline const char* errorName(ErrorCode code)
|
|||
|
{
|
|||
|
switch (code)
|
|||
|
{
|
|||
|
case ZERO_ERROR: return "ZERO_ERROR";
|
|||
|
case ILLEGAL_ARGUMENT_ERROR: return "ILLEGAL_ARGUMENT_ERROR";
|
|||
|
case MISSING_RESOURCE_ERROR: return "MISSING_RESOURCE_ERROR";
|
|||
|
case INVALID_FORMAT_ERROR: return "INVALID_FORMAT_ERROR";
|
|||
|
case FILE_ACCESS_ERROR: return "FILE_ACCESS_ERROR";
|
|||
|
case INTERNAL_PROGRAM_ERROR: return "INTERNAL_PROGRAM_ERROR";
|
|||
|
case MESSAGE_PARSE_ERROR: return "MESSAGE_PARSE_ERROR";
|
|||
|
case MEMORY_ALLOCATION_ERROR: return "MEMORY_ALLOCATION_ERROR";
|
|||
|
case USING_FALLBACK_ERROR: return "USING_FALLBACK_ERROR";
|
|||
|
case USING_DEFAULT_ERROR: return "USING_DEFAULT_ERROR";
|
|||
|
case PARSE_ERROR: return "PARSE_ERROR";
|
|||
|
default: return "[BOGUS ErrorCode]";
|
|||
|
}
|
|||
|
}
|
|||
|
#endif
|
|||
|
|
|||
|
/*
|
|||
|
Redefine deprecated classes.
|
|||
|
*/
|
|||
|
#ifdef NLS_CPLUSPLUS
|
|||
|
class Collator;
|
|||
|
typedef Collator Collation;
|
|||
|
class RuleBasedCollator;
|
|||
|
typedef RuleBasedCollator TableCollation;
|
|||
|
class CollationKey;
|
|||
|
typedef CollationKey SortKey;
|
|||
|
|
|||
|
class BreakIterator;
|
|||
|
typedef BreakIterator TextBoundary;
|
|||
|
|
|||
|
#endif
|
|||
|
#endif
|