U_CFUNC int32_t getText(const UChar* source, int32_t srcLen, UChar** dest, int32_t destCapacity, UnicodeString patternString, UErrorCode* status){ if(status == NULL || U_FAILURE(*status)){ return 0; } UnicodeString stringArray[MAX_SPLIT_STRINGS]; RegexPattern *pattern = RegexPattern::compile(UnicodeString("@"), 0, *status); UnicodeString src (source,srcLen); if (U_FAILURE(*status)) { return 0; } pattern->split(src, stringArray, MAX_SPLIT_STRINGS, *status); RegexMatcher matcher(patternString, UREGEX_DOTALL, *status); if (U_FAILURE(*status)) { return 0; } for(int32_t i=0; i<MAX_SPLIT_STRINGS; i++){ matcher.reset(stringArray[i]); if(matcher.lookingAt(*status)){ UnicodeString out = matcher.group(1, *status); return out.extract(*dest, destCapacity,*status); } } return 0; }
U_CFUNC int32_t getCount(const UChar* source, int32_t srcLen, UParseCommentsOption option, UErrorCode *status){ if(status == NULL || U_FAILURE(*status)){ return 0; } UnicodeString stringArray[MAX_SPLIT_STRINGS]; RegexPattern *pattern = RegexPattern::compile("@", UREGEX_MULTILINE, *status); UnicodeString src (source, srcLen); if (U_FAILURE(*status)) { return 0; } int32_t retLen = pattern->split(src, stringArray, MAX_SPLIT_STRINGS, *status); RegexMatcher matcher(patternStrings[option], UREGEX_DOTALL, *status); if (U_FAILURE(*status)) { return 0; } int32_t count = 0; for(int32_t i=0; i<retLen; i++){ matcher.reset(stringArray[i]); if(matcher.lookingAt(*status)){ count++; } } if(option == UPC_TRANSLATE && count > 1){ fprintf(stderr, "Multiple @translate tags cannot be supported.\n"); exit(U_UNSUPPORTED_ERROR); } return count; }
U_CFUNC int32_t getAt(const UChar* source, int32_t srcLen, UChar** dest, int32_t destCapacity, int32_t index, UParseCommentsOption option, UErrorCode* status){ if(status == NULL || U_FAILURE(*status)){ return 0; } UnicodeString stringArray[MAX_SPLIT_STRINGS]; RegexPattern *pattern = RegexPattern::compile(UnicodeString("@"), UREGEX_MULTILINE, *status); UnicodeString src (source, srcLen); if (U_FAILURE(*status)) { return 0; } int32_t retLen = pattern->split(src, stringArray, MAX_SPLIT_STRINGS, *status); UnicodeString patternString(patternStrings[option]); RegexMatcher matcher(patternString, UREGEX_DOTALL, *status); if (U_FAILURE(*status)) { return 0; } int32_t count = 0; for(int32_t i=0; i<retLen; i++){ matcher.reset(stringArray[i]); if(matcher.lookingAt(*status)){ if(count == index){ UnicodeString out = matcher.group(1, *status); return out.extract(*dest, destCapacity,*status); } count++; } } return 0; }
U_CFUNC int32_t getDescription( const UChar* source, int32_t srcLen, UChar** dest, int32_t destCapacity, UErrorCode* status){ if(status == NULL || U_FAILURE(*status)){ return 0; } UnicodeString stringArray[MAX_SPLIT_STRINGS]; RegexPattern *pattern = RegexPattern::compile(UnicodeString("@"), UREGEX_MULTILINE, *status); UnicodeString src(source, srcLen); if (U_FAILURE(*status)) { return 0; } pattern->split(src, stringArray,MAX_SPLIT_STRINGS , *status); if(stringArray[0].indexOf((UChar)AT_SIGN)==-1){ int32_t destLen = stringArray[0].extract(*dest, destCapacity, *status); return trim(*dest, destLen, status); } return 0; }