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
This commit is contained in:
parent
f631b588f5
commit
d77254e807
@ -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. */
|
||||
}
|
||||
#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 */
|
||||
|
||||
iline = 0;
|
||||
for (s=i_womp; *s; s++) {
|
||||
if (*s == '\n')
|
||||
iline++;
|
||||
}
|
||||
#ifdef lint
|
||||
i_ptr = Null(char**);
|
||||
#else
|
||||
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;
|
||||
|
||||
/* 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(
|
||||
"this file doesn't appear to be the %s version--aborting.\n", revision);
|
||||
}
|
||||
else {
|
||||
(void) ask2(
|
||||
"This file doesn't appear to be the %s version--patch anyway? [n] ",
|
||||
revision);
|
||||
if (*buf != 'y')
|
||||
fatal1("aborted\n");
|
||||
}
|
||||
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;
|
||||
}
|
||||
else if (verbose)
|
||||
say2("Good. This file appears to be the %s version.\n",
|
||||
revision);
|
||||
}
|
||||
return TRUE; /* plan a will work */
|
||||
#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.
|
||||
*/
|
||||
iline = 0;
|
||||
for (s = i_womp; *s; s++) {
|
||||
if (*s == '\n')
|
||||
iline++;
|
||||
}
|
||||
#ifdef lint
|
||||
i_ptr = Null(char**);
|
||||
#else
|
||||
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') {
|
||||
/* These are NOT null terminated. */
|
||||
i_ptr[++iline] = s + 1;
|
||||
}
|
||||
}
|
||||
input_lines = iline - 1;
|
||||
|
||||
/* 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(
|
||||
"this file doesn't appear to be the %s version--aborting.\n", revision);
|
||||
} else {
|
||||
(void) ask2(
|
||||
"This file doesn't appear to be the %s version--patch anyway? [n] ",
|
||||
revision);
|
||||
if (*buf != 'y')
|
||||
fatal1("aborted\n");
|
||||
}
|
||||
} else if (verbose)
|
||||
say2("Good. This file appears to be the %s version.\n",
|
||||
revision);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
|
||||
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);
|
||||
#endif
|
||||
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(bakname) >= 0) ; /* while() is for benefit of Eunice */
|
||||
#ifdef DEBUGGING
|
||||
if (debug & 4)
|
||||
say3("Moving %s to %s.\n", to, bakname);
|
||||
say3("Moving %s to %s.\n", from, to);
|
||||
#endif
|
||||
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) ;
|
||||
}
|
||||
#ifdef DEBUGGING
|
||||
if (debug & 4)
|
||||
say3("Moving %s to %s.\n", from, to);
|
||||
#endif
|
||||
if (rename(from, to) < 0) { /* different file system? */
|
||||
Reg4 int tofd;
|
||||
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;
|
||||
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;
|
||||
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);
|
||||
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. */
|
||||
|
||||
/*
|
||||
* Allocate a unique area for a string.
|
||||
*/
|
||||
char *
|
||||
savestr(char *s)
|
||||
{
|
||||
Reg3 char *rv;
|
||||
Reg2 char *t;
|
||||
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 (!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);
|
||||
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)) {
|
||||
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);
|
||||
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;
|
||||
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)();
|
||||
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);
|
||||
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. */
|
||||
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';
|
||||
/*
|
||||
* 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;
|
||||
*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;
|
||||
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);
|
||||
if (stat(tmpbuf, &sbuf) && errno == ENOENT) {
|
||||
while (*s)
|
||||
s++;
|
||||
*s++ = ' ';
|
||||
strcpy(s, tmpbuf);
|
||||
}
|
||||
*dirv[i] = '/';
|
||||
}
|
||||
*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;
|
||||
char *fullname;
|
||||
char *name;
|
||||
Reg1 char *t;
|
||||
char tmpbuf[200];
|
||||
int sleading = strip_leading;
|
||||
|
||||
if (!at)
|
||||
return Nullch;
|
||||
while (isspace((unsigned char)*at))
|
||||
at++;
|
||||
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);
|
||||
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';
|
||||
/* 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 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);
|
||||
name = savestr(name);
|
||||
free(fullname);
|
||||
|
||||
if (stat(name, &filestat) && !assume_exists) {
|
||||
char *filebase = basename(name);
|
||||
int pathlen = filebase - name;
|
||||
if (stat(name, &filestat) && !assume_exists) {
|
||||
char *filebase = basename(name);
|
||||
int pathlen = filebase - name;
|
||||
|
||||
/* Put any leading path into `tmpbuf'. */
|
||||
strncpy(tmpbuf, name, pathlen);
|
||||
/* 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;
|
||||
}
|
||||
#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;
|
||||
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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user