ftp.nice.ch/pub/next/unix/editor/e2.N.bs.tar.gz#/e2.N.bs/multiple.c

This is multiple.c in view mode; [Download] [Up]

#include "e.h"

/*
 * There were several names on the command line, so we just strcat them
 * into the 'arg' array. Check to see that the length of all the args
 * will not be greater than "size" or else we will overflow arg.
 *
 * This is actually insane - we put the args into a char array to pass to
 * do_vi, and then it promptly sticks them back into a char ** arrangement.
 * Ugh.
 *
 * The total argument length must be at most size - 1 characters, including
 * spaces. arg needs to have a trailing '\0' so that do_vi() wont break.
 *
 */

void
multiple(number, args, size)
int number;
char **args;
int size;
{
    register i;
    register total = 0;
    char temp_arg[ARG_CHARS];

    temp_arg[0] = '\0';
    while (--number){
        if ((total += strlen(*(args + 1))) >= size){

            /*
             * If you are running e and you find that this condition occurs,
             * the solution is to simply increase the value of the #define
             * line for ARG_CHARS in e.h. It shouldn't happen under normal
             * circumstances.
             *
             */

            ok_fprintf(stderr,
                "\007Argument list too long, truncated after '%s'.\n", *args);
            sleep(2);   /* Give them some chance to see what happened. */
            break;
        }

        arg[0] = '\0';
        strcat(arg, *++args);
        (void) spell_help(1);
        strcat(temp_arg, arg);
        strcat(temp_arg, " ");

        if (number > 1){
            strcat(arg, " ");

            /* 
             * Add one to total for the space. There's no need to check for
             * overflow here as we know there is another argument since
             * number > 1 still. Thus if this overflows arg, then it is going
             * to be caught anyway in the test at the top of the while loop.
             *
             */

            total++;                
        }
    }

    strcpy(arg, temp_arg);

    /*
     * Now, if there is a history file and we can find an identical line
     * then reconstruct with that line at the bottom.
     *
     */

    if (hist_count != -1){
        for (i = 0; i < hist_count; i++){
            if (!strcmp(hist[i], arg)){
                reconstruct(i);
                return;
            }
        }

        /*
         * Reconstruct and leave out the oldest if needed.
         *
         */
        if (hist_count == HIST_LINES){
            reconstruct(0);
        }
        else{
            reconstruct(-1);
        }
    }
    else{
        /* There was no history file so try to give them one for next time. */
        new_vi();
    }
    return;
}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.