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

  1. /* options.c */
  2. #ifdef UNIX
  3. #include <sys/types.h>
  4. #include <time.h>
  5. #ifdef BSD
  6. #include <sys/file.h>
  7. #include <sgtty.h>
  8. #else
  9. #include <fcntl.h>
  10. #endif
  11. #endif
  12.  
  13. #ifdef VMS
  14. #include <types.h>
  15. #include <time.h>
  16. #include <file.h>
  17. #endif
  18.  
  19. #ifdef MSDOS
  20. #include <time.h>
  21. #include <fcntl.h>
  22. #endif
  23.  
  24. #include <stdio.h>
  25. #include <ctype.h>
  26.  
  27. #include <signal.h>
  28.  
  29. #ifdef TMC
  30. #include <ctools.h>
  31. #else
  32. #include "ctools.h"
  33. #endif
  34. #include "args.h"
  35. #include "menu.h"
  36. #include "mem.h"
  37.  
  38. #include "rolofilz.h"
  39. #include "rolodefs.h"
  40. #include "datadef.h"
  41. #include "choices.h"
  42.  
  43.  
  44. print_short ()
  45.  
  46. /* print the names and phone numbers of everyone in the rolodex. */
  47.  
  48.  
  49.   Ptr_Rolo_List rptr;
  50.   Ptr_Rolo_Entry lentry;
  51.         
  52.   rptr = Begin_Rlist;
  53.   if (rptr == 0) {
  54.      fprintf(stderr,"No entries to print out...\n");
  55.      return;
  56.   }
  57.    
  58.   fprintf (
  59.      stdout,
  60.      "\nNAME                      WORK PHONE                HOME PHONE"
  61.    );
  62.   fprintf (
  63.      stdout,
  64.      "\n----                      ----------                ----------\n\n\n"
  65.    );
  66.  
  67.    while (rptr != 0) {
  68.         lentry = get_entry(rptr);
  69.         fprintf (
  70.             stdout,
  71.             "%-25s %-25s %-25s\n",
  72.             get_basic_rolo_field((int) R_NAME,lentry),
  73.             get_basic_rolo_field((int) R_WORK_PHONE,lentry),
  74.             get_basic_rolo_field((int) R_HOME_PHONE,lentry)
  75.          );   
  76.          rptr = get_next_link(rptr);
  77.    }       
  78.    
  79.  }  
  80.    
  81.  
  82. person_match (person,lentry) char *person; Ptr_Rolo_Entry lentry; 
  83.  
  84. /* Match against a rolodex entry's Name and Company fields. */
  85. /* Thus if I say 'rolo CCA' I will find people who work at CCA. */
  86. /* This is good because sometimes you will forget a name but remember */
  87. /* the company the person works for. */
  88.  
  89.   char *name, *company;        
  90.   int len;
  91.   len = strlen(person);
  92.   name = get_basic_rolo_field((int) R_NAME,lentry);
  93.   company = get_basic_rolo_field((int) R_COMPANY,lentry);
  94.   if (strncsearch(name,strlen(name),person,len)) return(1);
  95.   if (strncsearch(company,strlen(company),person,len)) return(1);
  96.   return(0);
  97. }
  98.  
  99.  
  100. int find_all_person_matches (person) char *person;
  101.  
  102. {
  103.   Ptr_Rolo_List rptr = Begin_Rlist;        
  104.   int count = 0;
  105.   while (rptr != 0) {
  106.     unset_matched(rptr);
  107.     if (person_match(person,get_entry(rptr))) {
  108.        set_matched(rptr);
  109.        count++;
  110.     }
  111.     rptr = get_next_link(rptr);
  112.   }
  113.   return(count);
  114. }
  115.  
  116.  
  117. look_for_person (person) char *person; 
  118.  
  119. /* search against Name and Company over the rolodex.  If a match is found */
  120. /* display the entry and give the user a choice of what to do next. */
  121.  
  122. {
  123.   Ptr_Rolo_List rptr;        
  124.   int found = 0,result,nmatches;
  125.   static displayed_menu = 0;
  126.   char *response;
  127.   
  128.   rptr = Begin_Rlist;        
  129.   while (rptr != 0) {        
  130.     if (person_match(person,get_entry(rptr))) {
  131.        clear_the_screen();
  132.        display_entry(get_entry(rptr));
  133.        if (!found) {
  134.           nmatches = find_all_person_matches(person);
  135.           if (nmatches > 1) {
  136.              printf (
  137.                 "There are %d other entries which match '%s'\n\n",
  138.                 nmatches - 1, person
  139.               );
  140.           }
  141.        }
  142.        found = 1;
  143.        try_again :
  144.        if (!displayed_menu) cathelpfile(POPTIONMENU,(char *)NULL,0);
  145.        displayed_menu = 1;
  146.        menu_match (
  147.             &result,
  148.             &response,
  149.             "Select option (? for help): ",
  150.             0,1,1,1,6,
  151.             "Continue",P_CONTINUE,
  152.             "",P_CONTINUE,
  153.             "Next",P_NEXT_PERSON,
  154.             "\\",P_ABORT,
  155.             "Help",P_HELP,
  156.             "?",P_HELP
  157.          );
  158.        switch (result) {
  159.          case P_CONTINUE :
  160.            break;
  161.          case P_NEXT_PERSON :
  162.            return(0);
  163.            /* break; */
  164.          case P_ABORT :
  165.            roloexit(0);
  166.            break;
  167.          case P_HELP :
  168.            cathelpfile(POPTIONSHELP,"person search options",1);
  169.            goto try_again;
  170.          default :
  171.            fprintf(stderr,"Impossible return from menu_match\n");
  172.            exit(-1);
  173.        }
  174.     }
  175.     rptr = get_next_link(rptr);
  176.   }
  177.   if (!found) {
  178.      fprintf(stderr,"\nNo entry found for '%s'\n\n",person);
  179.      sleep(2);
  180.   }
  181.   else {
  182.      printf("No further matches for '%s'\n",person);
  183.      sleep(2);
  184.   }   
  185.   return(0);
  186. }
  187.  
  188.  
  189. print_people ()
  190.  
  191. {
  192.   int index;
  193.   char *person;
  194.   index = 1;
  195.   while (T) {
  196.      if (0 == (person = non_option_arg(index++))) break;
  197.      look_for_person(person);
  198.   }
  199. }
  200.  
  201.  
  202. interactive_rolo ()
  203.  
  204. /* Top level of the iteractive rolodex.  This code is just a big switch */
  205. /* which passes responsibility off to various routines in 'operatns.c' */
  206. /* and 'update.c' */
  207.  
  208. {
  209.  
  210.   int result,rval,field_index;
  211.   char *response,*field_name,*search_string;
  212.  
  213.   fprintf(stdout,"\n\nTMC ROLODEX, Version %s\n\n\n",VERSION);        
  214.   
  215.   while (1) {        
  216.         
  217.     cathelpfile(MAINMENU,(char *)NULL,0);
  218.     rval = menu_match (
  219.          &result,
  220.          &response,
  221.          "Select option (? for help): ",
  222.          0,1,0,1,7,
  223.          "+",M_ADD,
  224.          "%",M_PERUSE,
  225.          "\\",M_EXIT,
  226.          "?",M_HELP,
  227.          "*",M_SAVE,
  228.          "$",M_SEARCH_BY_OTHER,
  229.          "!",M_PRINT_TO_LASER_PRINTER
  230.       );
  231.       
  232.     switch (rval) {
  233.         
  234.       case MENU_AMBIGUOUS :
  235.       case MENU_ERROR :
  236.         fprintf(stderr,"Impossible return 1 from main menu_match\n");
  237.         exit(-1);
  238.         break;
  239.         
  240.       case MENU_NO_MATCH :
  241.         response = copystr(response);
  242.         rolo_search_mode((int) R_NAME,Field_Names[(int) R_NAME],response);
  243.         break;
  244.         
  245.       case MENU_MATCH :
  246.         
  247.         switch (result) {
  248.           case M_ADD :
  249.             rolo_add();
  250.             break;
  251.           case M_SEARCH_BY_OTHER :
  252.             if ((-1 == select_field_to_search_by(&field_index,&field_name)) ||
  253.                 (0 == (search_string = select_search_string()))) {
  254.                break;
  255.             }
  256.             rolo_search_mode(field_index,field_name,search_string);
  257.             break;
  258.           case M_PRINT_TO_LASER_PRINTER :
  259.             /* fprintf(stderr,"Not implemented\n"); */
  260.         pretty_print();
  261.             sleep(1);
  262.             break;
  263.           case M_PERUSE :
  264.             rolo_peruse_mode(Begin_Rlist);
  265.             break;
  266.           case M_EXIT :
  267.             save_and_exit(0);
  268.             break;
  269.           case M_SAVE :
  270.             if (changed) {
  271.                save_to_disk();
  272.                sleep(1);
  273.             }
  274.             else {
  275.                printf("No changes to be saved...\n");
  276.                sleep(2);
  277.             }
  278.             break;
  279.           case M_HELP :
  280.             cathelpfile(MOPTIONHELP,"top level menu",1);
  281.             any_char_to_continue();
  282.             break;
  283.           default :
  284.             fprintf(stderr,"Impossible result from menu_match...\n");
  285.             save_and_exit(-1);
  286.         }
  287.         break;
  288.             
  289.       case MENU_EOF :
  290.         user_eof();
  291.         break;
  292.         
  293.       default :
  294.         fprintf(stderr,"Impossible return 2 from menu_match\n");
  295.         save_and_exit(-1);
  296.         
  297.     }
  298.     
  299.     clear_the_screen();
  300.     
  301.   }
  302.  
  303. }
  304.