summaryrefslogtreecommitdiff
path: root/1.20.7...e82d1a653ca94aa4ed12441424da6ce780b1e530.diff
diff options
context:
space:
mode:
Diffstat (limited to '1.20.7...e82d1a653ca94aa4ed12441424da6ce780b1e530.diff')
-rw-r--r--1.20.7...e82d1a653ca94aa4ed12441424da6ce780b1e530.diff555
1 files changed, 555 insertions, 0 deletions
diff --git a/1.20.7...e82d1a653ca94aa4ed12441424da6ce780b1e530.diff b/1.20.7...e82d1a653ca94aa4ed12441424da6ce780b1e530.diff
new file mode 100644
index 0000000..fea8a7f
--- /dev/null
+++ b/1.20.7...e82d1a653ca94aa4ed12441424da6ce780b1e530.diff
@@ -0,0 +1,555 @@
+diff --git a/.gitignore b/.gitignore
+index 87df93b..5f79b9d 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -11,6 +11,7 @@ Makefile
+ Makefile.include
+ /aclocal.m4
+ /autom4te.cache
++/config.cache
+ /config.log
+ /config.status
+ /configure
+@@ -29,7 +30,7 @@ Makefile.include
+ /src/gpm
+ /src/gpm2/tmp
+ /src/gpm2/out
+-/src/lib/libgpm.so.*
++/src/lib/libgpm.so*
+ /src/prog/disable-paste
+ /src/prog/display-buttons
+ /src/prog/display-coords
+diff --git a/Makefile.in b/Makefile.in
+index 5412334..0aa6a78 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -102,19 +102,24 @@ TAGS: $(SRCS) $(HDRS) src/prog/gpm-root.y do-TAGS
+
+ ### RELEASE STUFF
+ TARS =../gpm-$(release).tar.gz
+-TARS +=../gpm-$(release).tar.bz2 ../gpm-$(release).tar.lzma
++TARS +=../gpm-$(release).tar.bz2 ../gpm-$(release).tar.xz
+
+ M_HOST=arcana.linux.it
+ M_DIR=gpm/
+
+ tars: $(TARS)
++ chmod a+r $<
+
+ # configure headers, produce new configure script
+ distconf: Makefile.in Makefile.include.in configure acinclude.m4 $(versionfiles)
+
+ ../gpm-$(release).tar: $(srcdir) distclean distconf
+ # no exclude possible of .git with pax it seems, so the following is not possible:
+- git archive --prefix "gpm-$(release)/" -o $@ HEAD
++ rm -rf "gpm-$(release)/"
++ git archive --prefix "gpm-$(release)/" HEAD | tar xf -
++ cd "gpm-$(release)/" && ./autogen.sh && rm -rf autom4te.cache
++ tar cf $@ "gpm-$(release)/"
++ rm -rf "gpm-$(release)/"
+
+ ../gpm-$(release).tar.gz: ../gpm-$(release).tar
+ gzip -9 -c $< > $@
+@@ -122,11 +127,11 @@ distconf: Makefile.in Makefile.include.in configure acinclude.m4 $(versionfiles)
+ ../gpm-$(release).tar.bz2: ../gpm-$(release).tar
+ bzip2 -9 -c $< > $@
+
+-../gpm-$(release).tar.lzma: ../gpm-$(release).tar
+- lzma -9 -c $< > $@
++../gpm-$(release).tar.xz: ../gpm-$(release).tar
++ xz -9 -c $< > $@
+
+ # 3. Put package together into .tar.gz and .tar.bz2
+-dist: disttest distclean distconf $(TARS)
++dist: disttest distclean distconf $(TARS) tars
+ scp $(TARS) $(M_HOST):$(M_DIR)
+ mv $(TARS) ~/niconetz/software/gpm/archives
+
+diff --git a/configure.ac.footer b/configure.ac.footer
+index 89a4cd9..1e5e4da 100644
+--- a/configure.ac.footer
++++ b/configure.ac.footer
+@@ -124,7 +124,7 @@ No|no|N|n) SHARED_LIBS=-lc ;;
+ done
+ TERMLIBS=$LIBS
+ LIBS=
+- for i in ncurses curses; do
++ for i in ncurses curses ncursesw; do
+ if test x$LIBS = x; then
+ AC_CHECK_LIB($i, wgetch,,,$TERMLIBS)
+ else :; fi
+diff --git a/doc/changelog b/doc/changelog
+index de64bcf..1581fd1 100644
+--- a/doc/changelog
++++ b/doc/changelog
+@@ -1,3 +1,7 @@
++1.20.8:
++ * Remove lzma, use xz (Mike Frysinger)
++ * Install shared lib with +x perms (Mike Frysinger)
++
+ 1.20.7: 2012-10-26
+ * Fix inclusion of unwanted binary data
+ * Even more cleanups (Mike Frysinger)
+@@ -5,7 +9,7 @@
+ * Don't build static libgpm by default (Sean McGovern)
+ * autogen.sh is now required to create setup version in autoconf (Nico Schottelius)
+
+-1.20.5: 9th of February 2009
++1.20.6: 9th of February 2009
+ * Some cleanups (Mike Frysinger/Nico Schottelius)
+ * Pull in fcntl.h rather than unistd.h for open() (Mike Frysinger)
+ * Fix gcc warning "control reaches end of non-void function" (Mike Frysinger)
+diff --git a/doc/doc.gpm.in b/doc/doc.gpm.in
+index afd5a29..795b958 100644
+--- a/doc/doc.gpm.in
++++ b/doc/doc.gpm.in
+@@ -88,7 +88,7 @@ by the Free Software Foundation.
+ @subtitle A general purpose mouse server for the Linux console
+ @subtitle @value{update-month}
+
+-@author by Nico Schottelius <nico@@schottelius.org>
++@author by Nico Schottelius <nico-gpm2008@@schottelius.org>
+
+ @end titlepage
+ @setchapternewpage off
+@@ -525,7 +525,7 @@ security risks when using them.
+ Andrew Haylett <ajh@gec-mrc.co.uk> (the original selection code)
+ Ian Zimmerman <itz@speakeasy.org> (old maintainer)
+ Alessandro Rubini <rubini@linux.it> (old maintainer (still helps a lot))
+-Nico Schottelius <nico@schottelius.org> (maintainer)
++Nico Schottelius <nico-gpm2008@schottelius.org> (maintainer)
+
+ Many many contributors, to both selection and gpm.
+ .fi
+diff --git a/src/Makefile.in b/src/Makefile.in
+index d3b1dcd..2f92989 100644
+--- a/src/Makefile.in
++++ b/src/Makefile.in
+@@ -79,7 +79,7 @@ prog/%: prog/%.o
+ # | $(SED) '\''s/\($*\)\.o\([ :]*\)/\1.o \1.lo\2/g'\'' > $(DEPDIR)/$@'
+
+ # Do it all!
+-all: gpm lib/libgpm.so.@abi_lev@ @LIBGPM_A@ $(PROG)
++all: gpm lib/libgpm.so.@abi_lev@ lib/libgpm.so @LIBGPM_A@ $(PROG)
+
+ gpm: $(GOBJ)
+ $(CC) @LDFLAGS@ $(LDFLAGS) -o $@ $(GOBJ) @LIBS@ $(LIBS) -lm
+@@ -96,7 +96,7 @@ $(DEPFILE) dep: prog/gpm-root.c
+
+ # create dependencies
+ for DEPS in `echo *.c */*.c`; do \
+- $(CC) -I. -I $(srcdir) -M @CPPFLAGS@ $(CPPFLAGS) $$DEPS | \
++ $(CC) -I. -I $(srcdir) -I $(srcdir)/headers -M @CPPFLAGS@ $(CPPFLAGS) $$DEPS | \
+ $(SED) 's/^\(.*\)\.o\([ :]+\)/\1.o \1.lo\2/g' >> $(DEPFILE) ; done
+
+ ### INSTALL
+@@ -113,7 +113,7 @@ install: check
+ # 2.x goes along; unfortunately that means an additional
+ # headache in cases like this
+ if test "x@SHLIB@" != "x" ; then \
+- $(INSTALL_DATA) -m 644 lib/libgpm.so.@abi_full@ $(libdir)/libgpm.so.@abi_full@ ; \
++ $(INSTALL_DATA) -m 755 lib/libgpm.so.@abi_full@ $(libdir)/libgpm.so.@abi_full@ ; \
+ cd $(libdir) && $(LN_S) -f libgpm.so.@abi_full@ libgpm.so.@abi_lev@ ; \
+ echo "WARNING: We installed a lib, you should now call ldconfig" ; \
+ echo "f.i.: ldconfig -n -l $(libdir)/libgpm.so.@abi_full@" ; \
+@@ -168,9 +168,8 @@ lib/libgpm.so.@abi_full@: $(PICS)
+ @LDFLAGS@ $(LDFLAGS) -o lib/libgpm.so.@abi_full@ $^ @LIBS@ @SHARED_LIBS@ $(LIBS)
+ lib/libgpm.so.@abi_lev@: lib/libgpm.so.@abi_full@
+ $(LN_S) -f libgpm.so.@abi_full@ lib/libgpm.so.@abi_lev@
+-# unneeded, isn't it?
+-#lib/libgpm.so: lib/libgpm.so.@abi_full@
+-# $(LN_S) -f libgpm.so.@abi_full@ lib/libgpm.so
++lib/libgpm.so: lib/libgpm.so.@abi_full@
++ $(LN_S) -f libgpm.so.@abi_full@ lib/libgpm.so
+
+ include $(DEPFILE)
+
+diff --git a/src/daemon/gpm.c b/src/daemon/gpm.c
+index 771da5c..6806dce 100644
+--- a/src/daemon/gpm.c
++++ b/src/daemon/gpm.c
+@@ -29,7 +29,7 @@
+ #include <signal.h> /* SIGPIPE */
+ #include <time.h> /* time() */
+ #include <sys/param.h>
+-#include <sys/fcntl.h> /* O_RDONLY */
++#include <fcntl.h> /* O_RDONLY */
+ #include <sys/wait.h> /* wait() */
+ #include <sys/stat.h> /* mkdir() */
+ #include <sys/time.h> /* timeval */
+diff --git a/src/daemon/old_main.c b/src/daemon/old_main.c
+index 9cd4e56..ab7a87f 100644
+--- a/src/daemon/old_main.c
++++ b/src/daemon/old_main.c
+@@ -25,6 +25,7 @@
+ #include <signal.h> /* guess again */
+ #include <errno.h> /* guess again */
+ #include <unistd.h> /* unlink */
++#include <string.h> /* strcpy, bzero */
+ #include <sys/stat.h> /* chmod */
+
+ #include <linux/kd.h> /* linux hd* */
+@@ -192,10 +193,11 @@ int old_main()
+ * or to the default handler, if any
+ * or to the selection handler
+ */ /* FIXME -- check event.vc */
+- /* can't we please rewrite the following a bit nicer?*/
+- (cinfo[event.vc] && do_client(cinfo[event.vc], &event))
+- || (cinfo[0] && do_client(cinfo[0], &event))
+- || do_selection(&event);
++ if(!cinfo[event.vc] || !do_client(cinfo[event.vc], &event)) {
++ if(!cinfo[0] || !do_client(cinfo[0],&event)) {
++ do_selection(&event);
++ }
++ }
+ }
+ }
+
+diff --git a/src/daemon/open_console.c b/src/daemon/open_console.c
+index 98297c9..6dd43e6 100644
+--- a/src/daemon/open_console.c
++++ b/src/daemon/open_console.c
+@@ -21,8 +21,13 @@
+
+ #include <fcntl.h> /* open and co. */
+ #include <sys/stat.h> /* stat() */
++#include <sys/types.h> /* major() */
+ #include <sys/ioctl.h> /* ioctl */
+
++#ifdef HAVE_SYS_SYSMACROS_H
++#include <sys/sysmacros.h> /* major() w/newer glibc */
++#endif
++
+ /* Linux specific (to be outsourced in gpm2 */
+ #include <linux/serial.h> /* for serial console check */
+ #include <asm/ioctls.h> /* for serial console check */
+diff --git a/src/daemon/processconn.c b/src/daemon/processconn.c
+index a5839a3..e92fa63 100644
+--- a/src/daemon/processconn.c
++++ b/src/daemon/processconn.c
+@@ -67,7 +67,8 @@ int processConn(int fd)
+ return -1;
+ }
+
+- if((vc = request->vc) > MAX_VC) {
++ vc = request->vc;
++ if(vc > MAX_VC || vc < 0) {
+ gpm_report(GPM_PR_DEBUG, GPM_MESS_REQUEST_ON, vc, MAX_VC);
+ free(info);
+ close(newfd);
+diff --git a/src/headers/daemon.h b/src/headers/daemon.h
+index a8936ad..24a1a97 100644
+--- a/src/headers/daemon.h
++++ b/src/headers/daemon.h
+@@ -180,7 +180,7 @@ extern struct mouse_features mouse_table[3],
+ extern Gpm_Type mice[];
+ extern Gpm_Type *repeated_type;
+
+-time_t last_selection_time;
++extern time_t last_selection_time;
+
+
+
+diff --git a/src/headers/gpm.h b/src/headers/gpm.h
+index 57dc618..fe52e53 100644
+--- a/src/headers/gpm.h
++++ b/src/headers/gpm.h
+@@ -280,10 +280,16 @@ int Gpm_GetSnapshot(Gpm_Event *ePtr);
+ char *Gpm_get_console( void );
+ int Gpm_x_high_y(int base, int pot_y);
+ int Gpm_cnt_digits(int number);
+-void gpm_oops(int line, char *file, char *text, ... );
++#ifdef __GNUC__
++__attribute__((__format__(printf, 3, 4)))
++#endif
++void gpm_oops(int line, const char *file, const char *text, ... );
+
+ /* report.c / report-lib.c */
+-void gpm_report(int line, char *file, int stat, char *text, ... );
++#ifdef __GNUC__
++__attribute__((__format__(printf, 4, 5)))
++#endif
++void gpm_report(int line, const char *file, int stat, const char *text, ... );
+
+ #ifdef __cplusplus
+ };
+diff --git a/src/headers/message.h b/src/headers/message.h
+index a0fed0e..4b60291 100644
+--- a/src/headers/message.h
++++ b/src/headers/message.h
+@@ -226,7 +226,10 @@
+ /* #define GPM_MESS_ "" */
+
+ /* functions */
+-void gpm_report(int line, char *file, int stat, char *text, ... );
++#ifdef __GNUC__
++__attribute__((__format__(printf, 4, 5)))
++#endif
++void gpm_report(int line, const char *file, int stat, const char *text, ... );
+
+ /* rest of wd.h */
+ #ifdef HAVE_SYSLOG_H
+diff --git a/src/lib/liblow.c b/src/lib/liblow.c
+index e789d09..8b40b71 100644
+--- a/src/lib/liblow.c
++++ b/src/lib/liblow.c
+@@ -29,11 +29,12 @@
+ #include <string.h> /* strncmp */
+ #include <unistd.h> /* select(); */
+ #include <errno.h>
++#include <fcntl.h> /* O_RDONLY */
++
+ #include <sys/time.h> /* timeval */
+ #include <sys/types.h> /* socket() */
+ #include <sys/socket.h> /* socket() */
+ #include <sys/un.h> /* struct sockaddr_un */
+-#include <sys/fcntl.h> /* O_RDONLY */
+ #include <sys/stat.h> /* stat() */
+
+ #ifdef SIGTSTP /* true if BSD system */
+@@ -173,7 +174,7 @@ static void gpm_suspend_hook (int signum)
+ /* Reincarnation. Prepare for another death early. */
+ sigemptyset(&sa.sa_mask);
+ sa.sa_handler = gpm_suspend_hook;
+- sa.sa_flags = SA_NOMASK;
++ sa.sa_flags = SA_NODEFER;
+ sigaction (SIGTSTP, &sa, 0);
+
+ /* Pop the gpm stack by closing the useless connection */
+@@ -364,7 +365,7 @@ int Gpm_Open(Gpm_Connect *conn, int flag)
+
+ /* if signal was originally ignored, job control is not supported */
+ if (gpm_saved_suspend_hook.sa_handler != SIG_IGN) {
+- sa.sa_flags = SA_NOMASK;
++ sa.sa_flags = SA_NODEFER;
+ sa.sa_handler = gpm_suspend_hook;
+ sigaction(SIGTSTP, &sa, 0);
+ }
+diff --git a/src/lib/report-lib.c b/src/lib/report-lib.c
+index c0ae086..03230b4 100644
+--- a/src/lib/report-lib.c
++++ b/src/lib/report-lib.c
+@@ -24,9 +24,9 @@
+
+ #include "headers/message.h"
+
+-void gpm_report(int line, char *file, int stat, char *text, ... )
++void gpm_report(int line, const char *file, int stat, const char *text, ... )
+ {
+- char *string = NULL;
++ const char *string = NULL;
+ int log_level;
+ va_list ap;
+
+@@ -47,7 +47,7 @@ void gpm_report(int line, char *file, int stat, char *text, ... )
+ log_level = LOG_CRIT; break;
+ }
+ #ifdef HAVE_VSYSLOG
+- syslog(log_level, string);
++ syslog(log_level, "%s", string);
+ vsyslog(log_level, text, ap);
+ #else
+ fprintf(stderr,"%s[%s(%d)]:\n",string,file,line);
+diff --git a/src/prog/display-buttons.c b/src/prog/display-buttons.c
+index de8e5b2..38d2f11 100644
+--- a/src/prog/display-buttons.c
++++ b/src/prog/display-buttons.c
+@@ -36,6 +36,7 @@
+ #include <stdio.h> /* printf() */
+ #include <time.h> /* time() */
+ #include <errno.h> /* errno */
++#include <sys/select.h> /* fd_set and FD_* */
+ #include <gpm.h> /* gpm information */
+
+ /* display resulting data */
+diff --git a/src/prog/display-coords.c b/src/prog/display-coords.c
+index ed15c8a..82afd12 100644
+--- a/src/prog/display-coords.c
++++ b/src/prog/display-coords.c
+@@ -33,10 +33,12 @@
+ */
+
+ #include <unistd.h> /* write, read, open */
++#include <stdint.h>
+ #include <stdlib.h> /* strtol() */
+ #include <stdio.h> /* printf() */
+ #include <time.h> /* time() */
+ #include <errno.h> /* errno */
++#include <sys/select.h> /* fd_set and FD_* */
+ #include <gpm.h> /* gpm information */
+
+ /* display resulting data */
+@@ -50,7 +52,7 @@ int display_data(Gpm_Event *event, void *data)
+ last = now;
+
+ /* display time, delta time */
+- printf("[%d] delta: %ds",now,delta);
++ printf("[%jd] delta: %ds",(intmax_t)now,delta);
+
+ /* display mouse information */
+ printf(": x=%2i, y=%2i, dx=%2i, dy=%2i\n", event->x, event->y, event->dx, event->dy);
+diff --git a/src/prog/gpm-root.y b/src/prog/gpm-root.y
+index 069d801..76c896c 100644
+--- a/src/prog/gpm-root.y
++++ b/src/prog/gpm-root.y
+@@ -443,6 +443,7 @@ void f__fix(struct passwd *pass)
+ }
+
+ /*---------------------------------------------------------------------*/
++#if 0
+ static int f_debug_one(FILE *f, Draw *draw)
+ {
+ DrawItem *ip;
+@@ -465,6 +466,7 @@ static int f_debug_one(FILE *f, Draw *draw)
+ #undef LINE
+ return 0;
+ }
++#endif
+
+ int f_debug(int mode, DrawItem *self, int uid)
+ {
+@@ -960,10 +962,8 @@ static inline void scr_dump(int fd, FILE *f, unsigned char *buffer, int vc)
+ /*------------*/
+ static inline void scr_restore(int fd, FILE *f, unsigned char *buffer, int vc)
+ {
+- int x,y, dumpfd;
++ int dumpfd;
+ char dumpname[20];
+-
+- x=buffer[2]; y=buffer[3];
+
+ /* WILL NOT WORK WITH DEVFS! FIXME! */
+ sprintf(dumpname,"/dev/vcsa%i",vc);
+@@ -1196,12 +1196,8 @@ int main(int argc, char **argv)
+ LOG_DAEMON : LOG_USER);
+ /* reap your zombies */
+ childaction.sa_handler=reap_children;
+-#if defined(__GLIBC__)
+- __sigemptyset(&childaction.sa_mask);
+-#else /* __GLIBC__ */
+- childaction.sa_mask=0;
+-#endif /* __GLIBC__ */
+- childaction.sa_flags=SA_INTERRUPT; /* need to break the select() call */
++ sigemptyset(&childaction.sa_mask);
++ childaction.sa_flags=0;
+ sigaction(SIGCHLD,&childaction,NULL);
+
+ /*....................................... Connect and get your buffer */
+diff --git a/src/prog/mouse-test.c b/src/prog/mouse-test.c
+index 0bb1982..d7d1027 100644
+--- a/src/prog/mouse-test.c
++++ b/src/prog/mouse-test.c
+@@ -182,14 +182,14 @@ Gpm_Type *(*I_serial)(int fd, unsigned short flags, struct Gpm_Type *type,
+ /*-----------------------------------------------------------------------------
+ Place the description here.
+ -----------------------------------------------------------------------------*/
+-int mousereopen(int oldfd, char *name, Gpm_Type *type)
++int mousereopen(int oldfd, const char *name, Gpm_Type *type)
+ {
+ int fd;
+ if (!type) type=mice+1; /* ms */
+ close(oldfd);
+ usleep(100000);
+ fd=open(name,O_RDWR);
+- if (fd < 0) gpm_report(GPM_PR_OOPS,name);
++ if (fd < 0) gpm_report(GPM_PR_OOPS, "%s", name);
+ (*I_serial)(fd,type->flags,type,1,&type->name); /* ms initialization */
+ return fd;
+ }
+diff --git a/src/report.c b/src/report.c
+index 6c7c2ee..286c1b7 100644
+--- a/src/report.c
++++ b/src/report.c
+@@ -69,7 +69,7 @@
+ *
+ */
+
+-void gpm_report(int line, char *file, int stat, char *text, ... )
++void gpm_report(int line, const char *file, int stat, const char *text, ...)
+ {
+ FILE *console = NULL;
+ va_list ap, ap3;
+diff --git a/src/synaptics.c b/src/synaptics.c
+index 2418c75..a978ef0 100644
+--- a/src/synaptics.c
++++ b/src/synaptics.c
+@@ -214,6 +214,7 @@
+ #include <stdlib.h>
+ #include <unistd.h>
+ #include <string.h>
++#include <limits.h>
+ #include <sys/time.h>
+ #include <sys/ioctl.h>
+
+@@ -2241,8 +2242,7 @@ static void syn_process_config (info_type ident,
+
+
+
+-static unsigned char tp_hextoint (unsigned char byte1,
+- unsigned char byte2)
++static unsigned char tp_hextoint (unsigned byte1,unsigned byte2)
+ {
+ unsigned char bytes [3];
+ int result;
+@@ -2250,7 +2250,7 @@ static unsigned char tp_hextoint (unsigned char byte1,
+ bytes [0] = byte1;
+ bytes [1] = byte2;
+ bytes [2] = '\0';
+- sscanf (bytes, "%x", &result);
++ sscanf ((char *)bytes, "%x", &result);
+ return result;
+ }
+
+@@ -2311,8 +2311,7 @@ static void tp_serial_read (int fd,
+ }
+
+ /* Write a string of commands */
+-static void tp_serial_send_cmd(int fd,
+- unsigned char *cmd)
++static void tp_serial_send_cmd(int fd, const char *cmd)
+ {
+ unsigned char junk [15];
+
+@@ -2329,7 +2328,7 @@ static void tp_serial_send_cmd(int fd,
+ static void syn_serial_set_mode (int fd,
+ unsigned char mode)
+ {
+- unsigned char bytes [15];
++ char bytes [15];
+
+ sprintf (bytes, "%%C3B%02X5555", mode);
+ #if DEBUG_SENT_DATA
+diff --git a/src/twiddler.c b/src/twiddler.c
+index 1d2bd50..972a616 100644
+--- a/src/twiddler.c
++++ b/src/twiddler.c
+@@ -250,7 +250,6 @@ static inline int twiddler_use_item(char *item)
+ int twiddler_key(unsigned long message)
+ {
+ char **table = twiddler_get_table(message);
+- char *val;
+ /*
+ * These two are needed to avoid transmitting single keys when typing
+ * chords. When the number of keys being held down decreases, data
+@@ -269,7 +268,6 @@ int twiddler_key(unsigned long message)
+
+ if (!table) return 0;
+ message &= 0xff;
+- val = table[message];
+
+ if ((message < last_message) && !marked) { /* ok, do it */
+ marked++; /* don't retransmit on release */
+@@ -428,8 +426,11 @@ char *twiddler_rest_to_value(char *s)
+ buf[ibuf]='\0';
+ return strdup(buf);
+ }
+- if (*ptr == '\\')
+- return (char *)twiddler_escape_sequence(ptr+1, &len /* unused */);
++ if (*ptr == '\\') {
++ buf[ibuf++] = twiddler_escape_sequence(ptr+1, &len /* unused */);
++ buf[ibuf] = '\0';
++ return strdup(buf);
++ }
+
+ if (strlen(ptr)==1) return ((char *)((unsigned long)*ptr & 0xFF));
+