U_CFUNC void U_CALLCONV derivedPropsLineFn(void *context, char *fields[][2], int32_t /* fieldCount */, UErrorCode *pErrorCode) { UnicodeTest *me=(UnicodeTest *)context; uint32_t start, end; int32_t i; u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode); if(U_FAILURE(*pErrorCode)) { me->errln("UnicodeTest: syntax error in DerivedCoreProperties.txt or DerivedNormalizationProps.txt field 0 at %s\n", fields[0][0]); return; } /* parse derived binary property name, ignore unknown names */ i=getTokenIndex(derivedPropsNames, LENGTHOF(derivedPropsNames), fields[1][0]); if(i<0) { UnicodeString propName(fields[1][0], (int32_t)(fields[1][1]-fields[1][0])); propName.trim(); if(me->unknownPropertyNames->find(propName)==NULL) { UErrorCode errorCode=U_ZERO_ERROR; me->unknownPropertyNames->puti(propName, 1, errorCode); me->errln("UnicodeTest warning: unknown property name '%s' in DerivedCoreProperties.txt or DerivedNormalizationProps.txt\n", fields[1][0]); } return; } me->derivedProps[i].add(start, end); }
SourceRangeContainer FollowSymbol::followSymbol(CXTranslationUnit tu, const Cursor &fullCursor, uint line, uint column) { std::unique_ptr<Tokens> tokens(new Tokens(fullCursor)); if (!tokens->tokenCount) tokens.reset(new Tokens(tu)); if (!tokens->tokenCount) return SourceRangeContainer(); QVector<CXCursor> cursors(static_cast<int>(tokens->tokenCount)); clang_annotateTokens(tu, tokens->data, tokens->tokenCount, cursors.data()); int tokenIndex = getTokenIndex(tu, *tokens, line, column); QTC_ASSERT(tokenIndex >= 0, return SourceRangeContainer()); const Utf8String tokenSpelling = ClangString( clang_getTokenSpelling(tu, tokens->data[tokenIndex])); if (tokenSpelling.isEmpty()) return SourceRangeContainer(); Cursor cursor{cursors[tokenIndex]}; if (cursor.kind() == CXCursor_InclusionDirective) { CXFile file = clang_getIncludedFile(cursors[tokenIndex]); const ClangString filename(clang_getFileName(file)); const SourceLocation loc(tu, filename, 1, 1); return SourceRange(loc, loc); } // For definitions we can always find a declaration in current TU if (cursor.isDefinition()) return extractMatchingTokenRange(cursor.canonical(), tokenSpelling); if (!cursor.isDeclaration()) { // This is the symbol usage // We want to return definition cursor = cursor.referenced(); if (cursor.isNull() || !cursor.isDefinition()) { // We can't find definition in this TU return SourceRangeContainer(); } return extractMatchingTokenRange(cursor, tokenSpelling); } cursor = cursor.definition(); // If we are able to find a definition in current TU if (!cursor.isNull()) return extractMatchingTokenRange(cursor, tokenSpelling); return SourceRangeContainer(); }
std::wstring CommonToken::toString() { std::wstring channelStr = L""; if (channel > 0) { channelStr = std::wstring(L",channel=") + std::to_wstring(channel); } std::wstring txt = getText(); if (txt != L"") { replaceAll(txt, L"\n",L"\\n"); replaceAll(txt, L"\r",L"\\r"); replaceAll(txt, L"\t",L"\\t"); } else { txt = L"<no text>"; } return std::wstring(L"[@") + std::to_wstring(getTokenIndex()) + std::wstring(L",") + std::to_wstring(start) + std::wstring(L":") + std::to_wstring(stop) + std::wstring(L"='") + txt + std::wstring(L"',<") + std::to_wstring(type) + std::wstring(L">") + channelStr + std::wstring(L",") + std::to_wstring(line) + std::wstring(L":") + std::to_wstring(getCharPositionInLine()) + std::wstring(L"]"); }
U_CFUNC void U_CALLCONV derivedCorePropsLineFn(void *context, char *fields[][2], int32_t /* fieldCount */, UErrorCode *pErrorCode) { UnicodeTest *me=(UnicodeTest *)context; uint32_t start, end; int32_t i; u_parseCodePointRange(fields[0][0], &start, &end, pErrorCode); if(U_FAILURE(*pErrorCode)) { me->errln("UnicodeTest: syntax error in DerivedCoreProperties.txt field 0 at %s\n", fields[0][0]); return; } /* parse derived binary property name, ignore unknown names */ i=getTokenIndex(derivedCorePropsNames, LENGTHOF(derivedCorePropsNames), fields[1][0]); if(i<0) { me->errln("UnicodeTest warning: unknown property name '%s' in \n", fields[1][0]); return; } me->derivedCoreProps[i].add(start, end); }
static void U_CALLCONV unicodeDataLineFn(void *context, char *fields[][2], int32_t fieldCount, UErrorCode *pErrorCode) { Props p; char *end; static UChar32 prevCode=0; UChar32 value; int32_t i; /* reset the properties */ uprv_memset(&p, 0, sizeof(Props)); /* get the character code, field 0 */ p.code=(UChar32)uprv_strtoul(fields[0][0], &end, 16); if(end<=fields[0][0] || end!=fields[0][1]) { fprintf(stderr, "gencase: syntax error in field 0 at %s\n", fields[0][0]); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } /* get general category, field 2 */ i=getTokenIndex(genCategoryNames, U_CHAR_CATEGORY_COUNT, fields[2][0]); if(i>=0) { p.gc=(uint8_t)i; } else { fprintf(stderr, "gencase: unknown general category \"%s\" at code 0x%lx\n", fields[2][0], (unsigned long)p.code); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } /* get canonical combining class, field 3 */ value=(UChar32)uprv_strtoul(fields[3][0], &end, 10); if(end<=fields[3][0] || end!=fields[3][1] || value>0xff) { fprintf(stderr, "gencase: syntax error in field 3 at %s\n", fields[0][0]); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } p.cc=(uint8_t)value; /* get uppercase mapping, field 12 */ value=(UChar32)uprv_strtoul(fields[12][0], &end, 16); if(end!=fields[12][1]) { fprintf(stderr, "gencase: syntax error in field 12 at code 0x%lx\n", (unsigned long)p.code); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } if(value!=0 && value!=p.code) { p.upperCase=value; uset_add(caseSensitive, p.code); uset_add(caseSensitive, value); } /* get lowercase value, field 13 */ value=(UChar32)uprv_strtoul(fields[13][0], &end, 16); if(end!=fields[13][1]) { fprintf(stderr, "gencase: syntax error in field 13 at code 0x%lx\n", (unsigned long)p.code); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } if(value!=0 && value!=p.code) { p.lowerCase=value; uset_add(caseSensitive, p.code); uset_add(caseSensitive, value); } /* get titlecase value, field 14 */ value=(UChar32)uprv_strtoul(fields[14][0], &end, 16); if(end!=fields[14][1]) { fprintf(stderr, "gencase: syntax error in field 14 at code 0x%lx\n", (unsigned long)p.code); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } if(value!=0 && value!=p.code) { p.titleCase=value; uset_add(caseSensitive, p.code); uset_add(caseSensitive, value); } /* set additional properties from previously parsed files */ if(specialCasingIndex<specialCasingCount && p.code==specialCasings[specialCasingIndex].code) { p.specialCasing=specialCasings+specialCasingIndex++; } else { p.specialCasing=NULL; } if(caseFoldingIndex<caseFoldingCount && p.code==caseFoldings[caseFoldingIndex].code) { p.caseFolding=caseFoldings+caseFoldingIndex++; /* ignore "Common" mappings (simple==full) that map to the same code point as the regular lowercase mapping */ if( p.caseFolding->status=='C' && p.caseFolding->simple==p.lowerCase ) { p.caseFolding=NULL; } } else { p.caseFolding=NULL; } /* check for non-character code points */ if((p.code&0xfffe)==0xfffe || (uint32_t)(p.code-0xfdd0)<0x20) { fprintf(stderr, "gencase: error - properties for non-character code point U+%04lx\n", (unsigned long)p.code); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } /* check that the code points (p.code) are in ascending order */ if(p.code<=prevCode && p.code>0) { fprintf(stderr, "gencase: error - UnicodeData entries out of order, U+%04lx after U+%04lx\n", (unsigned long)p.code, (unsigned long)prevCode); *pErrorCode=U_PARSE_ERROR; exit(U_PARSE_ERROR); } /* properties for a single code point */ setProps(&p); prevCode=p.code; }