1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
483a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius*   Copyright (C) 2002-2011, International Business Machines
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   Corporation and others.  All Rights Reserved.
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*******************************************************************************
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   file name:  uset_props.cpp
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   encoding:   US-ASCII
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   tab size:   8 (not used)
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   indentation:4
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created on: 2004aug30
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   created by: Markus W. Scherer
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*
16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   C wrappers around UnicodeSet functions that are implemented in
17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*   uniset_props.cpp, split off for modularization.
18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru*/
19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h"
21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uobject.h"
22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uset.h"
23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/uniset.h"
24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "cmemory.h"
25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/ustring.h"
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/parsepos.h"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_USE
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI USet* U_EXPORT2
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuset_openPattern(const UChar* pattern, int32_t patternLength,
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 UErrorCode* ec)
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString pat(patternLength==-1, pattern, patternLength);
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeSet* set = new UnicodeSet(pat, *ec);
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test for NULL */
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(set == 0) {
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *ec = U_MEMORY_ALLOCATION_ERROR;
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
4183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*ec)) {
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete set;
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        set = NULL;
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (USet*) set;
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI USet* U_EXPORT2
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuset_openPatternOptions(const UChar* pattern, int32_t patternLength,
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 uint32_t options,
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                 UErrorCode* ec)
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString pat(patternLength==-1, pattern, patternLength);
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeSet* set = new UnicodeSet(pat, options, NULL, *ec);
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    /* test for NULL */
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(set == 0) {
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *ec = U_MEMORY_ALLOCATION_ERROR;
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
6183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*ec)) {
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        delete set;
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        set = NULL;
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return (USet*) set;
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuset_applyPattern(USet *set,
72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  const UChar *pattern, int32_t patternLength,
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  uint32_t options,
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                  UErrorCode *status){
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // status code needs to be checked since we
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // dereference it
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status == NULL || U_FAILURE(*status)){
79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // check only the set paramenter
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // if pattern is NULL or null terminate
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    // UnicodeString constructor takes care of it
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(set == NULL){
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        *status = U_ILLEGAL_ARGUMENT_ERROR;
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString pat(pattern, patternLength);
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ParsePosition pos;
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ((UnicodeSet*) set)->applyPattern(pat, pos, options, NULL, *status);
95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return pos.getIndex();
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuset_applyIntPropertyValue(USet* set,
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               UProperty prop, int32_t value, UErrorCode* ec) {
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ((UnicodeSet*) set)->applyIntPropertyValue(prop, value, *ec);
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI void U_EXPORT2
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuset_applyPropertyAlias(USet* set,
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        const UChar *prop, int32_t propLength,
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                        const UChar *value, int32_t valueLength,
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UErrorCode* ec) {
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString p(prop, propLength);
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString v(value, valueLength);
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ((UnicodeSet*) set)->applyPropertyAlias(p, v, *ec);
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI UBool U_EXPORT2
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuset_resemblesPattern(const UChar *pattern, int32_t patternLength,
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                      int32_t pos) {
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString pat(pattern, patternLength);
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return ((pos+1) < pat.length() &&
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            pat.charAt(pos) == (UChar)91/*[*/) ||
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UnicodeSet::resemblesPattern(pat, pos);
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CAPI int32_t U_EXPORT2
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruuset_toPattern(const USet* set,
130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               UChar* result, int32_t resultCapacity,
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               UBool escapeUnprintable,
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru               UErrorCode* ec) {
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString pat;
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    ((const UnicodeSet*) set)->toPattern(pat, escapeUnprintable);
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return pat.extract(result, resultCapacity, *ec);
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
13783a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius
13883a171d1a62abf406f7f44ae671823d5ec20db7dCraig CorneliusU_CAPI void U_EXPORT2
13983a171d1a62abf406f7f44ae671823d5ec20db7dCraig Corneliususet_closeOver(USet* set, int32_t attributes) {
14083a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius    ((UnicodeSet*) set)->UnicodeSet::closeOver(attributes);
14183a171d1a62abf406f7f44ae671823d5ec20db7dCraig Cornelius}
142