home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume4 / rolodex / part2 / update.c < prev   
C/C++ Source or Header  |  1986-11-30  |  6KB  |  235 lines

  1. #include <stdio.h>
  2. #include <ctype.h>
  3.  
  4. #include "sys5.h"
  5.  
  6. #ifdef TMC
  7. #include <ctools.h>
  8. #else
  9. #include "ctools.h"
  10. #endif
  11. #include "args.h"
  12. #include "menu.h"
  13. #include "mem.h"
  14.  
  15. #include "rolofiles.h"
  16. #include "rolodefs.h"
  17. #include "datadef.h"
  18. #include "choices.h"
  19.  
  20.  
  21. char *get_new_value () 
  22. {
  23.   char buffer[200];
  24.   int rval;
  25.   switch (rval = getline(stdin,buffer,199)) {
  26.     case AT_EOF :
  27.       user_eof();
  28.       break;
  29.     case TOO_MANY_CHARS :
  30.       fprintf(stderr,"Line too long, truncated...\n");
  31.       sleep(1);
  32.       break;
  33.     default :
  34.       if ('\\' == *buffer && rval == 1) return(0);
  35.       break;
  36.   }
  37.   return(copystr(buffer));
  38. }  
  39.   
  40.  
  41. Ptr_Rolo_Entry copy_entry (entry) Ptr_Rolo_Entry entry;
  42. {
  43.   Ptr_Rolo_Entry new_entry;        
  44.   int j,n;        
  45.   char **otherfields;
  46.   
  47.   new_entry = (Ptr_Rolo_Entry) rolo_emalloc(sizeof(Rolo_Entry));
  48.   
  49.   /* copy the basic fields, but get a new timestamp */
  50.   
  51.   for (j = 0; j < N_BASIC_FIELDS - 1; j++) {
  52.       set_basic_rolo_field(j,new_entry,copystr(get_basic_rolo_field(j,entry)));
  53.   }
  54.   set_basic_rolo_field(N_BASIC_FIELDS - 1,new_entry,timestring());
  55.   
  56.   /* copy the user-defined fields, if necessary */
  57.   
  58.   set_n_others(new_entry,n = get_n_others(entry));
  59.   if (n > 0) {
  60.      otherfields = (char **) rolo_emalloc(n * sizeof(char *));
  61.      new_entry -> other_fields = otherfields;
  62.      for (j = 0; j < n; j++) {  
  63.          set_other_field(j,new_entry,copystr(get_other_field(j,entry)));
  64.      }
  65.   }     
  66.   else new_entry -> other_fields = 0;     
  67.      
  68.   return(new_entry);     
  69.      
  70. }
  71.  
  72.  
  73. rolo_update_mode (rlink) Ptr_Rolo_List rlink;
  74.  
  75. /* Update the fields of an entry.  The user is not allowed to modify the */
  76. /* timestamp field. */
  77.  
  78. {
  79.   int rval,menuval,findex,updated,newlen,n,nfields,j,name_changed;
  80.   char *response,*s,*newfield,*newval,*other, **others;
  81.   Ptr_Rolo_Entry entry,old_entry;
  82.         
  83.   cancel_update :
  84.   
  85.   entry = copy_entry(old_entry = get_entry(rlink));
  86.  
  87.   updated = 0;
  88.   name_changed = 0;
  89.   
  90.   redisplay :
  91.   
  92.   display_entry_for_update(updated ? entry : old_entry);
  93.   nfields = (N_BASIC_FIELDS - 1) + get_n_others(entry);
  94.   
  95.   reask :  
  96.   
  97.   cathelpfile(libdir("updatemenu"),0,0);  
  98.   
  99.   rval = menu_match (
  100.        &menuval,&response,
  101.        ": ",
  102.        0,1,0,1,4,
  103.        "\\",U_ABORT,
  104.        "?",U_HELP,
  105.        "Help",U_HELP,
  106.        "",U_END_UPDATE
  107.     );
  108.     
  109.   switch (rval) {    
  110.     
  111.     case MENU_MATCH :
  112.   
  113.       switch (menuval) {
  114.  
  115.         case U_HELP :
  116.           cathelpfile(libdir("updatehelp"),"updating",1);
  117.           any_char_to_continue();
  118.           clear_the_screen();
  119.           goto redisplay;
  120.  
  121.         case U_ABORT :
  122.           if (updated) {
  123.              printf("Previous updates to fields in this entry ignored\n");
  124.           }
  125.           return;
  126.           break;
  127.  
  128.         case U_END_UPDATE :
  129.           if (!updated) goto reask;
  130.           display_entry(entry);
  131.           if (MENU_YES == rolo_menu_yes_no (
  132.                    "Confirm Update? ",DEFAULT_YES,1,
  133.                    "confirmhelp","confirming update"
  134.                 )) {
  135.              printf("Update confirmed\n");
  136.              sleep(1);
  137.              set_entry(rlink,entry);
  138.              if (name_changed) {
  139.                 rolo_delete(rlink);
  140.                 rolo_insert(rlink,compare_links);
  141.              }
  142.              changed = 1;
  143.              return;
  144.           }
  145.           else {   
  146.              printf("Updates ignored...\n");
  147.              sleep(1);
  148.              updated = 0;
  149.              goto cancel_update;
  150.           }
  151.          break;
  152.        
  153.       }
  154.       break;
  155.      
  156.     case MENU_NO_MATCH : 
  157.  
  158.       /* check that the response is an integer within range */
  159.  
  160.       findex = str_to_pos_int(response,1,nfields+1);
  161.       if (findex < 0) {
  162.          printf("Not a valid number...Please try again\n");
  163.          goto reask;
  164.       }
  165.       findex--;
  166.  
  167.       /* we can either be updating a standard field or a user-defined field */
  168.       /* or adding a new field */
  169.  
  170.       if (findex < N_BASIC_FIELDS - 1) {
  171.          name_changed = (findex == 0);
  172.          printf("Updating '%s'\n",Field_Names[findex]);
  173.          printf("Old value: %s\n",get_basic_rolo_field(findex,entry));
  174.          printf("New value: ");
  175.          if (0 == (newval = copystr(get_new_value()))) break;
  176.          set_basic_rolo_field(findex,entry,newval);
  177.          updated = 1;
  178.       }
  179.       else if (findex != nfields) {
  180.          findex -= N_BASIC_FIELDS - 1;
  181.          printf("Updating \'");
  182.          s = other = get_other_field(findex,entry);
  183.          while (*s != ':') putc(*s++,stdout);
  184.          printf("\' field\n");
  185.          printf("Old value: %s\n",++s);
  186.          printf("New value: ");
  187.          if (0 == (newval = copystr(get_new_value()))) break;
  188.          if (strlen(newval) == 0) {
  189.             for (j = findex; j < get_n_others(entry); j++) {
  190.                 set_other_field(j,entry,get_other_field(j+1,entry));
  191.             }
  192.             set_n_others(entry,get_n_others(entry) - 1);
  193.          }
  194.          else {   
  195.             *s = '\0';
  196.             newlen = strlen(other) + strlen(newval) + 2;
  197.             newfield = rolo_emalloc(newlen);
  198.             nbuffconcat(newfield,3,other," ",newval);
  199.             set_other_field(findex,entry,newfield);
  200.          }
  201.          updated = 1;
  202.       }
  203.       else {
  204.         loop:
  205.         printf("New field (<name>: <value>): ");
  206.         if (0 == (newfield = copystr(get_new_value()))) break;
  207.         if (0 == index(newfield,':')) {
  208.            fprintf(stderr,"No field name.  Use a ':'...\n");
  209.            goto loop;
  210.         }
  211.         n = get_n_others(entry);
  212.         set_n_others(entry,n + 1);
  213.         others = (char **) rolo_emalloc((n + 1) * sizeof(char *));
  214.         for (j = 0; j < n; j++) others[j] = get_other_field(j,entry);
  215.         others[n] = newfield;
  216.         entry -> other_fields = others;
  217.         updated = 1;
  218.       }
  219.       break;
  220.  
  221.     case MENU_EOF :
  222.       user_eof();
  223.       break;
  224.       
  225.     default :      
  226.       fprintf(stderr,"Impossible return from update menu_match\n");
  227.       save_and_exit(-1);
  228.       break;
  229.      
  230.   }
  231.  
  232.   goto redisplay;
  233.  
  234. }
  235.