int CompareLinCtStereoCarb ( AT_STEREO_CARB *LinearCTStereoCarb1, int nLenLinearCTStereoCarb1, AT_STEREO_CARB *LinearCTStereoCarb2, int nLenLinearCTStereoCarb2 ) { int i, num, ret = 0; /* compare stereocenters */ if ( LinearCTStereoCarb1 && LinearCTStereoCarb2 ) { num = inchi_min(nLenLinearCTStereoCarb1, nLenLinearCTStereoCarb2); for ( i = 0; i < num; i ++ ) { if ( ret = (int)LinearCTStereoCarb1[i].at_num - (int)LinearCTStereoCarb2[i].at_num ) break; if ( ret = (int)LinearCTStereoCarb1[i].parity - (int)LinearCTStereoCarb2[i].parity ) break; } if ( !ret ) { ret = nLenLinearCTStereoCarb1 - nLenLinearCTStereoCarb2; } } else if ( LinearCTStereoCarb1 && nLenLinearCTStereoCarb1 > 0 ) { ret = 1; } else if ( LinearCTStereoCarb2 && nLenLinearCTStereoCarb2 > 0 ) { ret = -1; } return ret; }
int CompareLinCtStereoDble ( AT_STEREO_DBLE *LinearCTStereoDble1, int nLenLinearCTStereoDble1, AT_STEREO_DBLE *LinearCTStereoDble2, int nLenLinearCTStereoDble2 ) { int i, num, ret = 0; /* compare double bonds */ if ( LinearCTStereoDble1 && LinearCTStereoDble2 ) { num = inchi_min(nLenLinearCTStereoDble1, nLenLinearCTStereoDble2); for ( i = 0; i < num; i ++ ) { if ( ret = (int)LinearCTStereoDble1[i].at_num1 - (int)LinearCTStereoDble2[i].at_num1 ) break; if ( ret = (int)LinearCTStereoDble1[i].at_num2 - (int)LinearCTStereoDble2[i].at_num2 ) break; if ( ret = (int)LinearCTStereoDble1[i].parity - (int)LinearCTStereoDble2[i].parity ) break; } if ( !ret ) { ret = nLenLinearCTStereoDble1 - nLenLinearCTStereoDble2; } } else if ( LinearCTStereoDble1 && nLenLinearCTStereoDble1 > 0 ) { ret = 1; } else if ( LinearCTStereoDble2 && nLenLinearCTStereoDble2 > 0 ) { ret = -1; } return ret; }
/* lexicographic compare */ int CompareNeighListLex( NEIGH_LIST pp1, NEIGH_LIST pp2, const AT_RANK *nRank) { int len1 = (int)*pp1++; int len2 = (int)*pp2++; int len = inchi_min( len1, len2 ); int diff = 0; while ( len -- > 0 && !( diff = (int)nRank[*pp1++] - (int)nRank[*pp2++] ) ) ; return diff? diff : (len1 - len2); }
/* lexicographic compare */ int CompareNeighListLexUpToMaxRank( NEIGH_LIST pp1, NEIGH_LIST pp2, const AT_RANK *nRank, AT_RANK nMaxAtNeighRank ) { int len1 = (int)*pp1++; int len2 = (int)*pp2++; int diff = 0; int len; while( 0 < len1 && nRank[pp1[len1-1]] > nMaxAtNeighRank ) { len1 --; } while( 0 < len2 && nRank[pp2[len2-1]] > nMaxAtNeighRank ) { len2 --; } len = inchi_min( len1, len2 ); while ( len -- > 0 && !( diff = (int)nRank[*pp1++] - (int)nRank[*pp2++] ) ) ; return diff? diff : (len1 - len2); }