home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume13 / rolodex / part02 / rlist.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-01-30  |  2.5 KB  |  125 lines

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