int __cdecl SortSymbolsByNameAndOperatorAndLocation ( const void *arg1, const void *arg2 ) { // BCSYM_NamedRoot *Member1 = *(BCSYM_NamedRoot **)arg1; BCSYM_NamedRoot *Member2 = *(BCSYM_NamedRoot **)arg2; VSASSERT(Member1 && Member2, "How can the symbols to be compared be NULL?"); // First sort by name. int i = SortSymbolsByName(arg1, arg2); // Now sort by operator kind. if (i == 0) { bool Member1IsOperator = IsUserDefinedOperator(Member1); bool Member2IsOperator = IsUserDefinedOperator(Member2); if (Member1IsOperator) { if (Member2IsOperator) { UserDefinedOperators Operator1 = Member1->PUserDefinedOperator()->GetOperator(); UserDefinedOperators Operator2 = Member2->PUserDefinedOperator()->GetOperator(); i = (Operator1 == Operator2) ? 0 : (Operator1 > Operator2) ? 1 : -1; } else { i = 1; } } else if (Member2IsOperator) { i = -1; } } if (i == 0) { i = SortSymbolsByLocation(arg1, arg2); } return i; }
int _cdecl SortEmitableTypesByLocationAndNestingLevels(const void *arg1, const void *arg2) { typedef AllEmitableTypesInFileInOrderIterator::EmitableTypeWrapper EmitableTypeWrapper; EmitableTypeWrapper *TypeWrapper1, *TypeWrapper2; TypeWrapper1 = (EmitableTypeWrapper *)arg1; TypeWrapper2 = (EmitableTypeWrapper *)arg2; if (int NestingLevelCmp = (TypeWrapper1->m_NestingLevel - TypeWrapper2->m_NestingLevel)) { return NestingLevelCmp; } // if types are at the same nested level, then continue sorting by location // return SortSymbolsByLocation(&TypeWrapper1->m_pEmitableType, &TypeWrapper2->m_pEmitableType); }