+
+
+ /* Both have spam attrs. */
+
+ /* preliminary numeric examination */
+ result = (strtoul ((*ppa)->env->spam->data, &aptr, 10) -
+ strtoul ((*ppb)->env->spam->data, &bptr, 10));
+
+ /* If either aptr or bptr is equal to data, there is no numeric */
+ /* value for that spam attribute. In this case, compare lexically. */
+ if ((aptr == (*ppa)->env->spam->data) || (bptr == (*ppb)->env->spam->data))
+ return SORTCODE (m_strcmp(aptr, bptr));
+
+ /* Otherwise, we have numeric value for both attrs. If these values */
+ /* are equal, then we first fall back upon string comparison, then */
+ /* upon auxiliary sort. */
+ if (result == 0) {
+ result = m_strcmp(aptr, bptr);
+ if (result == 0)
+ AUXSORT (result, a, b);
+ }
+
+ return SORTCODE (result);