1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/*
2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius *   Copyright (C) 2003-2014, International Business Machines
4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   Corporation and others.  All Rights Reserved.
5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * File prscmnts.cpp
8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Modification History:
10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *
11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   Date          Name        Description
12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *   08/22/2003    ram         Creation.
13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru *******************************************************************************
14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */
15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
16fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// Safer use of UnicodeString.
17fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#ifndef UNISTR_FROM_CHAR_EXPLICIT
18fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#   define UNISTR_FROM_CHAR_EXPLICIT explicit
19fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
20fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
21fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius// Less important, but still a good idea.
22fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#ifndef UNISTR_FROM_STRING_EXPLICIT
23fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#   define UNISTR_FROM_STRING_EXPLICIT explicit
24fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius#endif
25fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius
26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/regex.h"
27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/unistr.h"
28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/parseerr.h"
29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "prscmnts.h"
30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h>
31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h>
32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_USE
34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if UCONFIG_NO_REGULAR_EXPRESSIONS==0 /* donot compile when RegularExpressions not available */
36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define MAX_SPLIT_STRINGS 20
38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char *patternStrings[UPC_LIMIT]={
40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "^translate\\s*(.*)",
41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    "^note\\s*(.*)"
42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru};
43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruremoveText(UChar *source, int32_t srcLen,
46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           UnicodeString patString,uint32_t options,
47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru           UnicodeString replaceText, UErrorCode *status){
48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status == NULL || U_FAILURE(*status)){
50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString src(source, srcLen);
54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RegexMatcher    myMatcher(patString, src, options, *status);
56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(U_FAILURE(*status)){
57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString dest;
60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    dest = myMatcher.replaceAll(replaceText,*status);
63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return dest.extract(source, srcLen, *status);
66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querutrim(UChar *src, int32_t srcLen, UErrorCode *status){
70fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     srcLen = removeText(src, srcLen, UnicodeString("^[ \\r\\n]+ "), 0, UnicodeString(), status); // remove leading new lines
71fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     srcLen = removeText(src, srcLen, UnicodeString("^\\s+"), 0, UnicodeString(), status); // remove leading spaces
72fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius     srcLen = removeText(src, srcLen, UnicodeString("\\s+$"), 0, UnicodeString(), status); // remvoe trailing spcaes
73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru     return srcLen;
74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruremoveCmtText(UChar* source, int32_t srcLen, UErrorCode* status){
78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    srcLen = trim(source, srcLen, status);
79fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString patString("^\\s*?\\*\\s*?");  // remove pattern like " * " at the begining of the line
80fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    srcLen = removeText(source, srcLen, patString, UREGEX_MULTILINE, UnicodeString(), status);
81fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    return removeText(source, srcLen, UnicodeString("[ \\r\\n]+"), 0, UnicodeString(" "), status);// remove new lines;
82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerugetText(const UChar* source, int32_t srcLen,
86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar** dest, int32_t destCapacity,
87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UnicodeString patternString,
88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode* status){
89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status == NULL || U_FAILURE(*status)){
91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString     stringArray[MAX_SPLIT_STRINGS];
95fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RegexPattern      *pattern = RegexPattern::compile(UnicodeString("@"), 0, *status);
96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString src (source,srcLen);
97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    pattern->split(src, stringArray, MAX_SPLIT_STRINGS, *status);
102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    RegexMatcher matcher(patternString, UREGEX_DOTALL, *status);
104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(int32_t i=0; i<MAX_SPLIT_STRINGS; i++){
108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        matcher.reset(stringArray[i]);
109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(matcher.lookingAt(*status)){
110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            UnicodeString out = matcher.group(1, *status);
111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            return out.extract(*dest, destCapacity,*status);
113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return 0;
116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define AT_SIGN  0x0040
120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerugetDescription( const UChar* source, int32_t srcLen,
123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UChar** dest, int32_t destCapacity,
124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UErrorCode* status){
125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status == NULL || U_FAILURE(*status)){
126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString     stringArray[MAX_SPLIT_STRINGS];
130fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RegexPattern      *pattern = RegexPattern::compile(UnicodeString("@"), UREGEX_MULTILINE, *status);
131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString src(source, srcLen);
132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    pattern->split(src, stringArray,MAX_SPLIT_STRINGS , *status);
137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(stringArray[0].indexOf((UChar)AT_SIGN)==-1){
139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t destLen =  stringArray[0].extract(*dest, destCapacity, *status);
140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return trim(*dest, destLen, status);
141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return 0;
143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerugetCount(const UChar* source, int32_t srcLen,
147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru         UParseCommentsOption option, UErrorCode *status){
148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status == NULL || U_FAILURE(*status)){
150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString     stringArray[MAX_SPLIT_STRINGS];
154fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RegexPattern      *pattern = RegexPattern::compile(UnicodeString("@"), UREGEX_MULTILINE, *status);
155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString src (source, srcLen);
156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t retLen = pattern->split(src, stringArray, MAX_SPLIT_STRINGS, *status);
162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
163fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString patternString(patternStrings[option]);
164fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RegexMatcher matcher(patternString, UREGEX_DOTALL, *status);
165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t count = 0;
169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(int32_t i=0; i<retLen; i++){
170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        matcher.reset(stringArray[i]);
171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(matcher.lookingAt(*status)){
172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            count++;
173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(option == UPC_TRANSLATE && count > 1){
176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        fprintf(stderr, "Multiple @translate tags cannot be supported.\n");
177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        exit(U_UNSUPPORTED_ERROR);
178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return count;
180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerugetAt(const UChar* source, int32_t srcLen,
184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar** dest, int32_t destCapacity,
185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        int32_t index,
186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UParseCommentsOption option,
187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode* status){
188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if(status == NULL || U_FAILURE(*status)){
190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString     stringArray[MAX_SPLIT_STRINGS];
194fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RegexPattern      *pattern = RegexPattern::compile(UnicodeString("@"), UREGEX_MULTILINE, *status);
195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    UnicodeString src (source, srcLen);
196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t retLen = pattern->split(src, stringArray, MAX_SPLIT_STRINGS, *status);
202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
203fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString patternString(patternStrings[option]);
204fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    RegexMatcher matcher(patternString, UREGEX_DOTALL, *status);
205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    if (U_FAILURE(*status)) {
206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        return 0;
207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t count = 0;
209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    for(int32_t i=0; i<retLen; i++){
210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        matcher.reset(stringArray[i]);
211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        if(matcher.lookingAt(*status)){
212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            if(count == index){
213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                UnicodeString out = matcher.group(1, *status);
214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru                return out.extract(*dest, destCapacity,*status);
215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            }
216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru            count++;
217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        }
219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    }
220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return 0;
221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerugetTranslate( const UChar* source, int32_t srcLen,
226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              UChar** dest, int32_t destCapacity,
227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru              UErrorCode* status){
228fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString     notePatternString("^translate\\s*?(.*)");
229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t destLen = getText(source, srcLen, dest, destCapacity, notePatternString, status);
231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return trim(*dest, destLen, status);
232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_CFUNC int32_t
235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QuerugetNote(const UChar* source, int32_t srcLen,
236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UChar** dest, int32_t destCapacity,
237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru        UErrorCode* status){
238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
239fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    UnicodeString     notePatternString("^note\\s*?(.*)");
240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    int32_t destLen =  getText(source, srcLen, dest, destCapacity, notePatternString, status);
241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru    return trim(*dest, destLen, status);
242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}
244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif /* UCONFIG_NO_REGULAR_EXPRESSIONS */
246ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru
247