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

  1. /* operatns.c */
  2. #include <stdio.h>
  3. #include <ctype.h>
  4.  
  5. #ifdef TMC
  6. #include <ctools.h>
  7. #else
  8. #include "ctools.h"
  9. #endif
  10. #include "args.h"
  11. #include "menu.h"
  12. #include "mem.h"
  13.  
  14. #include "rolofilz.h"
  15. #include "rolodefs.h"
  16. #include "datadef.h"
  17. #include "choices.h"
  18.  
  19. #define index strchr 
  20. char *index();
  21.  
  22. extern char *ctime();
  23.  
  24. Ptr_Rolo_List create_entry (basicdata,otherdata) char **basicdata, **otherdata;
  25. {
  26.   Ptr_Rolo_List newlink;        
  27.   Ptr_Rolo_Entry newentry;
  28.   int i,j;
  29.   newlink = new_link_with_entry();        
  30.   newentry = get_entry(newlink);
  31.   for (j = 0; j < N_BASIC_FIELDS; j++) {
  32.       set_basic_rolo_field(j,newentry,basicdata[j]);
  33.   }
  34.   j = 0;
  35.   while (otherdata[j] != 0) j++;
  36.   set_n_others(newentry,j);
  37.   if (j > 0) {
  38.      newentry -> other_fields = (char **) rolo_emalloc(j*sizeof(char *));
  39.      for (i = 0; i < j; i++) {
  40.          set_other_field(i,newentry,otherdata[i]);
  41.      }
  42.   }
  43.   else newentry -> other_fields = 0;
  44.   return(newlink);
  45. }  
  46.   
  47.  
  48. other_fields () 
  49. {
  50.   int rval;
  51.   rval = rolo_menu_yes_no (
  52.              "Additional fields? ",DEFAULT_NO,1,
  53.              MOREFIELDSHELP, "additional fields"
  54.           );
  55.   return(rval == MENU_YES);
  56. }
  57.  
  58.  
  59. add_the_entry ()
  60. {
  61.   return(MENU_YES == rolo_menu_yes_no (
  62.               "Add new entry to rolodex? ",DEFAULT_YES,1,
  63.               NEWADDHELP, "adding newly entered entry"
  64.            ));
  65. }
  66.  
  67.  
  68. rolo_add () 
  69.  
  70. {
  71.   int i,j,k,rval,menuval;
  72.   char *response;
  73.   char *basicdata[N_BASIC_FIELDS], *otherdata[100];
  74.   Ptr_Rolo_List rlink;
  75.  
  76.   if(read_only)
  77.   {
  78.     printf("Readonly mode: cannot add entries.\n");
  79.     sleep(2);
  80.     return(1);
  81.   }
  82.         
  83.   for (j = 0; j < 100; j++) otherdata[j] = (char *)NULL;
  84.   for (j = 0; j < N_BASIC_FIELDS; j++) basicdata[j] = (char *)NULL;
  85.   cathelpfile(ADDINFO,(char *)NULL,1);
  86.   
  87.   /* 'k' and 'kludge' are are kludge to allow us to back up from entering */
  88.   /* user defined fields to go an correct wrong basic field information. */
  89.   
  90.   k = 0;
  91.   
  92.   kludge :
  93.   
  94.   for (j = k; j < N_BASIC_FIELDS - 1; j++) {
  95.         
  96.       redo :
  97.         
  98.       rval = menu_match (
  99.            &menuval,&response,
  100.            Field_Names[j],
  101.            0,0,0,1,5,
  102.            "\\",A_ABORT_ADD,
  103.            "^",A_BACKUP,
  104.            "!",A_FILL_IN_REST,
  105.            "?",A_HELP,
  106.            "",A_NO_DATA
  107.         );
  108.         
  109.       switch (rval) {
  110.         
  111.         case MENU_NO_MATCH :
  112.           basicdata[j] = copystr(response);
  113.           if (j == 0 && strlen(basicdata[j]) == 0) {
  114.              printf("Each entry must have a name!\n\n");
  115.          sleep(2);
  116.              goto redo;
  117.           }
  118.           break;
  119.  
  120.         case MENU_MATCH :
  121.           switch (menuval) {
  122.             case A_BACKUP :
  123.               if (j == 0) return(0);
  124.               j--;
  125.               goto redo;
  126.               /* break; */
  127.             case A_ABORT_ADD :
  128.               return(0);
  129.               /* break; */
  130.             case A_FILL_IN_REST :
  131.               if (j == 0) {
  132.                  fprintf(stderr,"You must enter at least a name...\n\n");
  133.          sleep(2);
  134.                  goto redo;
  135.               }
  136.               goto add_entry;
  137.               /* break; */
  138.             case A_HELP :
  139.               cathelpfile(ADDHELP,"adding entries",1);
  140.               any_char_to_continue();
  141.               clear_the_screen();
  142.               cathelpfile(ADDINFO,(char *)NULL,0);
  143.               for (i = 0; i < j; i++) {
  144.                   printf("%s%s\n",Field_Names[i],basicdata[i]);
  145.               }
  146.               goto redo;                            
  147.               /* break; */
  148.             case A_NO_DATA :
  149.               if (j == 0) {
  150.                  fprintf(stderr,"You must enter at least a name...\n\n");
  151.          sleep(2);
  152.                  goto redo;
  153.               }
  154.  
  155.               if (basicdata[j] != (char *)NULL)
  156.             basicdata[j][0] = '\0';
  157.           else
  158.             basicdata[j] = "";
  159.               break;
  160.             default :
  161.               fprintf(stderr,"Impossible rval from rolo_add menu_match\n\n");
  162.               save_and_exit(-1);
  163.               break;
  164.           }
  165.           break;
  166.  
  167.         case MENU_EOF :
  168.           user_eof();
  169.           break;
  170.           
  171.         case MENU_ERROR :
  172.         case MENU_AMBIGUOUS :
  173.         default :
  174.           fprintf(stderr,"Impossible return from rolo_add menu_match\n");
  175.           save_and_exit(-1);
  176.           break;
  177.  
  178.       }
  179.  
  180.   }
  181.  
  182.   if (other_fields()) {
  183.      for (j = 0; j < 100; j++) {
  184.          redo_other :
  185.          rval = menu_match (
  186.               &menuval,&response,
  187.               "Enter <name>: <data> (type RETURN to quit) : ",
  188.               0,0,0,0,5,
  189.               "\\",O_ABORT,
  190.               "?",O_HELP,
  191.               "Help",O_HELP,
  192.               "^",O_BACKUP,
  193.               "",O_DONE_OTHERS
  194.            );
  195.          switch (rval) {
  196.            case MENU_MATCH :
  197.              switch (menuval) {
  198.                case O_DONE_OTHERS :
  199.                  goto add_entry;
  200.                  /* break; */
  201.                case O_BACKUP :
  202.                  if (j == 0) {
  203.                     k = N_BASIC_FIELDS - 2;
  204.                     goto kludge;
  205.                  }
  206.                  else {
  207.                     j--;
  208.                     printf("Deleting %s\n",otherdata[j]);
  209.                     goto redo_other;
  210.                  }
  211.                  /* break; */
  212.                case O_ABORT :
  213.                  return(0);
  214.                  /* break; */
  215.                case O_HELP :
  216.                  cathelpfile(OTHERFORMATHELP,"user-item format",1);
  217.                  any_char_to_continue();
  218.                  goto redo_other;
  219.               }   
  220.              break;
  221.            case MENU_NO_MATCH :
  222.              if ((index(response,':') == (char *)NULL) ||
  223.          (*response == ':')) {
  224.                 printf("No field name provided -- separate with a ':'.\n");
  225.                 goto redo_other;
  226.              }
  227.              otherdata[j] = copystr(response);
  228.              break;
  229.            case MENU_EOF :
  230.              user_eof();
  231.              break;
  232.            case MENU_AMBIGUOUS :
  233.            case MENU_ERROR :
  234.            default :
  235.              fprintf(stderr,"Impossible rval from add_other menu_match\n");
  236.              save_and_exit(-1);
  237.          }
  238.      }
  239.   }
  240.  
  241.   add_entry :   
  242.  
  243.   basicdata[N_BASIC_FIELDS - 1] = timestring();
  244.   
  245.   rlink = create_entry(basicdata,otherdata);
  246.   clear_the_screen();
  247.   display_entry(get_entry(rlink));
  248.   if (add_the_entry()) {
  249.      printf (
  250.          "Adding entry for %s to rolodex\n",
  251.          get_basic_rolo_field((int) R_NAME,get_entry(rlink))
  252.       );
  253.      rolo_insert(rlink,compare_links);
  254.      changed = 1;
  255.      sleep(2);
  256.   }
  257.   else {
  258.      return(0);
  259.   }
  260.   return(0);    /* Should never hit this... */
  261. }
  262.  
  263.  
  264. entry_action (rlink) Ptr_Rolo_List rlink;
  265.  
  266. {
  267.   static entry_menu_displayed = 0;
  268.   int rval,menuval;
  269.   char *response;
  270.   
  271.   if (!entry_menu_displayed) cathelpfile(ENTRYMENU,(char *)NULL,0);
  272. #ifdef NEVERDEF
  273.   entry_menu_displayed = 1;    /* This may be turned off to provide verbose help */
  274. #endif
  275.  
  276.   redo :
  277.   
  278.   rval = menu_match (
  279.        &menuval, &response,
  280.        "Action (? for help) : ",
  281.        0,1,1,1,7,
  282.        "\\",E_ABORT,
  283.        "?",E_HELP,
  284.        "",E_CONTINUE,
  285.        "-",E_DELETE,
  286.        "+",E_UPDATE,
  287.        "<",E_PREV,
  288.        "%",E_SCAN
  289.     );
  290.     
  291.   if (rval != MENU_MATCH) {
  292.      if (rval == MENU_EOF) user_eof();
  293.      fprintf(stderr,"Impossible return from entry_action menu_match\n");
  294.      save_and_exit(-1);
  295.   }
  296.  
  297.   switch (menuval) {
  298.     case E_ABORT :
  299.     case E_CONTINUE :
  300.     case E_PREV :
  301.       break;
  302.     case E_SCAN :
  303.       rolo_peruse_mode(get_next_link(rlink));
  304.       break;
  305.     case E_UPDATE :
  306.       rolo_update_mode(rlink);
  307.       break;
  308.     case E_DELETE :
  309.       if(!rolo_delete(rlink))
  310.           printf("Entry deleted\n");
  311.       sleep(1);
  312.       changed = 1;
  313.       break;
  314.     case E_HELP :
  315.       cathelpfile (
  316.           (in_search_mode ? ESEARCHHELP : ESCANHELP),
  317.           "entry actions",
  318.           1
  319.        );
  320.       any_char_to_continue();
  321.       clear_the_screen();
  322.       display_entry(get_entry(rlink));
  323.       goto redo;
  324.       /* break; */
  325.     default :
  326.       fprintf(stderr,"Impossible menuval in entry_action\n");
  327.       save_and_exit(-1);
  328.   }
  329.  
  330.   return(menuval);
  331.   
  332. }
  333.  
  334.  
  335. display_list_of_entries (rlist) Ptr_Rolo_List rlist;
  336.  
  337. {
  338.   Ptr_Rolo_List old,hold;
  339.  
  340.   if(rlist != 0)
  341.     hold = get_next_link(rlist);    /* In case of change */
  342.         
  343.   while (rlist != 0) {        
  344.     
  345.     if (!get_matched(rlist)) goto next;
  346.         
  347.     loop :    
  348.  
  349.     display_entry(get_entry(rlist));
  350.     
  351.     switch (entry_action(rlist)) {
  352.       case E_CONTINUE :
  353.         break;
  354.       case E_ABORT :
  355.         return(0);
  356.         /* break; */
  357.       case E_PREV :
  358.         old = rlist;
  359.         find_prev_match :
  360.         if (get_prev_link(rlist) == 0) {
  361.            rlist = old;
  362.            printf("No previous entry in scan list\n");
  363.            sleep(2);
  364.         }
  365.         else {
  366.            rlist = get_prev_link(rlist);
  367.            if (!get_matched(rlist)) goto find_prev_match;
  368.         }
  369.         goto loop;
  370.         /* break; */
  371.       case E_UPDATE :
  372.     if(name_changed)
  373.     {
  374.         printf("Continuing scan at next entry in scan list before change...\n");    
  375.         sleep(1);
  376.          rlist = hold;
  377.  
  378.         break;
  379.     }
  380.     /* Deliberate fall-thru */
  381.       default :
  382.         printf("Displaying next entry in scan list...\n");
  383.         sleep(1);
  384.         break;
  385.     }
  386.     
  387.     next :
  388.     
  389.     if(!name_changed)
  390.         rlist = get_next_link(rlist);
  391.     else
  392.     name_changed = 0;
  393.  
  394.     if(rlist != 0)
  395.     hold = get_next_link(rlist);    /* In case of change */
  396.     
  397.   }
  398.   
  399.   printf("No further entries to scan...\n");
  400.   sleep(2);     
  401.   return(0);
  402. }
  403.   
  404.  
  405. rolo_peruse_mode (first_rlink) Ptr_Rolo_List first_rlink;
  406.  
  407. {
  408.   Ptr_Rolo_List rlist = first_rlink;
  409.   if (0 == Begin_Rlist) {
  410.      fprintf(stderr,"No further entries in rolodex...\n");
  411.      sleep(2);
  412.      return(0);
  413.   }
  414.   while (rlist != 0) {  
  415.     set_matched(rlist);
  416.     rlist = get_next_link(rlist);
  417.   }    
  418.   display_list_of_entries(first_rlink);
  419.   rlist = first_rlink;
  420.   while (rlist != 0) {  
  421.     unset_matched(rlist);
  422.     rlist = get_next_link(rlist);
  423.   }    
  424.  
  425.   return(0);
  426. }
  427.