home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume4 / rolodex / part2 / rlist.c < prev    next >
Encoding:
C/C++ Source or Header  |  1986-11-30  |  2.4 KB  |  119 lines

  1. #include "datadef.h"
  2.  
  3.  
  4. int rlength (rlist) Ptr_Rolo_List rlist;
  5. {
  6.   return((rlist == 0) ? 0 : 1 + rlength(get_next_link(rlist)));
  7. }  
  8.   
  9.  
  10. Ptr_Rolo_List new_link_with_entry ()
  11. {
  12.   Ptr_Rolo_List newlink;        
  13.   Ptr_Rolo_Entry newentry;
  14.   newlink = (Ptr_Rolo_List) rolo_emalloc(sizeof(Rolo_List));
  15.   unset_matched(newlink);
  16.   newentry = (Ptr_Rolo_Entry) rolo_emalloc(sizeof(Rolo_Entry));
  17.   set_n_others(newentry,0);        
  18.   newentry -> other_fields = 0;
  19.   set_entry(newlink,newentry);
  20.   return(newlink);
  21. }
  22.  
  23.  
  24. rolo_insert (link,compare) Ptr_Rolo_List link; int (*compare)();
  25.  
  26. {
  27.   Ptr_Rolo_List rptr;        
  28.         
  29.   if (Begin_Rlist == 0) {
  30.      Begin_Rlist = link;
  31.      End_Rlist = link;
  32.      set_prev_link(link,0);
  33.      set_next_link(link,0);
  34.      return;
  35.   }
  36.   
  37.   /* find the element it goes before, alphabetically, and insert it */
  38.  
  39.   rptr = Begin_Rlist;
  40.   while (rptr != 0) {
  41.     if (1 == (*compare)(rptr,link)) {
  42.        set_prev_link(link,get_prev_link(rptr));
  43.        set_next_link(link,rptr);
  44.        if (get_prev_link(rptr) != 0) 
  45.           set_next_link(get_prev_link(rptr),link);
  46.        else
  47.           Begin_Rlist = link;
  48.        set_prev_link(rptr,link);
  49.        return;
  50.     }
  51.     rptr = get_next_link(rptr);
  52.   }
  53.  
  54.   /* it goes at the end */
  55.   
  56.   set_next_link(End_Rlist,link);
  57.   set_prev_link(link,End_Rlist);
  58.   set_next_link(link,0);
  59.   End_Rlist = link;
  60.   return;
  61.  
  62. }
  63.  
  64.  
  65. rolo_delete (link) Ptr_Rolo_List link;
  66.  
  67. {
  68.   if (get_next_link(link) == 0 && get_prev_link(link) == 0) {
  69.      Begin_Rlist = 0;
  70.      End_Rlist = 0;
  71.      return;
  72.   }
  73.  
  74.   if (get_prev_link(link) == 0) {
  75.      Begin_Rlist = get_next_link(link);
  76.      set_prev_link(Begin_Rlist,0);
  77.      return;
  78.   }
  79.  
  80.   if (get_next_link(link) == 0) {
  81.      End_Rlist = get_prev_link(link);
  82.      set_next_link(End_Rlist,0);
  83.      return;
  84.   }
  85.  
  86.   set_next_link(get_prev_link(link),get_next_link(link));
  87.   set_prev_link(get_next_link(link),get_prev_link(link));
  88.   return;
  89.  
  90. }
  91.  
  92.  
  93. compare_links (l1,l2) Ptr_Rolo_List l1,l2;
  94.  
  95. {
  96.   Ptr_Rolo_Entry e1,e2;        
  97.   char *n1,*n2;
  98.   e1 = get_entry(l1);        
  99.   e2 = get_entry(l2);        
  100.   n1 = get_basic_rolo_field((int) R_NAME,e1);
  101.   n2 = get_basic_rolo_field((int) R_NAME,e2);
  102.   return(nocase_compare(n1,strlen(n1),n2,strlen(n2)));
  103. }  
  104.   
  105.  
  106. rolo_reorder ()
  107. {
  108.   Ptr_Rolo_List rptr,oldlink;
  109.   rptr = Begin_Rlist;
  110.   Begin_Rlist = 0;
  111.   while (rptr != 0) {
  112.     oldlink = get_next_link(rptr);
  113.     rolo_insert(rptr,compare_links);
  114.     rptr = oldlink;
  115.   }
  116. }
  117.  
  118.  
  119.