sort order

Richard Durbin rd at sanger.ac.uk
Thu Jul 15 06:41:16 EST 1999


At the risk of revealing what some of the ancient innards of acedb
code look like, here is the C code for lexstrcmp() which provides the
acedb sort ordering.  This is case insensitive - there is also
equivalent case sensitive code for when that is needed.

Richard

PS I also find this newsgroup useful despite the SPAM.

/* Correctly sorts anything containing integers */

int lexstrcmp(char *a,char *b)
{ register char c,d,*p,*q ;
  register int  nbza, nbzb ; /* nb de zeros en tete */
  register int  nbzReturn = 0 ;

  while (*a)
    {                /* Bond007 < Bond07 < Bond7 < Bond68 */
      if (isdigit((int)*a) && isdigit((int)*b))
        { for (nbza = 0 ; *a == '0' ; ++a, nbza++) ;  /* saut des premiers zeros
*/
          for (nbzb = 0 ; *b == '0' ; ++b, nbzb++) ;
          for (p = a ; isdigit((int)*p) ; ++p) ;
          for (q = b ; isdigit((int)*q) ; ++q) ;
          if (p-a > q-b) return 1 ;  /* the longer number is the bigger */
          if (p-a < q-b) return -1 ;
          while (isdigit ((int)*a))
            { if (*a > *b) return 1 ;
              if (*a++ < *b++) return -1 ;
            }
          if (!nbzReturn)
            { if (nbza < nbzb) nbzReturn = +1 ;
              if (nbza > nbzb) nbzReturn = -1 ;
            }
        }
      else
        { if ((c=freeupper(*a++)) > (d=freeupper(*b++))) return 1 ;
          if (c < d) return -1 ;
        }
    }

  if (!*b) 
    return nbzReturn ;

  return -1 ;
}
---




More information about the Acedb mailing list