home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / misc / volume1 / 8712 / mkmf / 2 / src / slsort.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-07-13  |  1.7 KB  |  68 lines

  1. /* $Header: slsort.c,v 1.2 85/03/18 13:19:42 nicklin Exp $ */
  2.  
  3. /*
  4.  * Author: Peter J. Nicklin
  5.  */
  6.  
  7. /*
  8.  * slsort() sorts list slist according to comparison function compar().
  9.  * compar() is to be called with two arguments and must return an integer
  10.  * greater than, equal to, or less than 0, depending on the lexicographic
  11.  * relationship between the two arguments. Returns integer YES if
  12.  * successful, otherwise NO if out of memory.
  13.  */
  14. #include <stdio.h>
  15. #include "null.h"
  16. #include "slist.h"
  17. #include "yesno.h"
  18.  
  19. extern char *PGN;            /* program name */
  20.  
  21. static int (*sscmp)();            /* string compare function */
  22.  
  23. slsort(compar, slist)
  24.     int (*compar)();        /* compare two strings */
  25.     SLIST *slist;            /* pointer to list head block */
  26. {
  27.     char **kp;            /* pointer to key pointer array */
  28.     char *malloc();            /* memory allocator */
  29.     char **skp;            /* ptr to start of key ptr array */
  30.     int comparb();            /* compare 2 list blocks */
  31.     SLBLK *curblk;            /* current list block */
  32.  
  33.     if (slist->nk <= 0)
  34.         return(YES);
  35.     else if ((skp = (char **) malloc((unsigned)slist->nk*sizeof(char *))) == NULL)
  36.         {
  37.         if (*PGN != '\0')
  38.             fprintf(stderr, "%s: ", PGN);
  39.         fprintf(stderr, "out of memory\n");
  40.         return(NO);
  41.         }
  42.     for (kp = skp, curblk = slist->head; curblk != NULL; kp++, curblk = curblk->next)
  43.         *kp = curblk->key;
  44.  
  45.     sscmp = compar;
  46.     qsort((char *) skp, slist->nk, sizeof(char *), comparb);
  47.  
  48.     for (kp = skp, curblk = slist->head; curblk != NULL; kp++, curblk = curblk->next)
  49.         curblk->key = *kp;
  50.     
  51.     free((char *) skp);
  52.     return(YES);
  53. }
  54.  
  55.  
  56.  
  57. /*
  58.  * comparb() compares key strings in 2 list blocks. Returns whatever
  59.  * sscmp() returns. sscmp() is a string compare function.
  60.  */
  61. static int
  62. comparb(s1, s2)
  63.     char **s1;            /* string pointer */
  64.     char **s2;            /* string pointer */
  65. {
  66.     return(sscmp(*s1, *s2));
  67. }
  68.