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.
351 lines
7.3 KiB
Text
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);
|