diff options
-rw-r--r-- | gnu/usr.bin/patch/inp.c | 560 | ||||
-rw-r--r-- | gnu/usr.bin/patch/pch.c | 955 | ||||
-rw-r--r-- | gnu/usr.bin/patch/util.c | 622 |
3 files changed, 1101 insertions, 1036 deletions
diff --git a/gnu/usr.bin/patch/inp.c b/gnu/usr.bin/patch/inp.c index dbc9bf9..d77ef65 100644 --- a/gnu/usr.bin/patch/inp.c +++ b/gnu/usr.bin/patch/inp.c @@ -16,17 +16,17 @@ #include "INTERN.h" #include "inp.h" -/* Input-file-with-indexable-lines abstract type */ +/* Input-file-with-indexable-lines abstract type. */ -static long i_size; /* size of the input file */ -static char *i_womp; /* plan a buffer for entire file */ -static char **i_ptr; /* pointers to lines in i_womp */ +static long i_size; /* Size of the input file */ +static char *i_womp; /* Plan a buffer for entire file */ +static char **i_ptr; /* Pointers to lines in i_womp */ -static int tifd = -1; /* plan b virtual string array */ -static char *tibuf[2]; /* plan b buffers */ +static int tifd = -1; /* Plan b virtual string array */ +static char *tibuf[2]; /* Plan b buffers */ static LINENUM tiline[2] = {-1, -1}; /* 1st line in each buffer */ -static LINENUM lines_per_buf; /* how many lines per buffer */ -static int tireclen; /* length of records in tmp file */ +static LINENUM lines_per_buf; /* How many lines per buffer */ +static int tireclen; /* Length of records in tmp file */ /* * New patch--prepare to edit another file. @@ -34,27 +34,26 @@ static int tireclen; /* length of records in tmp file */ void re_input(void) { - if (using_plan_a) { - i_size = 0; + if (using_plan_a) { + i_size = 0; #ifndef lint - if (i_ptr != Null(char**)) - free((char *)i_ptr); + if (i_ptr != Null(char**)) + free((char *)i_ptr); #endif - if (i_womp != Nullch) - free(i_womp); - i_womp = Nullch; - i_ptr = Null(char **); - } - else { - using_plan_a = TRUE; /* maybe the next one is smaller */ - Close(tifd); - tifd = -1; - free(tibuf[0]); - free(tibuf[1]); - tibuf[0] = tibuf[1] = Nullch; - tiline[0] = tiline[1] = -1; - tireclen = 0; - } + if (i_womp != Nullch) + free(i_womp); + i_womp = Nullch; + i_ptr = Null(char **); + } else { + using_plan_a = TRUE; /* maybe the next one is smaller */ + Close(tifd); + tifd = -1; + free(tibuf[0]); + free(tibuf[1]); + tibuf[0] = tibuf[1] = Nullch; + tiline[0] = tiline[1] = -1; + tireclen = 0; + } } /* @@ -63,12 +62,12 @@ re_input(void) void scan_input(char *filename) { - if (!plan_a(filename)) - plan_b(filename); - if (verbose) { - say3("Patching file %s using Plan %s...\n", filename, - (using_plan_a ? "A" : "B") ); - } + if (!plan_a(filename)) + plan_b(filename); + if (verbose) { + say3("Patching file %s using Plan %s...\n", filename, + (using_plan_a ? "A" : "B") ); + } } /* @@ -77,175 +76,196 @@ scan_input(char *filename) bool plan_a(char *filename) { - int ifd, statfailed; - Reg1 char *s; - Reg2 LINENUM iline; - char lbuf[MAXLINELEN]; - int output_elsewhere = strcmp(filename, outname); - extern int check_patch; + int ifd, statfailed; + Reg1 char *s; + Reg2 LINENUM iline; + char lbuf[MAXLINELEN]; + int output_elsewhere = strcmp(filename, outname); + extern int check_patch; - statfailed = stat(filename, &filestat); - if (statfailed && ok_to_create_file) { - if (verbose) - say2("(Creating file %s...)\n",filename); - if (check_patch) - return TRUE; - makedirs(filename, TRUE); - close(creat(filename, 0666)); statfailed = stat(filename, &filestat); - } - if (statfailed && check_patch) { - fatal2("%s not found and in check_patch mode.", filename); - } - /* For nonexistent or read-only files, look for RCS or SCCS versions. */ - if (statfailed - || (! output_elsewhere - && (/* No one can write to it. */ - (filestat.st_mode & 0222) == 0 - /* I can't write to it. */ - || ((filestat.st_mode & 0022) == 0 - && filestat.st_uid != myuid)))) { - struct stat cstat; - char *cs = Nullch; - char *filebase; - int pathlen; + if (statfailed && ok_to_create_file) { + if (verbose) + say2("(Creating file %s...)\n",filename); + if (check_patch) + return TRUE; + makedirs(filename, TRUE); + close(creat(filename, 0666)); + statfailed = stat(filename, &filestat); + } + if (statfailed && check_patch) { + fatal2("%s not found and in check_patch mode.", filename); + } + /* + * For nonexistent or read-only files, look for RCS or SCCS + * versions. + */ + if (statfailed || + (! output_elsewhere && + (/* No one can write to it. */ + (filestat.st_mode & 0222) == 0 || + /* I can't write to it. */ + ((filestat.st_mode & 0022) == 0 && filestat.st_uid != myuid)))) { + struct stat cstat; + char *cs = Nullch; + char *filebase; + int pathlen; - filebase = basename(filename); - pathlen = filebase - filename; + filebase = basename(filename); + pathlen = filebase - filename; - /* Put any leading path into `s'. - Leave room in lbuf for the diff command. */ - s = lbuf + 20; - strncpy(s, filename, pathlen); + /* + * Put any leading path into `s'. + * Leave room in lbuf for the diff command. + */ + s = lbuf + 20; + strncpy(s, filename, pathlen); #define try(f,a1,a2) (Sprintf(s + pathlen, f, a1, a2), stat(s, &cstat) == 0) - if (( try("RCS/%s%s", filebase, RCSSUFFIX) - || try("RCS/%s%s", filebase, "") - || try( "%s%s", filebase, RCSSUFFIX)) - && - /* Check that RCS file is not working file. - Some hosts don't report file name length errors. */ - (statfailed - || ( (filestat.st_dev ^ cstat.st_dev) - | (filestat.st_ino ^ cstat.st_ino)))) { - Sprintf(buf, output_elsewhere?CHECKOUT:CHECKOUT_LOCKED, filename); - Sprintf(lbuf, RCSDIFF, filename); - cs = "RCS"; - } else if ( try("SCCS/%s%s", SCCSPREFIX, filebase) - || try( "%s%s", SCCSPREFIX, filebase)) { - Sprintf(buf, output_elsewhere?GET:GET_LOCKED, s); - Sprintf(lbuf, SCCSDIFF, s, filename); - cs = "SCCS"; - } else if (statfailed) - fatal2("can't find %s\n", filename); - /* else we can't write to it but it's not under a version - control system, so just proceed. */ - if (cs) { - if (!statfailed) { - if ((filestat.st_mode & 0222) != 0) - /* The owner can write to it. */ - fatal3("file %s seems to be locked by somebody else under %s\n", - filename, cs); - /* It might be checked out unlocked. See if it's safe to - check out the default version locked. */ - if (verbose) - say3("Comparing file %s to default %s version...\n", - filename, cs); - if (system(lbuf)) - fatal3("can't check out file %s: differs from default %s version\n", - filename, cs); - } - if (verbose) - say3("Checking out file %s from %s...\n", filename, cs); - if (system(buf) || stat(filename, &filestat)) - fatal3("can't check out file %s from %s\n", filename, cs); + if ((try("RCS/%s%s", filebase, RCSSUFFIX) || + try("RCS/%s%s", filebase, "") || + try("%s%s", filebase, RCSSUFFIX)) && + /* + * Check that RCS file is not working file. + * Some hosts don't report file name length errors. + */ + (statfailed || + ((filestat.st_dev ^ cstat.st_dev) | + (filestat.st_ino ^ cstat.st_ino)))) { + Sprintf(buf, output_elsewhere?CHECKOUT:CHECKOUT_LOCKED, filename); + Sprintf(lbuf, RCSDIFF, filename); + cs = "RCS"; + } else if (try("SCCS/%s%s", SCCSPREFIX, filebase) || + try("%s%s", SCCSPREFIX, filebase)) { + Sprintf(buf, output_elsewhere?GET:GET_LOCKED, s); + Sprintf(lbuf, SCCSDIFF, s, filename); + cs = "SCCS"; + } else if (statfailed) + fatal2("can't find %s\n", filename); + /* + * else we can't write to it but it's not under a version + * control system, so just proceed. + */ + if (cs) { + if (!statfailed) { + if ((filestat.st_mode & 0222) != 0) + /* The owner can write to it. */ + fatal3( +"file %s seems to be locked by somebody else under %s\n", + filename, cs); + /* + * It might be checked out unlocked. See if + * it's safe to check out the default version + * locked. + */ + if (verbose) + say3( +"Comparing file %s to default %s version...\n", + filename, cs); + if (system(lbuf)) + fatal3( +"can't check out file %s: differs from default %s version\n", + filename, cs); + } + if (verbose) + say3("Checking out file %s from %s...\n", filename, cs); + if (system(buf) || stat(filename, &filestat)) + fatal3("can't check out file %s from %s\n", + filename, cs); + } + } + filemode = filestat.st_mode; + if (!S_ISREG(filemode)) + fatal2("%s is not a normal file--can't patch\n", filename); + i_size = filestat.st_size; + if (out_of_mem) { + set_hunkmax(); /* make sure dynamic arrays are allocated */ + out_of_mem = FALSE; + return FALSE; /* force plan b because plan a bombed */ } - } - filemode = filestat.st_mode; - if (!S_ISREG(filemode)) - fatal2("%s is not a normal file--can't patch\n", filename); - i_size = filestat.st_size; - if (out_of_mem) { - set_hunkmax(); /* make sure dynamic arrays are allocated */ - out_of_mem = FALSE; - return FALSE; /* force plan b because plan a bombed */ - } #ifdef lint - i_womp = Nullch; + i_womp = Nullch; #else - i_womp = malloc((MEM)(i_size+2)); /* lint says this may alloc less than */ - /* i_size, but that's okay, I think. */ + /* + * Lint says this may alloc less than i_size, + * but that's okay, I think. + */ + i_womp = malloc((MEM)(i_size + 2)); #endif - if (i_womp == Nullch) - return FALSE; - if ((ifd = open(filename, 0)) < 0) - pfatal2("can't open file %s", filename); + if (i_womp == Nullch) + return FALSE; + if ((ifd = open(filename, 0)) < 0) + pfatal2("can't open file %s", filename); #ifndef lint - if (read(ifd, i_womp, (int)i_size) != i_size) { - Close(ifd); /* probably means i_size > 15 or 16 bits worth */ - free(i_womp); /* at this point it doesn't matter if i_womp was */ - return FALSE; /* undersized. */ - } + if (read(ifd, i_womp, (int)i_size) != i_size) { + /* + * This probably means i_size > 15 or 16 bits worth. At + * this point it doesn't matter if i_womp was undersized. + */ + Close(ifd); + free(i_womp); + return FALSE; + } #endif - Close(ifd); - if (i_size && i_womp[i_size-1] != '\n') - i_womp[i_size++] = '\n'; - i_womp[i_size] = '\0'; - - /* count the lines in the buffer so we know how many pointers we need */ + Close(ifd); + if (i_size && i_womp[i_size - 1] != '\n') + i_womp[i_size++] = '\n'; + i_womp[i_size] = '\0'; - iline = 0; - for (s=i_womp; *s; s++) { - if (*s == '\n') - iline++; - } + /* + * Count the lines in the buffer so we know how many pointers we + * need. + */ + iline = 0; + for (s = i_womp; *s; s++) { + if (*s == '\n') + iline++; + } #ifdef lint - i_ptr = Null(char**); + i_ptr = Null(char**); #else - i_ptr = (char **)malloc((MEM)((iline + 2) * sizeof(char *))); + i_ptr = (char **)malloc((MEM)((iline + 2) * sizeof(char *))); #endif - if (i_ptr == Null(char **)) { /* shucks, it was a near thing */ - free((char *)i_womp); - return FALSE; - } - - /* now scan the buffer and build pointer array */ - - iline = 1; - i_ptr[iline] = i_womp; - for (s=i_womp; *s; s++) { - if (*s == '\n') - i_ptr[++iline] = s+1; /* these are NOT null terminated */ - } - input_lines = iline - 1; + if (i_ptr == Null(char **)) { /* shucks, it was a near thing */ + free((char *)i_womp); + return FALSE; + } - /* now check for revision, if any */ + /* Now scan the buffer and build pointer array. */ + iline = 1; + i_ptr[iline] = i_womp; + for (s = i_womp; *s; s++) { + if (*s == '\n') { + /* These are NOT null terminated. */ + i_ptr[++iline] = s + 1; + } + } + input_lines = iline - 1; - if (revision != Nullch) { - if (!rev_in_string(i_womp)) { - if (force) { - if (verbose) - say2( + /* Now check for revision, if any. */ + if (revision != Nullch) { + if (!rev_in_string(i_womp)) { + if (force) { + if (verbose) + say2( "Warning: this file doesn't appear to be the %s version--patching anyway.\n", - revision); - } - else if (batch) { - fatal2( + revision); + } else if (batch) { + fatal2( "this file doesn't appear to be the %s version--aborting.\n", revision); - } - else { - (void) ask2( + } else { + (void) ask2( "This file doesn't appear to be the %s version--patch anyway? [n] ", - revision); - if (*buf != 'y') - fatal1("aborted\n"); - } + revision); + if (*buf != 'y') + fatal1("aborted\n"); + } + } else if (verbose) + say2("Good. This file appears to be the %s version.\n", + revision); } - else if (verbose) - say2("Good. This file appears to be the %s version.\n", - revision); - } - return TRUE; /* plan a will work */ + + return TRUE; /* Plan a will work. */ } /* @@ -254,71 +274,69 @@ plan_a(char *filename) void plan_b(char *filename) { - Reg3 FILE *ifp; - Reg1 int i = 0; - Reg2 int maxlen = 1; - Reg4 bool found_revision = (revision == Nullch); + Reg3 FILE *ifp; + Reg1 int i = 0; + Reg2 int maxlen = 1; + Reg4 bool found_revision = (revision == Nullch); - using_plan_a = FALSE; - if ((ifp = fopen(filename, "r")) == Nullfp) - pfatal2("can't open file %s", filename); - if ((tifd = creat(TMPINNAME, 0666)) < 0) - pfatal2("can't open file %s", TMPINNAME); - while (fgets(buf, sizeof buf, ifp) != Nullch) { - if (revision != Nullch && !found_revision && rev_in_string(buf)) - found_revision = TRUE; - if ((i = strlen(buf)) > maxlen) - maxlen = i; /* find longest line */ - } - if (revision != Nullch) { - if (!found_revision) { - if (force) { - if (verbose) - say2( + using_plan_a = FALSE; + if ((ifp = fopen(filename, "r")) == Nullfp) + pfatal2("can't open file %s", filename); + if ((tifd = creat(TMPINNAME, 0666)) < 0) + pfatal2("can't open file %s", TMPINNAME); + while (fgets(buf, sizeof buf, ifp) != Nullch) { + if (revision != Nullch && !found_revision && rev_in_string(buf)) + found_revision = TRUE; + if ((i = strlen(buf)) > maxlen) + maxlen = i; /* Find longest line. */ + } + if (revision != Nullch) { + if (!found_revision) { + if (force) { + if (verbose) + say2( "Warning: this file doesn't appear to be the %s version--patching anyway.\n", - revision); - } - else if (batch) { - fatal2( + revision); + } else if (batch) { + fatal2( "this file doesn't appear to be the %s version--aborting.\n", revision); - } - else { - (void) ask2( + } else { + (void) ask2( "This file doesn't appear to be the %s version--patch anyway? [n] ", - revision); - if (*buf != 'y') - fatal1("aborted\n"); - } + revision); + if (*buf != 'y') + fatal1("aborted\n"); + } + } else if (verbose) + say2("Good. This file appears to be the %s version.\n", + revision); } - else if (verbose) - say2("Good. This file appears to be the %s version.\n", - revision); - } - Fseek(ifp, 0L, 0); /* rewind file */ - lines_per_buf = BUFFERSIZE / maxlen; - tireclen = maxlen; - tibuf[0] = malloc((MEM)(BUFFERSIZE + 1)); - tibuf[1] = malloc((MEM)(BUFFERSIZE + 1)); - if (tibuf[1] == Nullch) - fatal1("out of memory\n"); - for (i=1; ; i++) { - if (! (i % lines_per_buf)) /* new block */ - if (write(tifd, tibuf[0], BUFFERSIZE) < BUFFERSIZE) - pfatal1("can't write temp file"); - if (fgets(tibuf[0] + maxlen * (i%lines_per_buf), maxlen + 1, ifp) - == Nullch) { - input_lines = i - 1; - if (i % lines_per_buf) - if (write(tifd, tibuf[0], BUFFERSIZE) < BUFFERSIZE) - pfatal1("can't write temp file"); - break; + Fseek(ifp, 0L, 0); /* Rewind file. */ + lines_per_buf = BUFFERSIZE / maxlen; + tireclen = maxlen; + tibuf[0] = malloc((MEM)(BUFFERSIZE + 1)); + tibuf[1] = malloc((MEM)(BUFFERSIZE + 1)); + if (tibuf[1] == Nullch) + fatal1("out of memory\n"); + for (i = 1; ; i++) { + if (! (i % lines_per_buf)) /* New block. */ + if (write(tifd, tibuf[0], BUFFERSIZE) < BUFFERSIZE) + pfatal1("can't write temp file"); + if (fgets(tibuf[0] + maxlen * (i%lines_per_buf), + maxlen + 1, ifp) == Nullch) { + input_lines = i - 1; + if (i % lines_per_buf) + if (write(tifd, tibuf[0], BUFFERSIZE) < + BUFFERSIZE) + pfatal1("can't write temp file"); + break; + } + } + Fclose(ifp); + Close(tifd); + if ((tifd = open(TMPINNAME, 0)) < 0) { + pfatal2("can't reopen file %s", TMPINNAME); } - } - Fclose(ifp); - Close(tifd); - if ((tifd = open(TMPINNAME, 0)) < 0) { - pfatal2("can't reopen file %s", TMPINNAME); - } } /* @@ -329,28 +347,28 @@ ifetch(line,whichbuf) Reg1 LINENUM line; int whichbuf; /* ignored when file in memory */ { - if (line < 1 || line > input_lines) - return ""; - if (using_plan_a) - return i_ptr[line]; - else { - LINENUM offline = line % lines_per_buf; - LINENUM baseline = line - offline; - - if (tiline[0] == baseline) - whichbuf = 0; - else if (tiline[1] == baseline) - whichbuf = 1; + if (line < 1 || line > input_lines) + return ""; + if (using_plan_a) + return i_ptr[line]; else { - tiline[whichbuf] = baseline; + LINENUM offline = line % lines_per_buf; + LINENUM baseline = line - offline; + + if (tiline[0] == baseline) + whichbuf = 0; + else if (tiline[1] == baseline) + whichbuf = 1; + else { + tiline[whichbuf] = baseline; #ifndef lint /* complains of long accuracy */ - Lseek(tifd, (long)baseline / lines_per_buf * BUFFERSIZE, 0); + Lseek(tifd, (long)baseline / lines_per_buf * BUFFERSIZE, 0); #endif - if (read(tifd, tibuf[whichbuf], BUFFERSIZE) < 0) - pfatal2("error reading tmp file %s", TMPINNAME); + if (read(tifd, tibuf[whichbuf], BUFFERSIZE) < 0) + pfatal2("error reading tmp file %s", TMPINNAME); + } + return tibuf[whichbuf] + (tireclen * offline); } - return tibuf[whichbuf] + (tireclen*offline); - } } /* @@ -359,19 +377,21 @@ int whichbuf; /* ignored when file in memory */ bool rev_in_string(char *string) { - Reg1 char *s; - Reg2 int patlen; + Reg1 char *s; + Reg2 int patlen; - if (revision == Nullch) - return TRUE; - patlen = strlen(revision); - if (strnEQ(string,revision,patlen) && isspace((unsigned char)string[patlen])) - return TRUE; - for (s = string; *s; s++) { - if (isspace((unsigned char)*s) && strnEQ(s+1, revision, patlen) && - isspace((unsigned char)s[patlen+1] )) { - return TRUE; + if (revision == Nullch) + return TRUE; + patlen = strlen(revision); + if (strnEQ(string,revision,patlen) && + isspace((unsigned char)string[patlen])) + return TRUE; + for (s = string; *s; s++) { + if (isspace((unsigned char)*s) && + strnEQ(s + 1, revision, patlen) && + isspace((unsigned char)s[patlen + 1] )) { + return TRUE; + } } - } - return FALSE; + return FALSE; } diff --git a/gnu/usr.bin/patch/pch.c b/gnu/usr.bin/patch/pch.c index 52790b9..7dee1a6 100644 --- a/gnu/usr.bin/patch/pch.c +++ b/gnu/usr.bin/patch/pch.c @@ -68,75 +68,80 @@ static LINENUM p_bfake = -1; /* beg of faked up lines */ void re_patch(void) { - p_first = Nulline; - p_newfirst = Nulline; - p_ptrn_lines = Nulline; - p_repl_lines = Nulline; - p_end = (LINENUM)-1; - p_max = Nulline; - p_indent = 0; + p_first = Nulline; + p_newfirst = Nulline; + p_ptrn_lines = Nulline; + p_repl_lines = Nulline; + p_end = (LINENUM)-1; + p_max = Nulline; + p_indent = 0; } -/* Open the patch file at the beginning of time. */ - +/* + * Open the patch file at the beginning of time. + */ void open_patch_file(char *filename) { - if (filename == Nullch || !*filename || strEQ(filename, "-")) { - pfp = fopen(TMPPATNAME, "w"); + if (filename == Nullch || !*filename || strEQ(filename, "-")) { + pfp = fopen(TMPPATNAME, "w"); + if (pfp == Nullfp) + pfatal2("can't create %s", TMPPATNAME); + while (fgets(buf, sizeof buf, stdin) != Nullch) + fputs(buf, pfp); + Fclose(pfp); + filename = TMPPATNAME; + } + pfp = fopen(filename, "r"); if (pfp == Nullfp) - pfatal2("can't create %s", TMPPATNAME); - while (fgets(buf, sizeof buf, stdin) != Nullch) - fputs(buf, pfp); - Fclose(pfp); - filename = TMPPATNAME; - } - pfp = fopen(filename, "r"); - if (pfp == Nullfp) - pfatal2("patch file %s not found", filename); - Fstat(fileno(pfp), &filestat); - p_filesize = filestat.st_size; - next_intuit_at(0L,1L); /* start at the beginning */ - set_hunkmax(); + pfatal2("patch file %s not found", filename); + Fstat(fileno(pfp), &filestat); + p_filesize = filestat.st_size; + next_intuit_at(0L,1L); /* start at the beginning */ + set_hunkmax(); } -/* Make sure our dynamically realloced tables are malloced to begin with. */ - +/* + * Make sure our dynamically realloced tables are malloced to begin with. + */ void set_hunkmax(void) { #ifndef lint - if (p_line == Null(char**)) - p_line = (char**) malloc((MEM)hunkmax * sizeof(char *)); - if (p_len == Null(short*)) - p_len = (short*) malloc((MEM)hunkmax * sizeof(short)); + if (p_line == Null(char**)) + p_line = (char**) malloc((MEM)hunkmax * sizeof(char *)); + if (p_len == Null(short*)) + p_len = (short*) malloc((MEM)hunkmax * sizeof(short)); #endif - if (p_Char == Nullch) - p_Char = (char*) malloc((MEM)hunkmax * sizeof(char)); + if (p_Char == Nullch) + p_Char = (char*) malloc((MEM)hunkmax * sizeof(char)); } -/* Enlarge the arrays containing the current hunk of patch. */ - +/* + * Enlarge the arrays containing the current hunk of patch. + */ void grow_hunkmax(void) { - hunkmax *= 2; - /* - * Note that on most systems, only the p_line array ever gets fresh memory - * since p_len can move into p_line's old space, and p_Char can move into - * p_len's old space. Not on PDP-11's however. But it doesn't matter. - */ - assert(p_line != Null(char**) && p_len != Null(short*) && p_Char != Nullch); + hunkmax *= 2; + /* + * Note that on most systems, only the p_line array ever gets + * fresh memory since p_len can move into p_line's old space, + * and p_Char can move into p_len's old space. Not on PDP-11's + * however. But it doesn't matter. + */ + assert(p_line != Null(char**) && p_len != Null(short*) && + p_Char != Nullch); #ifndef lint - p_line = (char**) realloc((char*)p_line, (MEM)hunkmax * sizeof(char *)); - p_len = (short*) realloc((char*)p_len, (MEM)hunkmax * sizeof(short)); - p_Char = (char*) realloc((char*)p_Char, (MEM)hunkmax * sizeof(char)); + p_line = (char**) realloc((char*)p_line, (MEM)hunkmax * sizeof(char *)); + p_len = (short*) realloc((char*)p_len, (MEM)hunkmax * sizeof(short)); + p_Char = (char*) realloc((char*)p_Char, (MEM)hunkmax * sizeof(char)); #endif - if (p_line != Null(char**) && p_len != Null(short*) && p_Char != Nullch) - return; - if (!using_plan_a) - fatal1("out of memory\n"); - out_of_mem = TRUE; /* whatever is null will be allocated again */ + if (p_line != Null(char**) && p_len != Null(short*) && p_Char != Nullch) + return; + if (!using_plan_a) + fatal1("out of memory\n"); + out_of_mem = TRUE; /* whatever is null will be allocated again */ /* from within plan_a(), of all places */ } @@ -146,62 +151,64 @@ grow_hunkmax(void) bool there_is_another_patch(void) { - if (p_base != 0L && p_base >= p_filesize) { - if (verbose) - say1("done\n"); - return FALSE; - } - if (verbose) - say1("Hmm..."); - diff_type = intuit_diff_type(); - if (!diff_type) { - if (p_base != 0L) { - if (verbose) - say1(" Ignoring the trailing garbage.\ndone\n"); - } - else - say1(" I can't seem to find a patch in there anywhere.\n"); - return FALSE; - } - if (verbose) - say3(" %sooks like %s to me...\n", - (p_base == 0L ? "L" : "The next patch l"), - diff_type == UNI_DIFF ? "a unified diff" : - diff_type == CONTEXT_DIFF ? "a context diff" : - diff_type == NEW_CONTEXT_DIFF ? "a new-style context diff" : - diff_type == NORMAL_DIFF ? "a normal diff" : - "an ed script" ); - if (p_indent && verbose) - say3("(Patch is indented %d space%s.)\n", p_indent, p_indent==1?"":"s"); - skip_to(p_start,p_sline); - while (filearg[0] == Nullch) { - if (force || batch || skip_rest_of_patch) { - say1("No file to patch. Skipping...\n"); - filearg[0] = savestr(bestguess); - skip_rest_of_patch = TRUE; - return TRUE; + if (p_base != 0L && p_base >= p_filesize) { + if (verbose) + say1("done\n"); + return FALSE; } - (void) ask1("File to patch: "); - if (*buf != '\n') { - if (bestguess) - free(bestguess); - bestguess = savestr(buf); - filearg[0] = fetchname(buf, 0, FALSE); + if (verbose) + say1("Hmm..."); + diff_type = intuit_diff_type(); + if (!diff_type) { + if (p_base != 0L) { + if (verbose) + say1(" Ignoring the trailing garbage.\ndone\n"); + } + else + say1(" I can't seem to find a patch in there anywhere.\n"); + return FALSE; } - if (filearg[0] == Nullch) { - if (ask1("No file found--skip this patch? [n] ")) { - if (*buf != 'y') { - continue; - } - } - if (verbose) - say1("Skipping patch...\n"); - filearg[0] = fetchname(bestguess, 0, TRUE); - skip_rest_of_patch = TRUE; - return TRUE; + if (verbose) + say3(" %sooks like %s to me...\n", + (p_base == 0L ? "L" : "The next patch l"), + diff_type == UNI_DIFF ? "a unified diff" : + diff_type == CONTEXT_DIFF ? "a context diff" : + diff_type == NEW_CONTEXT_DIFF ? + "a new-style context diff" : + diff_type == NORMAL_DIFF ? "a normal diff" : + "an ed script" ); + if (p_indent && verbose) + say3("(Patch is indented %d space%s.)\n", + p_indent, p_indent==1?"":"s"); + skip_to(p_start,p_sline); + while (filearg[0] == Nullch) { + if (force || batch || skip_rest_of_patch) { + say1("No file to patch. Skipping...\n"); + filearg[0] = savestr(bestguess); + skip_rest_of_patch = TRUE; + return TRUE; + } + (void) ask1("File to patch: "); + if (*buf != '\n') { + if (bestguess) + free(bestguess); + bestguess = savestr(buf); + filearg[0] = fetchname(buf, 0, FALSE); + } + if (filearg[0] == Nullch) { + if (ask1("No file found--skip this patch? [n] ")) { + if (*buf != 'y') { + continue; + } + } + if (verbose) + say1("Skipping patch...\n"); + filearg[0] = fetchname(bestguess, 0, TRUE); + skip_rest_of_patch = TRUE; + return TRUE; + } } - } - return TRUE; + return TRUE; } /* @@ -210,186 +217,198 @@ there_is_another_patch(void) int intuit_diff_type(void) { - Reg4 long this_line = 0; - Reg5 long previous_line; - Reg6 long first_command_line = -1; - long fcl_line; - Reg7 bool last_line_was_command = FALSE; - Reg8 bool this_is_a_command = FALSE; - Reg9 bool stars_last_line = FALSE; - Reg10 bool stars_this_line = FALSE; - Reg3 int indent; - Reg1 char *s; - Reg2 char *t; - char *indtmp = Nullch; - char *oldtmp = Nullch; - char *newtmp = Nullch; - char *indname = Nullch; - char *oldname = Nullch; - char *newname = Nullch; - Reg11 int retval; - bool no_filearg = (filearg[0] == Nullch); - extern int index_first; - - ok_to_create_file = FALSE; - Fseek(pfp, p_base, 0); - p_input_line = p_bline - 1; - for (;;) { - previous_line = this_line; - last_line_was_command = this_is_a_command; - stars_last_line = stars_this_line; - this_line = ftell(pfp); - indent = 0; - p_input_line++; - if (fgets(buf, sizeof buf, pfp) == Nullch) { - if (first_command_line >= 0L) { - /* nothing but deletes!? */ - p_start = first_command_line; - p_sline = fcl_line; - retval = ED_DIFF; - goto scan_exit; - } - else { - p_start = this_line; - p_sline = p_input_line; - retval = 0; - goto scan_exit; - } - } - for (s = buf; *s == ' ' || *s == '\t' || *s == 'X'; s++) { - if (*s == '\t') - indent += 8 - (indent % 8); - else - indent++; - } - for (t=s; isdigit((unsigned char)*t) || *t == ','; t++) ; - this_is_a_command = (isdigit((unsigned char)*s) && - (*t == 'd' || *t == 'c' || *t == 'a') ); - if (first_command_line < 0L && this_is_a_command) { - first_command_line = this_line; - fcl_line = p_input_line; - p_indent = indent; /* assume this for now */ - } - if (!stars_last_line && strnEQ(s, "*** ", 4)) - oldtmp = savestr(s+4); - else if (strnEQ(s, "--- ", 4)) - newtmp = savestr(s+4); - else if (strnEQ(s, "+++ ", 4)) - oldtmp = savestr(s+4); /* pretend it is the old name */ - else if (strnEQ(s, "Index:", 6)) - indtmp = savestr(s+6); - else if (strnEQ(s, "Prereq:", 7)) { - for (t=s+7; isspace((unsigned char)*t); t++) ; - revision = savestr(t); - for (t=revision; *t && !isspace((unsigned char)*t); t++) ; - *t = '\0'; - if (!*revision) { - free(revision); - revision = Nullch; - } - } - if ((!diff_type || diff_type == ED_DIFF) && - first_command_line >= 0L && - strEQ(s, ".\n") ) { - p_indent = indent; - p_start = first_command_line; - p_sline = fcl_line; - retval = ED_DIFF; - goto scan_exit; + Reg4 long this_line = 0; + Reg5 long previous_line; + Reg6 long first_command_line = -1; + long fcl_line; + Reg7 bool last_line_was_command = FALSE; + Reg8 bool this_is_a_command = FALSE; + Reg9 bool stars_last_line = FALSE; + Reg10 bool stars_this_line = FALSE; + Reg3 int indent; + Reg1 char *s; + Reg2 char *t; + char *indtmp = Nullch; + char *oldtmp = Nullch; + char *newtmp = Nullch; + char *indname = Nullch; + char *oldname = Nullch; + char *newname = Nullch; + Reg11 int retval; + bool no_filearg = (filearg[0] == Nullch); + extern int index_first; + + ok_to_create_file = FALSE; + Fseek(pfp, p_base, 0); + p_input_line = p_bline - 1; + for (;;) { + previous_line = this_line; + last_line_was_command = this_is_a_command; + stars_last_line = stars_this_line; + this_line = ftell(pfp); + indent = 0; + p_input_line++; + if (fgets(buf, sizeof buf, pfp) == Nullch) { + if (first_command_line >= 0L) { + /* nothing but deletes!? */ + p_start = first_command_line; + p_sline = fcl_line; + retval = ED_DIFF; + goto scan_exit; + } + else { + p_start = this_line; + p_sline = p_input_line; + retval = 0; + goto scan_exit; + } + } + for (s = buf; *s == ' ' || *s == '\t' || *s == 'X'; s++) { + if (*s == '\t') + indent += 8 - (indent % 8); + else + indent++; + } + for (t=s; isdigit((unsigned char)*t) || *t == ','; t++) + ; + this_is_a_command = (isdigit((unsigned char)*s) && + (*t == 'd' || *t == 'c' || *t == 'a') ); + if (first_command_line < 0L && this_is_a_command) { + first_command_line = this_line; + fcl_line = p_input_line; + p_indent = indent; /* assume this for now */ + } + if (!stars_last_line && strnEQ(s, "*** ", 4)) + oldtmp = savestr(s+4); + else if (strnEQ(s, "--- ", 4)) + newtmp = savestr(s+4); + else if (strnEQ(s, "+++ ", 4)) + oldtmp = savestr(s+4); /* pretend it is the old name */ + else if (strnEQ(s, "Index:", 6)) + indtmp = savestr(s+6); + else if (strnEQ(s, "Prereq:", 7)) { + for (t = s + 7; isspace((unsigned char)*t); t++) + ; + revision = savestr(t); + for (t = revision; *t && !isspace((unsigned char)*t); + t++) + ; + *t = '\0'; + if (!*revision) { + free(revision); + revision = Nullch; + } + } + if ((!diff_type || diff_type == ED_DIFF) && + first_command_line >= 0L && + strEQ(s, ".\n") ) { + p_indent = indent; + p_start = first_command_line; + p_sline = fcl_line; + retval = ED_DIFF; + goto scan_exit; + } + if ((!diff_type || diff_type == UNI_DIFF) && + strnEQ(s, "@@ -", 4)) { + if (!atol(s+3)) + ok_to_create_file = TRUE; + p_indent = indent; + p_start = this_line; + p_sline = p_input_line; + retval = UNI_DIFF; + goto scan_exit; + } + stars_this_line = strnEQ(s, "********", 8); + if ((!diff_type || diff_type == CONTEXT_DIFF) && + stars_last_line && + strnEQ(s, "*** ", 4)) { + if (!atol(s+4)) + ok_to_create_file = TRUE; + /* + * If this is a new context diff the character just + * before the newline is a '*'. + */ + while (*s != '\n') + s++; + p_indent = indent; + p_start = previous_line; + p_sline = p_input_line - 1; + retval = (*(s-1) == '*' ? + NEW_CONTEXT_DIFF : CONTEXT_DIFF); + goto scan_exit; + } + if ((!diff_type || diff_type == NORMAL_DIFF) && + last_line_was_command && + (strnEQ(s, "< ", 2) || strnEQ(s, "> ", 2)) ) { + p_start = previous_line; + p_sline = p_input_line - 1; + p_indent = indent; + retval = NORMAL_DIFF; + goto scan_exit; + } } - if ((!diff_type || diff_type == UNI_DIFF) && strnEQ(s, "@@ -", 4)) { - if (!atol(s+3)) - ok_to_create_file = TRUE; - p_indent = indent; - p_start = this_line; - p_sline = p_input_line; - retval = UNI_DIFF; - goto scan_exit; + scan_exit: + if (no_filearg) { + if (indtmp != Nullch) + indname = fetchname(indtmp, strippath, + ok_to_create_file); + if (oldtmp != Nullch) + oldname = fetchname(oldtmp, strippath, + ok_to_create_file); + if (newtmp != Nullch) + newname = fetchname(newtmp, strippath, + ok_to_create_file); + if (index_first && indname) + filearg[0] = savestr(indname); + else if (oldname && newname) { + if (strlen(oldname) < strlen(newname)) + filearg[0] = savestr(oldname); + else + filearg[0] = savestr(newname); + } else if (indname) + filearg[0] = savestr(indname); + else if (oldname) + filearg[0] = savestr(oldname); + else if (newname) + filearg[0] = savestr(newname); } - stars_this_line = strnEQ(s, "********", 8); - if ((!diff_type || diff_type == CONTEXT_DIFF) && stars_last_line && - strnEQ(s, "*** ", 4)) { - if (!atol(s+4)) - ok_to_create_file = TRUE; - /* if this is a new context diff the character just before */ - /* the newline is a '*'. */ - while (*s != '\n') - s++; - p_indent = indent; - p_start = previous_line; - p_sline = p_input_line - 1; - retval = (*(s-1) == '*' ? NEW_CONTEXT_DIFF : CONTEXT_DIFF); - goto scan_exit; + if (bestguess) { + free(bestguess); + bestguess = Nullch; } - if ((!diff_type || diff_type == NORMAL_DIFF) && - last_line_was_command && - (strnEQ(s, "< ", 2) || strnEQ(s, "> ", 2)) ) { - p_start = previous_line; - p_sline = p_input_line - 1; - p_indent = indent; - retval = NORMAL_DIFF; - goto scan_exit; + if (filearg[0] != Nullch) + bestguess = savestr(filearg[0]); + else if (indtmp != Nullch) + bestguess = fetchname(indtmp, strippath, TRUE); + else { + if (oldtmp != Nullch) + oldname = fetchname(oldtmp, strippath, TRUE); + if (newtmp != Nullch) + newname = fetchname(newtmp, strippath, TRUE); + if (oldname && newname) { + if (strlen(oldname) < strlen(newname)) + bestguess = savestr(oldname); + else + bestguess = savestr(newname); + } + else if (oldname) + bestguess = savestr(oldname); + else if (newname) + bestguess = savestr(newname); } - } - scan_exit: - if (no_filearg) { if (indtmp != Nullch) - indname = fetchname(indtmp, strippath, ok_to_create_file); - if (oldtmp != Nullch) - oldname = fetchname(oldtmp, strippath, ok_to_create_file); - if (newtmp != Nullch) - newname = fetchname(newtmp, strippath, ok_to_create_file); - if (index_first && indname) - filearg[0] = savestr(indname); - else if (oldname && newname) { - if (strlen(oldname) < strlen(newname)) - filearg[0] = savestr(oldname); - else - filearg[0] = savestr(newname); - } else if (indname) - filearg[0] = savestr(indname); - else if (oldname) - filearg[0] = savestr(oldname); - else if (newname) - filearg[0] = savestr(newname); - } - if (bestguess) { - free(bestguess); - bestguess = Nullch; - } - if (filearg[0] != Nullch) - bestguess = savestr(filearg[0]); - else if (indtmp != Nullch) - bestguess = fetchname(indtmp, strippath, TRUE); - else { + free(indtmp); if (oldtmp != Nullch) - oldname = fetchname(oldtmp, strippath, TRUE); + free(oldtmp); if (newtmp != Nullch) - newname = fetchname(newtmp, strippath, TRUE); - if (oldname && newname) { - if (strlen(oldname) < strlen(newname)) - bestguess = savestr(oldname); - else - bestguess = savestr(newname); - } - else if (oldname) - bestguess = savestr(oldname); - else if (newname) - bestguess = savestr(newname); - } - if (indtmp != Nullch) - free(indtmp); - if (oldtmp != Nullch) - free(oldtmp); - if (newtmp != Nullch) - free(newtmp); - if (indname != Nullch) - free(indname); - if (oldname != Nullch) - free(oldname); - if (newname != Nullch) - free(newname); - return retval; + free(newtmp); + if (indname != Nullch) + free(indname); + if (oldname != Nullch) + free(oldname); + if (newname != Nullch) + free(newname); + return retval; } /* @@ -398,8 +417,8 @@ intuit_diff_type(void) void next_intuit_at(long file_pos, long file_line) { - p_base = file_pos; - p_bline = file_line; + p_base = file_pos; + p_bline = file_line; } /* @@ -408,29 +427,31 @@ next_intuit_at(long file_pos, long file_line) void skip_to(long file_pos, long file_line) { - char *ret; - - assert(p_base <= file_pos); - if (verbose && p_base < file_pos) { - Fseek(pfp, p_base, 0); - say1("The text leading up to this was:\n--------------------------\n"); - while (ftell(pfp) < file_pos) { - ret = fgets(buf, sizeof buf, pfp); - assert(ret != Nullch); - say2("|%s", buf); + char *ret; + + assert(p_base <= file_pos); + if (verbose && p_base < file_pos) { + Fseek(pfp, p_base, 0); + say1("The text leading up to this was:\n--------------------------\n"); + while (ftell(pfp) < file_pos) { + ret = fgets(buf, sizeof buf, pfp); + assert(ret != Nullch); + say2("|%s", buf); + } + say1("--------------------------\n"); } - say1("--------------------------\n"); - } - else - Fseek(pfp, file_pos, 0); - p_input_line = file_line - 1; + else + Fseek(pfp, file_pos, 0); + p_input_line = file_line - 1; } -/* Make this a function for better debugging. */ +/* + * Make this a function for better debugging. + */ static void malformed(void) { - fatal3("malformed patch at line %ld: %s", p_input_line, buf); + fatal3("malformed patch at line %ld: %s", p_input_line, buf); /* about as informative as "Syntax error" in C */ } @@ -458,8 +479,9 @@ remove_special_line(void) return FALSE; } -/* True if there is more of the current diff listing to process. */ - +/* + * True if there is more of the current diff listing to process. + */ bool another_hunk(void) { @@ -915,7 +937,7 @@ another_hunk(void) break; case '=': ch = ' '; - /* FALL THROUGH */ + /* FALLTHROUGH */ case ' ': if (fillsrc > p_ptrn_lines) { free(s); @@ -935,7 +957,7 @@ another_hunk(void) p_end = fillsrc-1; return FALSE; } - /* FALL THROUGH */ + /* FALLTHROUGH */ case '+': if (filldst > p_end) { free(s); @@ -1101,129 +1123,129 @@ another_hunk(void) char * pgets(char *bf, int sz, FILE *fp) { - char *ret = fgets(bf, sz, fp); - Reg1 char *s; - Reg2 int indent = 0; - - if (p_indent && ret != Nullch) { - for (s=buf; - indent < p_indent && (*s == ' ' || *s == '\t' || *s == 'X'); s++) { - if (*s == '\t') - indent += 8 - (indent % 7); - else - indent++; + char *ret = fgets(bf, sz, fp); + Reg1 char *s; + Reg2 int indent = 0; + + if (p_indent && ret != Nullch) { + for (s=buf; + indent < p_indent && (*s == ' ' || *s == '\t' || *s == 'X'); + s++) { + if (*s == '\t') + indent += 8 - (indent % 7); + else + indent++; + } + if (buf != s) + Strcpy(buf, s); } - if (buf != s) - Strcpy(buf, s); - } - return ret; + return ret; } - /* * Reverse the old and new portions of the current hunk. */ bool pch_swap(void) { - char **tp_line; /* the text of the hunk */ - short *tp_len; /* length of each line */ - char *tp_char; /* +, -, and ! */ - Reg1 LINENUM i; - Reg2 LINENUM n; - bool blankline = FALSE; - Reg3 char *s; - - i = p_first; - p_first = p_newfirst; - p_newfirst = i; - - /* make a scratch copy */ - - tp_line = p_line; - tp_len = p_len; - tp_char = p_Char; - p_line = Null(char**); /* force set_hunkmax to allocate again */ - p_len = Null(short*); - p_Char = Nullch; - set_hunkmax(); - if (p_line == Null(char**) || p_len == Null(short*) || p_Char == Nullch) { + char **tp_line; /* the text of the hunk */ + short *tp_len; /* length of each line */ + char *tp_char; /* +, -, and ! */ + Reg1 LINENUM i; + Reg2 LINENUM n; + bool blankline = FALSE; + Reg3 char *s; + + i = p_first; + p_first = p_newfirst; + p_newfirst = i; + + /* make a scratch copy */ + + tp_line = p_line; + tp_len = p_len; + tp_char = p_Char; + p_line = Null(char**); /* force set_hunkmax to allocate again */ + p_len = Null(short*); + p_Char = Nullch; + set_hunkmax(); + if (p_line == Null(char**) || p_len == Null(short*) || p_Char == Nullch) { #ifndef lint - if (p_line == Null(char**)) - free((char*)p_line); - p_line = tp_line; - if (p_len == Null(short*)) - free((char*)p_len); - p_len = tp_len; + if (p_line == Null(char**)) + free((char*)p_line); + p_line = tp_line; + if (p_len == Null(short*)) + free((char*)p_len); + p_len = tp_len; #endif - if (p_Char == Nullch) - free((char*)p_Char); - p_Char = tp_char; - return FALSE; /* not enough memory to swap hunk! */ - } + if (p_Char == Nullch) + free((char*)p_Char); + p_Char = tp_char; + return FALSE; /* not enough memory to swap hunk! */ + } - /* now turn the new into the old */ + /* now turn the new into the old */ - i = p_ptrn_lines + 1; - if (tp_char[i] == '\n') { /* account for possible blank line */ - blankline = TRUE; - i++; - } - if (p_efake >= 0) { /* fix non-freeable ptr range */ - if (p_efake <= i) - n = p_end - i + 1; - else - n = -i; - p_efake += n; - p_bfake += n; - } - for (n=0; i <= p_end; i++,n++) { - p_line[n] = tp_line[i]; - p_Char[n] = tp_char[i]; - if (p_Char[n] == '+') - p_Char[n] = '-'; - p_len[n] = tp_len[i]; - } - if (blankline) { i = p_ptrn_lines + 1; - p_line[n] = tp_line[i]; - p_Char[n] = tp_char[i]; - p_len[n] = tp_len[i]; - n++; - } - assert(p_Char[0] == '='); - p_Char[0] = '*'; - for (s=p_line[0]; *s; s++) - if (*s == '-') - *s = '*'; - - /* now turn the old into the new */ - - assert(tp_char[0] == '*'); - tp_char[0] = '='; - for (s=tp_line[0]; *s; s++) - if (*s == '*') - *s = '-'; - for (i=0; n <= p_end; i++,n++) { - p_line[n] = tp_line[i]; - p_Char[n] = tp_char[i]; - if (p_Char[n] == '-') - p_Char[n] = '+'; - p_len[n] = tp_len[i]; - } - assert(i == p_ptrn_lines + 1); - i = p_ptrn_lines; - p_ptrn_lines = p_repl_lines; - p_repl_lines = i; + if (tp_char[i] == '\n') { /* account for possible blank line */ + blankline = TRUE; + i++; + } + if (p_efake >= 0) { /* fix non-freeable ptr range */ + if (p_efake <= i) + n = p_end - i + 1; + else + n = -i; + p_efake += n; + p_bfake += n; + } + for (n=0; i <= p_end; i++,n++) { + p_line[n] = tp_line[i]; + p_Char[n] = tp_char[i]; + if (p_Char[n] == '+') + p_Char[n] = '-'; + p_len[n] = tp_len[i]; + } + if (blankline) { + i = p_ptrn_lines + 1; + p_line[n] = tp_line[i]; + p_Char[n] = tp_char[i]; + p_len[n] = tp_len[i]; + n++; + } + assert(p_Char[0] == '='); + p_Char[0] = '*'; + for (s=p_line[0]; *s; s++) + if (*s == '-') + *s = '*'; + + /* now turn the old into the new */ + + assert(tp_char[0] == '*'); + tp_char[0] = '='; + for (s=tp_line[0]; *s; s++) + if (*s == '*') + *s = '-'; + for (i=0; n <= p_end; i++,n++) { + p_line[n] = tp_line[i]; + p_Char[n] = tp_char[i]; + if (p_Char[n] == '-') + p_Char[n] = '+'; + p_len[n] = tp_len[i]; + } + assert(i == p_ptrn_lines + 1); + i = p_ptrn_lines; + p_ptrn_lines = p_repl_lines; + p_repl_lines = i; #ifndef lint - if (tp_line == Null(char**)) - free((char*)tp_line); - if (tp_len == Null(short*)) - free((char*)tp_len); + if (tp_line == Null(char**)) + free((char*)tp_line); + if (tp_len == Null(short*)) + free((char*)tp_len); #endif - if (tp_char == Nullch) - free((char*)tp_char); - return TRUE; + if (tp_char == Nullch) + free((char*)tp_char); + return TRUE; } /* @@ -1232,7 +1254,7 @@ pch_swap(void) LINENUM pch_first(void) { - return p_first; + return p_first; } /* @@ -1241,7 +1263,7 @@ pch_first(void) LINENUM pch_ptrn_lines(void) { - return p_ptrn_lines; + return p_ptrn_lines; } /* @@ -1250,7 +1272,7 @@ pch_ptrn_lines(void) LINENUM pch_newfirst(void) { - return p_newfirst; + return p_newfirst; } /* @@ -1259,7 +1281,7 @@ pch_newfirst(void) LINENUM pch_repl_lines(void) { - return p_repl_lines; + return p_repl_lines; } /* @@ -1268,7 +1290,7 @@ pch_repl_lines(void) LINENUM pch_end(void) { - return p_end; + return p_end; } /* @@ -1277,7 +1299,7 @@ pch_end(void) LINENUM pch_context(void) { - return p_context; + return p_context; } /* @@ -1286,7 +1308,7 @@ pch_context(void) short pch_line_len(LINENUM line) { - return p_len[line]; + return p_len[line]; } /* @@ -1295,7 +1317,7 @@ pch_line_len(LINENUM line) char pch_char(LINENUM line) { - return p_Char[line]; + return p_Char[line]; } /* @@ -1304,7 +1326,7 @@ pch_char(LINENUM line) char * pfetch(LINENUM line) { - return p_line[line]; + return p_line[line]; } /* @@ -1313,7 +1335,7 @@ pfetch(LINENUM line) LINENUM pch_hunk_beg(void) { - return p_hunk_beg; + return p_hunk_beg; } /* @@ -1322,60 +1344,61 @@ pch_hunk_beg(void) void do_ed_script(void) { - Reg1 char *t; - Reg2 long beginning_of_this_line; - Reg3 bool this_line_is_command = FALSE; - Reg4 FILE *pipefp; - - if (!skip_rest_of_patch) { - Unlink(TMPOUTNAME); - copy_file(filearg[0], TMPOUTNAME); - if (verbose) - Sprintf(buf, "/bin/ed %s", TMPOUTNAME); - else - Sprintf(buf, "/bin/ed - %s", TMPOUTNAME); - pipefp = popen(buf, "w"); - } - for (;;) { - beginning_of_this_line = ftell(pfp); - if (pgets(buf, sizeof buf, pfp) == Nullch) { - next_intuit_at(beginning_of_this_line,p_input_line); - break; + Reg1 char *t; + Reg2 long beginning_of_this_line; + Reg3 bool this_line_is_command = FALSE; + Reg4 FILE *pipefp; + + if (!skip_rest_of_patch) { + Unlink(TMPOUTNAME); + copy_file(filearg[0], TMPOUTNAME); + if (verbose) + Sprintf(buf, "/bin/ed %s", TMPOUTNAME); + else + Sprintf(buf, "/bin/ed - %s", TMPOUTNAME); + pipefp = popen(buf, "w"); } - p_input_line++; - for (t=buf; isdigit((unsigned char)*t) || *t == ','; t++) ; - this_line_is_command = (isdigit((unsigned char)*buf) && - (*t == 'd' || *t == 'c' || *t == 'a') ); - if (this_line_is_command) { - if (!skip_rest_of_patch) - fputs(buf, pipefp); - if (*t != 'd') { - while (pgets(buf, sizeof buf, pfp) != Nullch) { - p_input_line++; - if (!skip_rest_of_patch) - fputs(buf, pipefp); - if (strEQ(buf, ".\n")) + for (;;) { + beginning_of_this_line = ftell(pfp); + if (pgets(buf, sizeof buf, pfp) == Nullch) { + next_intuit_at(beginning_of_this_line, p_input_line); + break; + } + p_input_line++; + for (t=buf; isdigit((unsigned char)*t) || *t == ','; t++) + ; + this_line_is_command = (isdigit((unsigned char)*buf) && + (*t == 'd' || *t == 'c' || *t == 'a') ); + if (this_line_is_command) { + if (!skip_rest_of_patch) + fputs(buf, pipefp); + if (*t != 'd') { + while (pgets(buf, sizeof buf, pfp) != Nullch) { + p_input_line++; + if (!skip_rest_of_patch) + fputs(buf, pipefp); + if (strEQ(buf, ".\n")) + break; + } + } + } + else { + next_intuit_at(beginning_of_this_line,p_input_line); break; } - } } - else { - next_intuit_at(beginning_of_this_line,p_input_line); - break; + if (skip_rest_of_patch) + return; + fprintf(pipefp, "w\n"); + fprintf(pipefp, "q\n"); + Fflush(pipefp); + Pclose(pipefp); + ignore_signals(); + if (move_file(TMPOUTNAME, outname) < 0) { + toutkeep = TRUE; + chmod(TMPOUTNAME, filemode); } - } - if (skip_rest_of_patch) - return; - fprintf(pipefp, "w\n"); - fprintf(pipefp, "q\n"); - Fflush(pipefp); - Pclose(pipefp); - ignore_signals(); - if (move_file(TMPOUTNAME, outname) < 0) { - toutkeep = TRUE; - chmod(TMPOUTNAME, filemode); - } - else - chmod(outname, filemode); - set_signals(1); + else + chmod(outname, filemode); + set_signals(1); } diff --git a/gnu/usr.bin/patch/util.c b/gnu/usr.bin/patch/util.c index 175952c..b6e6652 100644 --- a/gnu/usr.bin/patch/util.c +++ b/gnu/usr.bin/patch/util.c @@ -25,154 +25,165 @@ private_strerror (errnum) #define strerror private_strerror #endif /* !HAVE_STRERROR */ -/* Rename a file, copying it if necessary. */ - +/* + * Rename a file, copying it if necessary. + */ int move_file(char *from, char *to) { - char bakname[512]; - Reg1 char *s; - Reg2 int i; - Reg3 int fromfd; + char bakname[512]; + Reg1 char *s; + Reg2 int i; + Reg3 int fromfd; - /* to stdout? */ + /* to stdout? */ - if (strEQ(to, "-")) { + if (strEQ(to, "-")) { #ifdef DEBUGGING - if (debug & 4) - say2("Moving %s to stdout.\n", from); + if (debug & 4) + say2("Moving %s to stdout.\n", from); #endif - fromfd = open(from, 0); - if (fromfd < 0) - pfatal2("internal error, can't reopen %s", from); - while ((i=read(fromfd, buf, sizeof buf)) > 0) - if (write(1, buf, i) != 1) - pfatal1("write failed"); - Close(fromfd); - return 0; - } + fromfd = open(from, 0); + if (fromfd < 0) + pfatal2("internal error, can't reopen %s", from); + while ((i = read(fromfd, buf, sizeof buf)) > 0) + if (write(1, buf, i) != 1) + pfatal1("write failed"); + Close(fromfd); + return 0; + } - if (origprae) { - Strcpy(bakname, origprae); - Strcat(bakname, to); - } else { + if (origprae) { + Strcpy(bakname, origprae); + Strcat(bakname, to); + } else { #ifndef NODIR - char *backupname = find_backup_file_name(to); - if (backupname == (char *) 0) - fatal1("out of memory\n"); - Strcpy(bakname, backupname); - free(backupname); + char *backupname = find_backup_file_name(to); + if (backupname == (char *) 0) + fatal1("out of memory\n"); + Strcpy(bakname, backupname); + free(backupname); #else /* NODIR */ - Strcpy(bakname, to); - Strcat(bakname, simple_backup_suffix); + Strcpy(bakname, to); + Strcat(bakname, simple_backup_suffix); #endif /* NODIR */ - } - - if (stat(to, &filestat) == 0) { /* output file exists */ - dev_t to_device = filestat.st_dev; - ino_t to_inode = filestat.st_ino; - char *simplename = bakname; - - for (s=bakname; *s; s++) { - if (*s == '/') - simplename = s+1; } - /* Find a backup name that is not the same file. - Change the first lowercase char into uppercase; - if that isn't sufficient, chop off the first char and try again. */ - while (stat(bakname, &filestat) == 0 && - to_device == filestat.st_dev && to_inode == filestat.st_ino) { - /* Skip initial non-lowercase chars. */ - for (s=simplename; *s && !islower((unsigned char)*s); s++) ; - if (*s) - *s = toupper((unsigned char)*s); - else - Strcpy(simplename, simplename+1); - } - while (unlink(bakname) >= 0) ; /* while() is for benefit of Eunice */ + + if (stat(to, &filestat) == 0) { /* output file exists */ + dev_t to_device = filestat.st_dev; + ino_t to_inode = filestat.st_ino; + char *simplename = bakname; + + for (s = bakname; *s; s++) { + if (*s == '/') + simplename = s + 1; + } + /* + * Find a backup name that is not the same file. + * Change the first lowercase char into uppercase; + * if that isn't sufficient, chop off the first char + * and try again. + */ + while (stat(bakname, &filestat) == 0 && + to_device == filestat.st_dev && + to_inode == filestat.st_ino) { + /* Skip initial non-lowercase chars. */ + for (s=simplename; *s && !islower((unsigned char)*s); + s++) + ; + if (*s) + *s = toupper((unsigned char)*s); + else + Strcpy(simplename, simplename + 1); + } + while (unlink(bakname) >= 0) + ; /* while() is for benefit of Eunice */ #ifdef DEBUGGING - if (debug & 4) - say3("Moving %s to %s.\n", to, bakname); + if (debug & 4) + say3("Moving %s to %s.\n", to, bakname); #endif - if (rename(to, bakname) < 0) { - say4("Can't backup %s, output is in %s: %s\n", to, from, - strerror(errno)); - return -1; + if (rename(to, bakname) < 0) { + say4("Can't backup %s, output is in %s: %s\n", to, from, + strerror(errno)); + return -1; + } + while (unlink(to) >= 0) + ; } - while (unlink(to) >= 0) ; - } #ifdef DEBUGGING - if (debug & 4) - say3("Moving %s to %s.\n", from, to); + if (debug & 4) + say3("Moving %s to %s.\n", from, to); #endif - if (rename(from, to) < 0) { /* different file system? */ - Reg4 int tofd; - - tofd = creat(to, 0666); - if (tofd < 0) { - say4("Can't create %s, output is in %s: %s\n", - to, from, strerror(errno)); - return -1; + if (rename(from, to) < 0) { /* different file system? */ + Reg4 int tofd; + + tofd = creat(to, 0666); + if (tofd < 0) { + say4("Can't create %s, output is in %s: %s\n", + to, from, strerror(errno)); + return -1; + } + fromfd = open(from, 0); + if (fromfd < 0) + pfatal2("internal error, can't reopen %s", from); + while ((i = read(fromfd, buf, sizeof buf)) > 0) + if (write(tofd, buf, i) != i) + pfatal1("write failed"); + Close(fromfd); + Close(tofd); } - fromfd = open(from, 0); - if (fromfd < 0) - pfatal2("internal error, can't reopen %s", from); - while ((i=read(fromfd, buf, sizeof buf)) > 0) - if (write(tofd, buf, i) != i) - pfatal1("write failed"); - Close(fromfd); - Close(tofd); - } - Unlink(from); - return 0; + Unlink(from); + return 0; } -/* Copy a file. */ - +/* + * Copy a file. + */ void copy_file(char *from, char *to) { - Reg3 int tofd; - Reg2 int fromfd; - Reg1 int i; - - tofd = creat(to, 0666); - if (tofd < 0) - pfatal2("can't create %s", to); - fromfd = open(from, 0); - if (fromfd < 0) - pfatal2("internal error, can't reopen %s", from); - while ((i=read(fromfd, buf, sizeof buf)) > 0) - if (write(tofd, buf, i) != i) - pfatal2("write to %s failed", to); - Close(fromfd); - Close(tofd); -} + Reg3 int tofd; + Reg2 int fromfd; + Reg1 int i; -/* Allocate a unique area for a string. */ + tofd = creat(to, 0666); + if (tofd < 0) + pfatal2("can't create %s", to); + fromfd = open(from, 0); + if (fromfd < 0) + pfatal2("internal error, can't reopen %s", from); + while ((i = read(fromfd, buf, sizeof buf)) > 0) + if (write(tofd, buf, i) != i) + pfatal2("write to %s failed", to); + Close(fromfd); + Close(tofd); +} +/* + * Allocate a unique area for a string. + */ char * savestr(char *s) { - Reg3 char *rv; - Reg2 char *t; - - if (!s) - s = "Oops"; - t = s; - while (*t++); - rv = malloc((MEM) (t - s)); - if (rv == Nullch) { - if (using_plan_a) - out_of_mem = TRUE; - else - fatal1("out of memory\n"); - } - else { - t = rv; - while ((*t++ = *s++)); - } - return rv; + Reg3 char *rv; + Reg2 char *t; + + if (!s) + s = "Oops"; + t = s; + while (*t++) + ; + rv = malloc((MEM) (t - s)); + if (rv == Nullch) { + if (using_plan_a) + out_of_mem = TRUE; + else + fatal1("out of memory\n"); + } else { + t = rv; + while ((*t++ = *s++)); + } + return rv; } #if defined(lint) && defined(CANVARARG) @@ -188,249 +199,260 @@ ask(pat) char *pat; { ; } #else -/* Vanilla terminal output (buffered). */ - +/* + * Vanilla terminal output (buffered). + */ void say(pat,arg1,arg2,arg3) char *pat; long arg1,arg2,arg3; { - fprintf(stderr, pat, arg1, arg2, arg3); - Fflush(stderr); + fprintf(stderr, pat, arg1, arg2, arg3); + Fflush(stderr); } -/* Terminal output, pun intended. */ - +/* + * Terminal output, pun intended. + */ void /* very void */ fatal(pat,arg1,arg2,arg3) char *pat; long arg1,arg2,arg3; { - fprintf(stderr, "patch: **** "); - fprintf(stderr, pat, arg1, arg2, arg3); - my_exit(1); + fprintf(stderr, "patch: **** "); + fprintf(stderr, pat, arg1, arg2, arg3); + my_exit(1); } -/* Say something from patch, something from the system, then silence . . . */ - +/* + * Say something from patch, something from the system, then silence... + */ void /* very void */ pfatal(pat,arg1,arg2,arg3) char *pat; long arg1,arg2,arg3; { - int errnum = errno; + int errnum = errno; - fprintf(stderr, "patch: **** "); - fprintf(stderr, pat, arg1, arg2, arg3); - fprintf(stderr, ": %s\n", strerror(errnum)); - my_exit(1); + fprintf(stderr, "patch: **** "); + fprintf(stderr, pat, arg1, arg2, arg3); + fprintf(stderr, ": %s\n", strerror(errnum)); + my_exit(1); } -/* Get a response from the user, somehow or other. */ - +/* + * Get a response from the user, somehow or other. + */ int ask(pat,arg1,arg2,arg3) char *pat; long arg1,arg2,arg3; { - int ttyfd; - int r; - bool tty2 = isatty(2); - - Sprintf(buf, pat, arg1, arg2, arg3); - Fflush(stderr); - write(2, buf, strlen(buf)); - if (tty2) { /* might be redirected to a file */ - r = read(2, buf, sizeof buf); - } - else if (isatty(1)) { /* this may be new file output */ - Fflush(stdout); - write(1, buf, strlen(buf)); - r = read(1, buf, sizeof buf); - } - else if ((ttyfd = open(_PATH_TTY, 2)) >= 0 && isatty(ttyfd)) { + int ttyfd; + int r; + bool tty2 = isatty(2); + + Sprintf(buf, pat, arg1, arg2, arg3); + Fflush(stderr); + write(2, buf, strlen(buf)); + if (tty2) { /* might be redirected to a file */ + r = read(2, buf, sizeof buf); + } else if (isatty(1)) { /* this may be new file output */ + Fflush(stdout); + write(1, buf, strlen(buf)); + r = read(1, buf, sizeof buf); + } else if ((ttyfd = open(_PATH_TTY, 2)) >= 0 && isatty(ttyfd)) { /* might be deleted or unwriteable */ - write(ttyfd, buf, strlen(buf)); - r = read(ttyfd, buf, sizeof buf); - Close(ttyfd); - } - else if (isatty(0)) { /* this is probably patch input */ - Fflush(stdin); - write(0, buf, strlen(buf)); - r = read(0, buf, sizeof buf); - } - else { /* no terminal at all--default it */ - buf[0] = '\n'; - buf[1] = 0; - say1(buf); - return 0; /* signal possible error */ - } - if (r <= 0) - buf[0] = 0; - else - buf[r] = '\0'; - if (!tty2) - say1(buf); - - if (r <= 0) - return 0; /* if there was an error, return it */ - else - return 1; + write(ttyfd, buf, strlen(buf)); + r = read(ttyfd, buf, sizeof buf); + Close(ttyfd); + } else if (isatty(0)) { /* this is probably patch input */ + Fflush(stdin); + write(0, buf, strlen(buf)); + r = read(0, buf, sizeof buf); + } else { /* no terminal at all--default it */ + buf[0] = '\n'; + buf[1] = 0; + say1(buf); + return 0; /* signal possible error */ + } + if (r <= 0) + buf[0] = 0; + else + buf[r] = '\0'; + if (!tty2) + say1(buf); + + if (r <= 0) + return 0; /* if there was an error, return it */ + else + return 1; } #endif /* lint */ -/* How to handle certain events when not in a critical region. */ - +/* + * How to handle certain events when not in a critical region. + */ void set_signals(int reset) { #ifndef lint - static RETSIGTYPE (*hupval)(),(*intval)(); - - if (!reset) { - hupval = signal(SIGHUP, SIG_IGN); - if (hupval != SIG_IGN) - hupval = (RETSIGTYPE(*)())my_exit; - intval = signal(SIGINT, SIG_IGN); - if (intval != SIG_IGN) - intval = (RETSIGTYPE(*)())my_exit; - } - Signal(SIGHUP, hupval); - Signal(SIGINT, intval); + static RETSIGTYPE (*hupval)(),(*intval)(); + + if (!reset) { + hupval = signal(SIGHUP, SIG_IGN); + if (hupval != SIG_IGN) + hupval = (RETSIGTYPE(*)())my_exit; + intval = signal(SIGINT, SIG_IGN); + if (intval != SIG_IGN) + intval = (RETSIGTYPE(*)())my_exit; + } + Signal(SIGHUP, hupval); + Signal(SIGINT, intval); #endif } -/* How to handle certain events when in a critical region. */ - +/* + * How to handle certain events when in a critical region. + */ void ignore_signals(void) { #ifndef lint - Signal(SIGHUP, SIG_IGN); - Signal(SIGINT, SIG_IGN); + Signal(SIGHUP, SIG_IGN); + Signal(SIGINT, SIG_IGN); #endif } -/* Make sure we'll have the directories to create a file. - If `striplast' is TRUE, ignore the last element of `filename'. */ - +/* + * Make sure we'll have the directories to create a file. + * If `striplast' is TRUE, ignore the last element of `filename'. + */ void makedirs(filename,striplast) Reg1 char *filename; bool striplast; { - char tmpbuf[256]; - Reg2 char *s = tmpbuf; - char *dirv[20]; /* Point to the NULs between elements. */ - Reg3 int i; - Reg4 int dirvp = 0; /* Number of finished entries in dirv. */ - - /* Copy `filename' into `tmpbuf' with a NUL instead of a slash - between the directories. */ - while (*filename) { - if (*filename == '/') { - filename++; - dirv[dirvp++] = s; - *s++ = '\0'; + char tmpbuf[256]; + Reg2 char *s = tmpbuf; + char *dirv[20]; /* Point to the NULs between elements. */ + Reg3 int i; + Reg4 int dirvp = 0; /* Number of finished entries in dirv. */ + + /* + * Copy `filename' into `tmpbuf' with a NUL instead of a slash + * between the directories. + */ + while (*filename) { + if (*filename == '/') { + filename++; + dirv[dirvp++] = s; + *s++ = '\0'; + } else { + *s++ = *filename++; + } } - else { - *s++ = *filename++; + *s = '\0'; + dirv[dirvp] = s; + if (striplast) + dirvp--; + if (dirvp < 0) + return; + + strcpy(buf, "mkdir"); + s = buf; + for (i = 0; i <= dirvp; i++) { + struct stat sbuf; + + if (stat(tmpbuf, &sbuf) && errno == ENOENT) { + while (*s) + s++; + *s++ = ' '; + strcpy(s, tmpbuf); + } + *dirv[i] = '/'; } - } - *s = '\0'; - dirv[dirvp] = s; - if (striplast) - dirvp--; - if (dirvp < 0) - return; - - strcpy(buf, "mkdir"); - s = buf; - for (i=0; i<=dirvp; i++) { - struct stat sbuf; - - if (stat(tmpbuf, &sbuf) && errno == ENOENT) { - while (*s) s++; - *s++ = ' '; - strcpy(s, tmpbuf); - } - *dirv[i] = '/'; - } - if (s != buf) - system(buf); + if (s != buf) + system(buf); } -/* Make filenames more reasonable. */ - +/* + * Make filenames more reasonable. + */ char * fetchname(char *at, int strip_leading, int assume_exists) { - char *fullname; - char *name; - Reg1 char *t; - char tmpbuf[200]; - int sleading = strip_leading; - - if (!at) - return Nullch; - while (isspace((unsigned char)*at)) - at++; + char *fullname; + char *name; + Reg1 char *t; + char tmpbuf[200]; + int sleading = strip_leading; + + if (!at) + return Nullch; + while (isspace((unsigned char)*at)) + at++; #ifdef DEBUGGING - if (debug & 128) - say4("fetchname %s %d %d\n",at,strip_leading,assume_exists); + if (debug & 128) + say4("fetchname %s %d %d\n",at,strip_leading,assume_exists); #endif - if (strnEQ(at, _PATH_DEVNULL, sizeof _PATH_DEVNULL - 1)) /* so files can be created by diffing */ - return Nullch; /* against /dev/null. */ - name = fullname = t = savestr(at); - - /* Strip off up to `sleading' leading slashes and null terminate. */ - for (; *t && !isspace((unsigned char)*t); t++) - if (*t == '/') - if (--sleading >= 0) - name = t+1; - *t = '\0'; - - /* If no -p option was given (957 is the default value!), - we were given a relative pathname, - and the leading directories that we just stripped off all exist, - put them back on. */ - if (strip_leading == 957 && name != fullname && *fullname != '/') { - name[-1] = '\0'; - if (stat(fullname, &filestat) == 0 && S_ISDIR (filestat.st_mode)) { - name[-1] = '/'; - name=fullname; + if (strnEQ(at, _PATH_DEVNULL, sizeof _PATH_DEVNULL - 1)) + /* So files can be created by diffing against /dev/null. */ + return Nullch; + name = fullname = t = savestr(at); + + /* Strip off up to `sleading' leading slashes and null terminate. */ + for (; *t && !isspace((unsigned char)*t); t++) + if (*t == '/') + if (--sleading >= 0) + name = t + 1; + *t = '\0'; + + /* + * If no -p option was given (957 is the default value!), + * we were given a relative pathname, + * and the leading directories that we just stripped off all exist, + * put them back on. + */ + if (strip_leading == 957 && name != fullname && *fullname != '/') { + name[-1] = '\0'; + if (stat(fullname, &filestat) == 0 && + S_ISDIR(filestat.st_mode)) { + name[-1] = '/'; + name = fullname; + } } - } - - name = savestr(name); - free(fullname); - - if (stat(name, &filestat) && !assume_exists) { - char *filebase = basename(name); - int pathlen = filebase - name; - - /* Put any leading path into `tmpbuf'. */ - strncpy(tmpbuf, name, pathlen); - -#define try(f, a1, a2) (Sprintf(tmpbuf + pathlen, f, a1, a2), stat(tmpbuf, &filestat) == 0) - if ( try("RCS/%s%s", filebase, RCSSUFFIX) - || try("RCS/%s%s", filebase, "") - || try( "%s%s", filebase, RCSSUFFIX) - || try("SCCS/%s%s", SCCSPREFIX, filebase) - || try( "%s%s", SCCSPREFIX, filebase)) - return name; - free(name); - name = Nullch; - } - - return name; + + name = savestr(name); + free(fullname); + + if (stat(name, &filestat) && !assume_exists) { + char *filebase = basename(name); + int pathlen = filebase - name; + + /* Put any leading path into `tmpbuf'. */ + strncpy(tmpbuf, name, pathlen); + +#define try(f, a1, a2) \ + (Sprintf(tmpbuf + pathlen, f, a1, a2), stat(tmpbuf, &filestat) == 0) + if (try("RCS/%s%s", filebase, RCSSUFFIX) || + try("RCS/%s%s", filebase, "") || + try( "%s%s", filebase, RCSSUFFIX) || + try("SCCS/%s%s", SCCSPREFIX, filebase) || + try( "%s%s", SCCSPREFIX, filebase)) + return name; + free(name); + name = Nullch; + } + + return name; } char * xmalloc(unsigned int size) { - register char *p = (char *) malloc (size); - if (!p) - fatal("out of memory"); - return p; + register char *p = (char *) malloc (size); + if (!p) + fatal("out of memory"); + return p; } |