home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume18 / geneal / part01 / datesort.c < prev    next >
C/C++ Source or Header  |  1989-03-08  |  2KB  |  95 lines

  1. /* datesort.c - routines dealing with sorting of dates
  2.  *
  3.  *  4.Jan.1988  jimmc  Initial definition
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "xalloc.h"
  8. #include "geneal.h"
  9.  
  10. typedef struct _dsortinfo {
  11.     char *sdate;
  12.     int idate;
  13.     char *pstr;
  14. } Dsortinfo;
  15.  
  16. Dsortinfo *dsortinf;
  17. int dsortalloc;
  18. int dsortcount;
  19.  
  20. dsortinit()    /* init the sorting routine */
  21. {
  22.     Dsortinfo *p;
  23.     int i;
  24.  
  25.     for (i=0; i<dsortcount; i++) {
  26.         p = dsortinf + i;
  27.         freestr(p->sdate);
  28.     }
  29.     dsortcount = 0;
  30. }
  31.  
  32. dsortadd(sdate,pstr)
  33. char *sdate;        /* the date to be sorted, in short format */
  34. char *pstr;        /* the extra pointer to keep with the date */
  35. {
  36.     Dsortinfo *p;
  37.  
  38.     if (dsortcount>=dsortalloc) {    /* need more space */
  39.         if (dsortalloc) dsortalloc *= 2;
  40.         else dsortalloc = 15;
  41.         if (dsortinf)
  42.             dsortinf = XREALLOC(Dsortinfo,dsortinf,dsortalloc);
  43.         else
  44.             dsortinf = XALLOC(Dsortinfo,dsortalloc);
  45.     }
  46.     p = dsortinf+dsortcount;
  47.     p->sdate = sdate;
  48.     p->idate = sdatetoint(sdate);
  49.     p->pstr = pstr;
  50.     dsortcount++;
  51. }
  52.  
  53. dsortadds(sdate,pstr)
  54. char *sdate;
  55. char *pstr;
  56. {
  57.     dsortadd(strsav(sdate),strsav(pstr));
  58. }
  59.  
  60. int
  61. dsortsort(a,b)
  62. Dsortinfo *a, *b;
  63. {
  64.     if (Gflag['y'])        /* include year in date sorts */
  65.         return a->idate - b->idate;
  66.     else
  67.         return (a->idate%10000) - (b->idate%10000);
  68. }
  69.  
  70. int            /* returns 0 if no errors, else value of funcp() */
  71. dsortenum(funcp)    /* enumerate the sorted list */
  72. int (*funcp)();        /* function to call for each item */
  73.         /* the function is called as funcp(sdate,pstr,idate) */
  74.         /* if the function returns non-zero, the enumeration stops */
  75. {
  76.     Dsortinfo *p;
  77.     int i,t;
  78.  
  79.     if (dsortcount<=0) return 0;
  80.     qsort((char *)dsortinf,dsortcount,sizeof(Dsortinfo),dsortsort);
  81.     for (i=0; i<dsortcount; i++) {
  82.         p = dsortinf+i;
  83.         t = (*funcp)(p->sdate,p->pstr,p->idate);
  84.         if (t) break;
  85.     }
  86.     for (i=0; i<dsortcount; i++) {
  87.         p = dsortinf+i;
  88.         freestr(p->sdate);
  89.     }
  90.     dsortcount = 0;
  91.     return t;
  92. }
  93.  
  94. /* end */
  95.