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