home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume17 / e2 / part03 / e.c < prev    next >
C/C++ Source or Header  |  1989-02-08  |  6KB  |  205 lines

  1. #include "e.h"
  2.  
  3. void
  4. e(c, v)
  5. int c;
  6. char **v;
  7. {
  8.     /*
  9.      * Process the command line. This gets a little messy as there are so
  10.      * many ways e can be invoked. They are listed below and there is an
  11.      * example provided in each of the switch cases to illustrate the 
  12.      * particular one we are trying to handle.
  13.      *
  14.      * The idea in most cases is to get the arguments that will be passed
  15.      * to vi into a character array (arg), and pass it to do_vi(). do_vi()
  16.      * splits up the arguments and execs vi. Occasionally it is simpler and
  17.      * do_vi() can be called more directly.
  18.      *
  19.      *
  20.      * Command Line Options.
  21.      * =====================
  22.      *
  23.      * No arguments.
  24.      *
  25.      *     (1) "e"
  26.      *
  27.      * One argument.
  28.      *
  29.      *     (2) "e -"
  30.      *     (3) "e -#"                # is the number of some history item.
  31.      *     (4) "e -r"
  32.      *     (5) "e -pat"              pat is a search pattern.
  33.      *     (6) "e +100"
  34.      *     (7) "e ."
  35.      *     (8) "e <filename > "
  36.      *
  37.      * Multiple arguments.
  38.      *
  39.      *     (9) "e fred harry joe"   Also handles "e -t tag", "e -r file" etc.
  40.      *
  41.      */
  42.  
  43.  
  44.     switch (c){
  45.         case 1: {
  46.  
  47.             /* 
  48.              * Command line option (1).
  49.              * Example: "e"
  50.              *
  51.              * Just go and vi the last file that was e'ed.
  52.              *
  53.              */
  54.  
  55.             check_hist();
  56.             abandon();
  57.             do_vi(hist[hist_count - 1]);
  58.             break;
  59.         }
  60.         
  61.         case 2:{
  62.             switch ((*++v)[0]){
  63.  
  64.                 case '-':{
  65.  
  66.                     if ((c = (*v)[1]) == '\0'){
  67.  
  68.                         /* 
  69.                          * Command line option (2).
  70.                          * Example: "e -"
  71.                          *
  72.                          * This is a select from history, ask what they want.
  73.                          *
  74.                          */
  75.  
  76.                         check_hist();
  77.                         ask_hist();
  78.                         do_vi(arg);
  79.                     }
  80.                     else if (isdigit(c)){
  81.  
  82.                         /* 
  83.                          * Command line option (3).
  84.                          * Example: "e -3"
  85.                          *
  86.                          * Get the nth last file from the history and vi it.
  87.                          *
  88.                          */
  89.  
  90.                         check_hist();
  91.                         nth_hist(c-'0');
  92.                         do_vi(arg);
  93.                     }
  94.                     else if (c == 'r' && (*v)[2] == '\0'){
  95.  
  96.                         /* 
  97.                          * Command line option (4).
  98.                          * Example: "e -r"
  99.                          *
  100.                          * A recover, just pass it to vi and don't interfere.
  101.                          *
  102.                          */
  103.  
  104.                         do_vi(*v);
  105.                     }
  106.                     else{
  107.  
  108.                         /* 
  109.                          * Command line option (5).
  110.                          * Example: "e -pat"
  111.                          *
  112.                          * This is a pattern - try to match it.
  113.                          *
  114.                          */
  115.  
  116.                         check_hist();
  117.                         find_match(++*v);
  118.                         do_vi(arg);
  119.                     }
  120.                     break;
  121.                 }
  122.  
  123.                 case '+':{
  124.  
  125.                     /* 
  126.                      * Command line option (6).
  127.                      * Example: "e +100"
  128.                      *
  129.                      * A command, put it before the last file name.
  130.                      *
  131.                      */
  132.  
  133.                     check_hist();
  134.                     insert_cmd(*v);
  135.                     do_vi(arg);
  136.                     break;
  137.                 }
  138.  
  139.                 case '.':{
  140.  
  141.                     /* 
  142.                      * Command line option (7).
  143.                      * Example: "e ."
  144.                      * Example: "e .login"  (falls through to option (8)).
  145.                      *
  146.                      * Just give a history list if there is only a dot.
  147.                      * Otherwise fall through as it must be a filename.
  148.                      *
  149.                      */
  150.  
  151.                     if ((*v)[1] == '\0'){
  152.                         register i;
  153.  
  154.                         check_hist();
  155.                         for (i = 0; i < hist_count; i++){
  156.                             ok_fprintf(stderr, "\t[%d]: %s\n",
  157.                                 hist_count - i - 1, hist[i]);
  158.                         }
  159.                         abandon();
  160.                     }
  161.                     /* 
  162.                      * The switch falls through in the case where there is a
  163.                      * filename that starts with a period.
  164.                      *
  165.                      */
  166.  
  167.                 }
  168.                 /* FALLTHROUGH */
  169.  
  170.                 default :{
  171.  
  172.                     /* 
  173.                      * Command line option (8).
  174.                      * Example: "e fred"
  175.                      * Example: "e .login"  (fell through from option (8)).
  176.                      *
  177.                      * Looks like it's just a plain old file name. vi it!
  178.                      *
  179.                      */
  180.  
  181.                     normal(*v);
  182.                     do_vi(arg);
  183.                     break;
  184.                 }
  185.             }
  186.             break;
  187.         }
  188.  
  189.         default:{
  190.  
  191.             /* 
  192.              * Command line option (9).
  193.              * Example: "e fred harry joe"
  194.              *
  195.              * A bunch of arguments, fix the history & vi them all as normal.
  196.              *
  197.              */
  198.  
  199.             multiple(c, v, ARG_CHARS);
  200.             do_vi(arg);
  201.             break;
  202.         }
  203.     }
  204. }
  205.