Skip to content

Instantly share code, notes, and snippets.

@lichray
Created December 2, 2011 07:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lichray/1422190 to your computer and use it in GitHub Desktop.
Save lichray/1422190 to your computer and use it in GitHub Desktop.
The Debian way to fix v_increment
#! /bin/sh /usr/share/dpatch/dpatch-run
## 13widechar_horrors.dpatch by <hesso@pool.math.tu-berlin.de>
##
## DP: This patch tries to cope with the fact that widechar support
## DP: in nvi is at best rudimentary.
## DP: Hunk 1)
## DP: * Due to "ch = *t", this code is not wide-char aware, so
## DP: cast the value to a proper type so the KEY_ macros make
## DP: the right choice.
## DP: Hunk 2)
## DP: * Printing of the in-/decreased number back into the screen
## DP: buffer is not widechar-aware, either. Add a dirty fix.
## DP: Cf. #497349.
@DPATCH@
--- nvi-1.81.6.orig/vi/vs_msg.c 2007-11-18 17:41:42.000000000 +0100
+++ nvi-1.81.6/vi/vs_msg.c 2009-03-01 14:51:08.211414132 +0100
@@ -472,10 +472,10 @@
*/
if (ch == '\t')
ch = ' ';
- chlen = KEY_LEN(sp, ch);
+ chlen = KEY_LEN(sp, (unsigned char)ch);
if (cbp + chlen >= ecbp)
FLUSH;
- for (kp = KEY_NAME(sp, ch); chlen--;)
+ for (kp = KEY_NAME(sp, (unsigned char)ch); chlen--;)
*cbp++ = *kp++;
}
if (cbp > cbuf)
--- nvi-1.81.6.orig/vi/v_increment.c 2007-11-18 17:41:42.000000000 +0100
+++ nvi-1.81.6/vi/v_increment.c 2009-03-01 15:12:50.950415874 +0100
@@ -57,7 +57,7 @@
long change, ltmp, lval;
size_t beg, blen, end, len, nlen, wlen;
int base, isempty, rval;
- char *ntype, nbuf[100];
+ char *ntype, nbuf[100 * sizeof(CHAR_T)];
CHAR_T *bp, *p, *t;
/* Validate the operator. */
@@ -202,7 +202,7 @@
/* If we cross 0, signed numbers lose their sign. */
if (lval == 0 && ntype == fmt[SDEC])
ntype = fmt[DEC];
- nlen = snprintf(nbuf, sizeof(nbuf), ntype, lval);
+ nlen = snprintf(nbuf, sizeof(nbuf)/sizeof(CHAR_T), ntype, lval);
} else {
if ((nret = nget_uslong(sp, &ulval, t, NULL, base)) != NUM_OK)
goto err;
@@ -224,7 +224,15 @@
if (base == 16)
wlen -= 2;
- nlen = snprintf(nbuf, sizeof(nbuf), ntype, wlen, ulval);
+ nlen = snprintf(nbuf, sizeof(nbuf)/sizeof(CHAR_T), ntype, wlen, ulval);
+ }
+
+ /* Inflate the printed char buffer to CHAR_T elements if necessary */
+ if (sizeof(CHAR_T) > sizeof(char)) {
+ int nlen_inflate;
+ for (nlen_inflate = nlen; nlen_inflate >= 0; nlen_inflate--) {
+ ((CHAR_T *)nbuf)[nlen_inflate] = nbuf[nlen_inflate];
+ }
}
/* Build the new line. */
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment