pkgsrc/editors/ex/patches/patch-ex__voper_c
dholland a3dfc1076f Fix legacy C. Pass -Wall -W -Wmissing-declarations -Wwrite-strings on
gcc45.

   - avoid implicit int, declare void functions void
   - return values from non-void functions
   - put most external declarations properly in header files
   - use some static and const
   - fix up a big mess with function pointer casting
   - use standard includes, don't provide own decls of standard functions
   - use types matching libc when providing own malloc, printf, and putchar
   - use <ctype.h> functions correctly
   - silence assorted compiler warnings
   - fix some bugs exposed by compiler warnings
   - don't intentionally exercise signed overflow
   - remove some unused items
   - add patch comments to other patch (patch-aa)

As this includes several fixes and removes some undefined behavior on
a commonly reachable code path, bump PKGREVISION.
2012-12-28 03:03:08 +00:00

351 lines
7.3 KiB
Text

$NetBSD: patch-ex__voper_c,v 1.1 2012/12/28 03:03:09 dholland Exp $
- declare local functions static
- fix up function pointer casting mess
- declare void functions void
- use const for string constants
- silence warnings about && and || precedence
- use <ctype.h> functions correctly
- avoid implicit int
--- ex_voper.c~ 2012-12-27 21:58:41.000000000 +0000
+++ ex_voper.c
@@ -89,7 +89,35 @@ static char sccsid[] = "@(#)ex_voper.c 1
cell vscandir[2] = { '/', 0 };
-int edge __P((void));
+static int edge __P((void));
+
+static void
+dovfilter(int ignore)
+{
+ (void)ignore;
+ vfilter();
+}
+
+static void
+dovshftop(int ignore)
+{
+ (void)ignore;
+ vshftop();
+}
+
+static void
+dovyankit(int ignore)
+{
+ (void)ignore;
+ vyankit();
+}
+
+static void
+dobeep(int ignore)
+{
+ (void)ignore;
+ beep();
+}
/*
* Decode an operator/operand type command.
@@ -101,14 +129,17 @@ int edge __P((void));
* and if wcursor is zero, then the first non-blank location of the
* other line is implied.
*/
+void
operate(c, cnt)
register int c, cnt;
{
register int i = 0;
- int (*moveop)(), (*deleteop)();
- int (*opf)();
+ void (*volatile moveop)(int);
+ void (*deleteop)(int);
+ void (*opf)(int);
bool subop = 0;
- char *oglobp, *ocurs;
+ const char *oglobp;
+ char *ocurs;
register line *addr;
line *odot;
static char lastFKND, lastFCHR;
@@ -120,7 +151,8 @@ operate(c, cnt)
qmarkcell[0] = '?';
slashcell[0] = '/';
nullcell[0] = qmarkcell[1] = slashcell[1] = 0;
- moveop = vmove, deleteop = vdelete;
+ moveop = vmove_i;
+ deleteop = vdelete;
wcursor = cursor;
wdot = NOLINE;
notecnt = 0;
@@ -132,7 +164,7 @@ operate(c, cnt)
*/
case 'd':
moveop = vdelete;
- deleteop = beep;
+ deleteop = dobeep;
break;
/*
@@ -147,18 +179,18 @@ operate(c, cnt)
* c Change operator.
*/
case 'c':
- if (c == 'c' && workcmd[0] == 'C' || workcmd[0] == 'S')
+ if ((c == 'c' && workcmd[0] == 'C') || workcmd[0] == 'S')
subop++;
moveop = vchange;
- deleteop = beep;
+ deleteop = dobeep;
break;
/*
* ! Filter through a UNIX command.
*/
case '!':
- moveop = vfilter;
- deleteop = beep;
+ moveop = dovfilter;
+ deleteop = dobeep;
break;
/*
@@ -166,8 +198,8 @@ operate(c, cnt)
* can be put back with p/P. Also yanks to named buffers.
*/
case 'y':
- moveop = vyankit;
- deleteop = beep;
+ moveop = dovyankit;
+ deleteop = dobeep;
break;
/*
@@ -185,8 +217,8 @@ operate(c, cnt)
*/
case '<':
case '>':
- moveop = vshftop;
- deleteop = beep;
+ moveop = dovshftop;
+ deleteop = dobeep;
break;
/*
@@ -309,7 +341,7 @@ ein:
#endif
getDOT();
forbid(!i);
- if (opf != vmove)
+ if (opf != vmove_i)
if (dir > 0)
wcursor++;
else
@@ -353,8 +385,8 @@ ein:
*/
case ',':
forbid (lastFKND == 0);
- c = isupper(cuc(lastFKND))
- ? tolower(lastFKND) : toupper(lastFKND);
+ c = isupper(cuc((unsigned char)lastFKND))
+ ? tolower((unsigned char)lastFKND) : toupper((unsigned char)lastFKND);
i = lastFCHR;
if (vglobp == 0)
vglobp = nullcell;
@@ -415,7 +447,7 @@ ein:
wcursor--;
case 'f':
fixup:
- if (moveop != vmove)
+ if (moveop != vmove_i)
wcursor++;
break;
}
@@ -444,13 +476,13 @@ fixup:
* $ To end of line.
*/
case '$':
- if (opf == vmove) {
+ if (opf == vmove_i) {
vmoving = 1;
vmovcol = 20000;
} else
vmoving = 0;
if (cnt > 1) {
- if (opf == vmove) {
+ if (opf == vmove_i) {
wcursor = 0;
cnt--;
} else
@@ -480,10 +512,10 @@ fixup:
*/
case 'l':
case ' ':
- forbid (margin() || opf == vmove && edge());
+ forbid (margin() || (opf == vmove_i && edge()));
while (cnt > 0 && !margin())
wcursor += dir, cnt--;
- if (margin() && opf == vmove || wcursor < linebuf)
+ if ((margin() && opf == vmove_i) || wcursor < linebuf)
wcursor -= dir;
vmoving = 0;
break;
@@ -520,7 +552,7 @@ deleteit:
* Stuttered operators are equivalent to the operator on
* a line, thus turn dd into d_.
*/
- if (opf == vmove || c != workcmd[0]) {
+ if (opf == vmove_i || c != workcmd[0]) {
errlab:
beep();
vmacp = 0;
@@ -545,7 +577,7 @@ errlab:
*/
case 'H':
wdot = (dot - vcline) + cnt - 1;
- if (opf == vmove)
+ if (opf == vmove_i)
markit(wdot);
vmoving = 0;
wcursor = 0;
@@ -578,7 +610,7 @@ errlab:
*/
case 'L':
wdot = dot + vcnt - vcline - cnt;
- if (opf == vmove)
+ if (opf == vmove_i)
markit(wdot);
vmoving = 0;
wcursor = 0;
@@ -589,7 +621,7 @@ errlab:
*/
case 'M':
wdot = dot + ((vcnt + 1) / 2) - vcline - 1;
- if (opf == vmove)
+ if (opf == vmove_i)
markit(wdot);
vmoving = 0;
wcursor = 0;
@@ -656,7 +688,7 @@ errlab:
forbid (Xhadcnt);
vmoving = 0;
wcursor = d == '`' ? ncols[c - 'a'] : 0;
- if (opf == vmove && (wdot != dot || (d == '`' && wcursor != cursor)))
+ if (opf == vmove_i && (wdot != dot || (d == '`' && wcursor != cursor)))
markDOT();
if (wcursor) {
vsave();
@@ -678,7 +710,7 @@ errlab:
cnt = lineDOL();
wdot = zero + cnt;
forbid (wdot < one || wdot > dol);
- if (opf == vmove)
+ if (opf == vmove_i)
markit(wdot);
vmoving = 0;
wcursor = 0;
@@ -765,7 +797,7 @@ slerr:
wcursor = loc1;
if (i != 0)
vsetsiz(i);
- if (opf == vmove) {
+ if (opf == vmove_i) {
if (state == ONEOPEN || state == HARDOPEN)
outline = destline = WBOT;
if (addr != dot || loc1 != cursor)
@@ -804,7 +836,8 @@ slerr:
/*
* Find single character c, in direction dir from cursor.
*/
-find(c)
+int
+find(int c)
{
for(;;) {
@@ -820,8 +853,9 @@ find(c)
* Do a word motion with operator op, and cnt more words
* to go after this.
*/
+int
word(op, cnt)
- register int (*op)();
+ register void (*op)(int);
int cnt;
{
register int which = 0;
@@ -832,7 +866,7 @@ word(op, cnt)
iwc = wcursor;
which = wordch(wcursor);
while (wordof(which, wcursor)) {
- if (cnt == 1 && op != vmove && wcursor[1] == 0) {
+ if (cnt == 1 && op != vmove_i && wcursor[1] == 0) {
wcursor++;
break;
}
@@ -848,7 +882,7 @@ word(op, cnt)
else
if (wcursor == iwc && iwdot == wdot && *iwc)
wcursor++;
- if (op == vmove && margin())
+ if (op == vmove_i && margin())
wcursor--;
} else {
if (!lnext())
@@ -871,8 +905,9 @@ word(op, cnt)
* To end of word, with operator op and cnt more motions
* remaining after this.
*/
+void
eend(op)
- register int (*op)();
+ register void (*op)(int);
{
register int which;
@@ -898,8 +933,8 @@ eend(op)
* Wordof tells whether the character at *wc is in a word of
* kind which (blank/nonblank words are 0, conservative words 1).
*/
-wordof(which, wc)
- register char *wc;
+int
+wordof(int which, register char *wc)
{
if (isspace(cuc(*wc)))
@@ -911,12 +946,13 @@ wordof(which, wc)
* Wordch tells whether character at *wc is a word character
* i.e. an alfa, digit, or underscore.
*/
+int
wordch(wc)
char *wc;
{
register int c;
- c = wc[0];
+ c = (unsigned char)wc[0];
return (isalpha(c) || isdigit(c) || c == '_'
#ifdef BIT8
#ifdef ISO8859_1
@@ -935,7 +971,8 @@ wordch(wc)
/*
* Edge tells when we hit the last character in the current line.
*/
-edge()
+static int
+edge(void)
{
if (linebuf[0] == 0)
@@ -949,7 +986,8 @@ edge()
/*
* Margin tells us when we have fallen off the end of the line.
*/
-margin()
+int
+margin(void)
{
return (wcursor < linebuf || wcursor[0] == 0);