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

  1. #include "e.h"
  2.  
  3. /*
  4.  * There were several names on the command line, so we just strcat them
  5.  * into the 'arg' array. Check to see that the length of all the args
  6.  * will not be greater than "size" or else we will overflow arg.
  7.  *
  8.  * This is actually insane - we put the args into a char array to pass to
  9.  * do_vi, and then it promptly sticks them back into a char ** arrangement.
  10.  * Ugh.
  11.  *
  12.  * The total argument length must be at most size - 1 characters, including
  13.  * spaces. arg needs to have a trailing '\0' so that do_vi() wont break.
  14.  *
  15.  */
  16.  
  17. void
  18. multiple(number, args, size)
  19. int number;
  20. char **args;
  21. int size;
  22. {
  23.     register i;
  24.     register total = 0;
  25.     char temp_arg[ARG_CHARS];
  26.  
  27.     temp_arg[0] = '\0';
  28.     while (--number){
  29.         if ((total += strlen(*(args + 1))) >= size){
  30.  
  31.             /*
  32.              * If you are running e and you find that this condition occurs,
  33.              * the solution is to simply increase the value of the #define
  34.              * line for ARG_CHARS in e.h. It shouldn't happen under normal
  35.              * circumstances.
  36.              *
  37.              */
  38.  
  39.             ok_fprintf(stderr,
  40.                 "\007Argument list too long, truncated after '%s'.\n", *args);
  41.             sleep(2);   /* Give them some chance to see what happened. */
  42.             break;
  43.         }
  44.  
  45.         arg[0] = '\0';
  46.         strcat(arg, *++args);
  47.         (void) spell_help(1);
  48.         strcat(temp_arg, arg);
  49.         strcat(temp_arg, " ");
  50.  
  51.         if (number > 1){
  52.             strcat(arg, " ");
  53.  
  54.             /* 
  55.              * Add one to total for the space. There's no need to check for
  56.              * overflow here as we know there is another argument since
  57.              * number > 1 still. Thus if this overflows arg, then it is going
  58.              * to be caught anyway in the test at the top of the while loop.
  59.              *
  60.              */
  61.  
  62.             total++;                
  63.         }
  64.     }
  65.  
  66.     strcpy(arg, temp_arg);
  67.  
  68.     /*
  69.      * Now, if there is a history file and we can find an identical line
  70.      * then reconstruct with that line at the bottom.
  71.      *
  72.      */
  73.  
  74.     if (hist_count != -1){
  75.         for (i = 0; i < hist_count; i++){
  76.             if (!strcmp(hist[i], arg)){
  77.                 reconstruct(i);
  78.                 return;
  79.             }
  80.         }
  81.  
  82.         /*
  83.          * Reconstruct and leave out the oldest if needed.
  84.          *
  85.          */
  86.         if (hist_count == HIST_LINES){
  87.             reconstruct(0);
  88.         }
  89.         else{
  90.             reconstruct(-1);
  91.         }
  92.     }
  93.     else{
  94.         /* There was no history file so try to give them one for next time. */
  95.         new_vi();
  96.     }
  97.     return;
  98. }
  99.