summaryrefslogtreecommitdiff
path: root/extra/scripts/unifdef.c
diff options
context:
space:
mode:
Diffstat (limited to 'extra/scripts/unifdef.c')
-rw-r--r--extra/scripts/unifdef.c31
1 files changed, 19 insertions, 12 deletions
diff --git a/extra/scripts/unifdef.c b/extra/scripts/unifdef.c
index f18bea853..0f059205f 100644
--- a/extra/scripts/unifdef.c
+++ b/extra/scripts/unifdef.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2002 - 2013 Tony Finch <dot@dotat.at>
+ * Copyright (c) 2002 - 2014 Tony Finch <dot@dotat.at>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -207,6 +207,7 @@ static bool firstsym; /* ditto */
static int exitmode; /* exit status mode */
static int exitstat; /* program exit status */
+static bool altered; /* was this file modified? */
static void addsym1(bool, bool, char *);
static void addsym2(bool, const char *, const char *);
@@ -415,7 +416,11 @@ processinout(const char *ifn, const char *ofn)
err(2, "can't rename \"%s\" to \"%s\"", ofn, backname);
free(backname);
}
- if (replace(tempname, ofn) < 0)
+ /* leave file unmodified if unifdef made no changes */
+ if (!altered && backext == NULL) {
+ if (remove(tempname) < 0)
+ warn("can't remove \"%s\"", tempname);
+ } else if (replace(tempname, ofn) < 0)
err(2, "can't rename \"%s\" to \"%s\"", tempname, ofn);
free(tempname);
tempname = NULL;
@@ -637,6 +642,7 @@ keywordedit(const char *replacement)
{
snprintf(keyword, tline + sizeof(tline) - keyword,
"%s%s", replacement, newline);
+ altered = true;
print();
}
static void
@@ -699,7 +705,7 @@ flushline(bool keep)
} else {
if (lnblank && fputs(newline, output) == EOF)
closeio();
- exitstat = 1;
+ altered = true;
delcount += 1;
blankcount = 0;
}
@@ -751,6 +757,7 @@ process(void)
zerosyms = true;
newline = NULL;
linenum = 0;
+ altered = false;
while (lineval != LT_EOF) {
lineval = parseline();
trans_table[ifstate[depth]][lineval]();
@@ -758,6 +765,7 @@ process(void)
linenum, linetype_name[lineval],
ifstate_name[ifstate[depth]], depth);
}
+ exitstat |= altered;
}
/*
@@ -1097,14 +1105,12 @@ skiphash(void)
{
const char *cp;
- if (linestate == LS_START) {
- linenum++;
- if (fgets(tline, MAXLINE, input) == NULL) {
- if (ferror(input))
- err(2, "can't read %s", filename);
- else
- return (NULL);
- }
+ linenum++;
+ if (fgets(tline, MAXLINE, input) == NULL) {
+ if (ferror(input))
+ err(2, "can't read %s", filename);
+ else
+ return (NULL);
}
cp = skipcomment(tline);
if (linestate == LS_START && *cp == '#') {
@@ -1124,7 +1130,8 @@ skiphash(void)
static const char *
skipline(const char *cp)
{
- linestate = LS_DIRTY;
+ if (*cp != '\0')
+ linestate = LS_DIRTY;
while (*cp != '\0')
cp = skipcomment(cp + 1);
return (cp);