//
// file: rbbirb.cpp
//
-// Copyright (C) 2002-2005, International Business Machines Corporation and others.
+// Copyright (C) 2002-2008, International Business Machines Corporation and others.
// All Rights Reserved.
//
// This file contains the RBBIRuleBuilder class implementation. This is the main class for
//
//----------------------------------------------------------------------------------------
RBBIRuleBuilder::RBBIRuleBuilder(const UnicodeString &rules,
- UParseError &parseErr,
+ UParseError *parseErr,
UErrorCode &status)
: fRules(rules)
{
fStatus = &status; // status is checked below
- fParseError = &parseErr;
+ fParseError = parseErr;
fDebugEnv = NULL;
#ifdef RBBI_DEBUG
fDebugEnv = getenv("U_RBBIDEBUG");
fRuleStatusVals = NULL;
fScanner = NULL;
fSetBuilder = NULL;
+ if (parseErr) {
+ uprv_memset(parseErr, 0, sizeof(UParseError));
+ }
if (U_FAILURE(status)) {
return;
//----------------------------------------------------------------------------------------
BreakIterator *
RBBIRuleBuilder::createRuleBasedBreakIterator( const UnicodeString &rules,
- UParseError &parseError,
+ UParseError *parseError,
UErrorCode &status)
{
// status checked below
// and list of all Unicode Sets referenced by the rules.
//
RBBIRuleBuilder builder(rules, parseError, status);
- builder.fScanner->parse();
if (U_FAILURE(status)) { // status checked here bcos build below doesn't
return NULL;
}
+ builder.fScanner->parse();
//
// UnicodeSet processing.
builder.fSafeFwdTables == NULL || builder.fSafeRevTables == NULL))
{
status = U_MEMORY_ALLOCATION_ERROR;
+ }
+
+ // Before building the tables, check to make sure the status is ok.
+ if (U_FAILURE(status)) {
+ delete builder.fForwardTables; builder.fForwardTables = NULL;
+ delete builder.fReverseTables; builder.fReverseTables = NULL;
+ delete builder.fSafeFwdTables; builder.fSafeFwdTables = NULL;
+ delete builder.fSafeRevTables; builder.fSafeRevTables = NULL;
return NULL;
}
builder.fReverseTables->build();
builder.fSafeFwdTables->build();
builder.fSafeRevTables->build();
- if (U_FAILURE(status)) {
- return NULL;
- }
#ifdef RBBI_DEBUG
if (builder.fDebugEnv && uprv_strstr(builder.fDebugEnv, "states")) {
// in the run-time format.
//
RBBIDataHeader *data = builder.flattenData(); // returns NULL if error
+ if (U_FAILURE(*builder.fStatus)) {
+ return NULL;
+ }
//