diff options
author | gad <gad@FreeBSD.org> | 2002-05-21 00:44:18 +0000 |
---|---|---|
committer | gad <gad@FreeBSD.org> | 2002-05-21 00:44:18 +0000 |
commit | 71a8393bddca5c4e415d484865056771471f2287 (patch) | |
tree | 94f7a026c7fcfc96fd144b4208ef9fbf61a64fb6 | |
parent | e0ffa7e6d398b5c92e6de7cd4aad933f2106c1b8 (diff) | |
download | FreeBSD-src-71a8393bddca5c4e415d484865056771471f2287.zip FreeBSD-src-71a8393bddca5c4e415d484865056771471f2287.tar.gz |
Change parts of the source code to make it closer to style(9), mainly
changing indentation and some comments. Main goal is not perfect style,
but just to reduce differences with NetBSD. The object code is exactly
the same after this change as before it (except for assert() statements
which have moved).
Reviewed by: /sbin/md5 on i386
Obtained from: NetBSD
-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; } |