tentative new jupp version; improvements for hurd, klibc, dietlibc
authorThorsten Glaser <tg@mirbsd.org>
Thu, 7 Jun 2012 22:52:08 +0000 (22:52 +0000)
committerThorsten Glaser <tg@mirbsd.org>
Thu, 7 Jun 2012 22:52:08 +0000 (22:52 +0000)
20 files changed:
Makefile.am
Makefile.in
NEWS
TODO
autoconf.h.in
b.c
compat.c [new file with mode: 0644]
configure
configure.ac
main.c
path.c
popen.inc [new file with mode: 0644]
strlfun.inc [new file with mode: 0644]
syntax.c
syntax/c.jsf.in
syntax/php.jsf.in
syntax/xml.jsf.in
tty.c
tw.c
vfile.c

index 2e1b66c..7c6dede 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/Makefile.am,v 1.7 2009/10/18 16:23:59 tg Exp $
+# $MirOS: contrib/code/jupp/Makefile.am,v 1.8 2012/06/07 22:16:07 tg Exp $
 
 AUTOMAKE_OPTIONS = foreign
 
@@ -49,7 +49,7 @@ joe_SOURCES = b.c blocks.c bw.c cmd.c hash.c help.c kbd.c macro.c main.c menu.c
        path.c poshist.c pw.c queue.c qw.c rc.c regex.c scrn.c tab.c termcap.c \
        tty.c tw.c ublock.c uedit.c uerror.c ufile.c uformat.c uisrch.c umath.c \
        undo.c usearch.c ushell.c utag.c va.c vfile.c vs.c w.c utils.c syntax.c \
-       utf8.c selinux.c i18n.c charmap.c strlfun.c builtin.c builtins.c
+       utf8.c selinux.c i18n.c charmap.c builtin.c builtins.c compat.c
 
 termidx_SOURCES = termidx.c
 
index 2686b93..936cb57 100644 (file)
@@ -14,8 +14,8 @@
 
 @SET_MAKE@
 
-# $MirOS: contrib/code/jupp/Makefile.in,v 1.10 2010/04/08 15:46:35 tg Exp $
-# $miros: contrib/code/jupp/Makefile.am,v 1.7 2009/10/18 16:23:59 tg Exp $
+# $MirOS: contrib/code/jupp/Makefile.in,v 1.11 2012/06/07 22:42:23 tg Exp $
+# $miros: contrib/code/jupp/Makefile.am,v 1.8 2012/06/07 22:16:07 tg Exp $
 
 
 
@@ -105,7 +105,7 @@ am_joe_OBJECTS = b.$(OBJEXT) blocks.$(OBJEXT) bw.$(OBJEXT) \
        utag.$(OBJEXT) va.$(OBJEXT) vfile.$(OBJEXT) vs.$(OBJEXT) \
        w.$(OBJEXT) utils.$(OBJEXT) syntax.$(OBJEXT) utf8.$(OBJEXT) \
        selinux.$(OBJEXT) i18n.$(OBJEXT) charmap.$(OBJEXT) \
-       strlfun.$(OBJEXT) builtin.$(OBJEXT) builtins.$(OBJEXT)
+       builtin.$(OBJEXT) builtins.$(OBJEXT) compat.$(OBJEXT)
 joe_OBJECTS = $(am_joe_OBJECTS)
 joe_LDADD = $(LDADD)
 am_termidx_OBJECTS = termidx.$(OBJEXT)
@@ -284,7 +284,7 @@ joe_SOURCES = b.c blocks.c bw.c cmd.c hash.c help.c kbd.c macro.c main.c menu.c
        path.c poshist.c pw.c queue.c qw.c rc.c regex.c scrn.c tab.c termcap.c \
        tty.c tw.c ublock.c uedit.c uerror.c ufile.c uformat.c uisrch.c umath.c \
        undo.c usearch.c ushell.c utag.c va.c vfile.c vs.c w.c utils.c syntax.c \
-       utf8.c selinux.c i18n.c charmap.c strlfun.c builtin.c builtins.c
+       utf8.c selinux.c i18n.c charmap.c builtin.c builtins.c compat.c
 
 termidx_SOURCES = termidx.c
 all: autoconf.h
@@ -439,6 +439,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bw.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/charmap.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cmd.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/compat.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/help.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/i18n.Po@am__quote@
@@ -455,7 +456,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regex.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scrn.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/selinux.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strlfun.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/syntax.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tab.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/termcap.Po@am__quote@
diff --git a/NEWS b/NEWS
index d21de4c..399de6c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,15 @@
-$MirOS: contrib/code/jupp/NEWS,v 1.43 2011/10/04 22:35:44 tg Exp $
+$MirOS: contrib/code/jupp/NEWS,v 1.47 2012/06/07 22:34:52 tg Exp $
 ------------------------------------------------------------------
 
+JOE 3.1jupp19
+
+- Support ncurses tinfo split
+- Use glibc specific get_current_dir_name if existent and PATH_MAX
+  is undefined (as on Debian GNU/Hurd, for example) instead of a
+  fallback value of 4096 with PATH_MAX-using code
+- Build with dietlibc (wheezy) or klibc 2.0 now works
+- Default syntax highlighting sync lines elevated to 120
+
 JOE 3.1jupp18
 
 - Fix displaying ASCII tilde in non-UTF-8 encodings
diff --git a/TODO b/TODO
index 1effc0f..004a106 100644 (file)
--- a/TODO
+++ b/TODO
@@ -646,7 +646,8 @@ Other requests:
 
 • merge syntax handling code from joe-3.7+
 • make -Wcast-qual clean
+• write a jupp(1) mdoc page
 • …
 
 _________________________________________________________________
-$MirOS: contrib/code/jupp/TODO,v 1.8 2011/10/04 22:47:51 tg Exp $
+$MirOS: contrib/code/jupp/TODO,v 1.9 2012/06/07 22:39:44 tg Exp $
index e23a205..19dba7b 100644 (file)
@@ -9,6 +9,17 @@
 /* Define to 1 if you have the <bsd/string.h> header file. */
 #undef HAVE_BSD_STRING_H
 
+/* Define to 1 if you have the `ctime' function. */
+#undef HAVE_CTIME
+
+/* Define to 1 if you have the declaration of `ctime', and to 0 if you don't.
+   */
+#undef HAVE_DECL_CTIME
+
+/* Define to 1 if you have the declaration of `popen', and to 0 if you don't.
+   */
+#undef HAVE_DECL_POPEN
+
 /* Define to 1 if you have the declaration of `strlcat', and to 0 if you
    don't. */
 #undef HAVE_DECL_STRLCAT
@@ -36,6 +47,9 @@
 /* Define to 1 if you have the `getwd' function. */
 #undef HAVE_GETWD
 
+/* Define to 1 if you have the `get_current_dir_name' function. */
+#undef HAVE_GET_CURRENT_DIR_NAME
+
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
@@ -79,6 +93,9 @@
 /* Define to 1 if you have the <paths.h> header file. */
 #undef HAVE_PATHS_H
 
+/* Define to 1 if you have the `popen' function. */
+#undef HAVE_POPEN
+
 /* We have <termios.h> and maybe <sys/termios.h> */
 #undef HAVE_POSIX_TERMIOS
 
diff --git a/b.c b/b.c
index 758b850..ec5e47c 100644 (file)
--- a/b.c
+++ b/b.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/b.c,v 1.9 2011/07/16 21:57:55 tg Exp $ */
+/* $MirOS: contrib/code/jupp/b.c,v 1.10 2012/06/07 22:16:08 tg Exp $ */
 /*
  *     Editor engine
  *     Copyright
 #include "charmap.h"
 #include "w.h"
 
+#if !HAVE_DECL_CTIME
+char *ctime(const time_t *);
+#endif
+#if !HAVE_DECL_POPEN
+FILE *popen(const char *, const char *);
+int pclose(FILE *);
+#endif
+
 unsigned char stdbuf[stdsiz];
 
 int guesscrlf = 0;
diff --git a/compat.c b/compat.c
new file mode 100644 (file)
index 0000000..f687cab
--- /dev/null
+++ b/compat.c
@@ -0,0 +1,203 @@
+/* $MirOS: contrib/code/jupp/compat.c,v 1.1 2012/06/07 22:16:09 tg Exp $ */
+
+/*-
+ * Copyright © 2004, 2005, 2006, 2007, 2011, 2012
+ *     Thorsten “mirabilos” Glaser <tg@mirbsd.org>
+ *
+ * Provided that these terms and disclaimer and all copyright notices
+ * are retained or reproduced in an accompanying document, permission
+ * is granted to deal in this work without restriction, including un‐
+ * limited rights to use, publicly perform, distribute, sell, modify,
+ * merge, give away, or sublicence.
+ *
+ * This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
+ * the utmost extent permitted by applicable law, neither express nor
+ * implied; without malicious intent or gross negligence. In no event
+ * may a licensor, author or contributor be held liable for indirect,
+ * direct, other damage, loss, or other issues arising in any way out
+ * of dealing in the work, even if advised of the possibility of such
+ * damage or existence of a defect, except proven that it results out
+ * of said person’s immediate fault when using the work as intended.
+ *-
+ * Compatibility functions for jupp.
+ *
+ * - ctime: based on mirtime from MirBSD libc; not leap second compliant
+ *   src/kern/include/mirtime.h,v 1.2 2011/11/20 23:40:11 tg Exp
+ *   src/kern/c/mirtime.c,v 1.3 2011/11/20 23:40:10 tg Exp
+ */
+
+#include "config.h"
+#include "types.h"
+
+#define __RCSID(x)     /* nothing, in jupp */
+
+#undef L_strlcat
+#undef L_strlcpy
+#ifndef HAVE_STRLCAT
+#define L_strlcat
+#endif
+#ifndef HAVE_STRLCPY
+#define L_strlcpy
+#endif
+#if defined(L_strlcat) || defined(L_strlcpy)
+#define OUTSIDE_OF_LIBKERN
+#include "strlfun.inc"
+#endif
+
+#ifndef HAVE_CTIME
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#include <limits.h>
+#include <stdio.h>
+
+typedef struct {
+       int tm_sec;             /* seconds [0-60] */
+       int tm_min;             /* minutes [0-59] */
+       int tm_hour;            /* hours [0-23] */
+       int tm_mday;            /* day of month [1-31] */
+       int tm_mon;             /* month of year - 1 [0-11] */
+       int tm_year;            /* year - 1900 */
+       int tm_wday;            /* day of week (0 = sunday) */
+} joe_tm;
+
+static void joe_timet2tm(joe_tm *, const time_t *);
+
+#if !HAVE_DECL_CTIME
+char *ctime(const time_t *);
+#endif
+
+/* 302 / 1000 is log10(2.0) rounded up */
+#define T_SIGNED(t)    (((t)-1) < 0)
+#define T_MAXLEN(t)    ((sizeof(t) * CHAR_BIT - T_SIGNED(t)) * 302 / 1000 + \
+                           /* div.trunc. */ 1 + /* minus sign */ T_SIGNED(t))
+
+static const char joe_days[7][4] = {
+       "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
+};
+
+static const char joe_months[12][4] = {
+       "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+       "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+};
+
+/*-
+ * Dimensions for the buffer, example formats:
+ * "Sun Jan  1 12:34:56 1234"
+ * "Sat Dec 31 12:34:56     12345"
+ *  <- 24 -----------------> + max.length of a year + NUL
+ */
+static char joe_ctime_buf[24 + T_MAXLEN(time_t) + 1];
+
+char *
+ctime(const time_t *tp)
+{
+       int year;
+       joe_tm tm;
+
+       joe_timet2tm(&tm, tp);
+       year = (int)(tm.tm_year + 1900);
+       joe_snprintf_7(joe_ctime_buf, sizeof(joe_ctime_buf),
+           (year >= -999 && year <= 9999) ?
+           "%s %s %2d %02d:%02d:%02d %04d" :
+           "%s %s %2d %02d:%02d:%02d     %d",
+           joe_days[tm.tm_wday], joe_months[tm.tm_mon],
+           tm.tm_mday, tm.tm_sec, tm.tm_min, tm.tm_hour, year);
+       return (joe_ctime_buf);
+}
+
+static void
+joe_timet2tm(joe_tm *tm, const time_t *tp)
+{
+       int sec, day, mon;
+       time_t y;
+
+       /* convert to MJD */
+       y = *tp;
+       sec = (int)(y % 86400);
+       y /= 86400;
+       y += 40587;
+       while (sec < 0) {
+               --y;
+               sec += 86400;
+       }
+
+       /* calculate 400-year cycle (y) and offset in it (day) */
+       day = (int)(y % 146097);
+       y /= 146097;
+
+       /* add bias: 678881 = days between "convenient origin" and MJD 0 */
+       /* convenient origin is Wed(3) 1 March 0(fictional)/-1(real) */
+       day += 678881;
+       /* recalculate offset in cycle (Gregorian Period) */
+       y += day / 146097;
+       day %= 146097;
+
+       /* days in 400 years are cyclic, they have 20871 weeks */
+       tm->tm_wday = (day + 3) % 7;
+
+       /* calculate year from period, taking leap years into account */
+       y *= 4;
+       /* a long (Julian) century is at the end of each Gregorian Period */
+       if (day == 146096) {
+               y += 3;
+               day = 36524;
+       } else {
+               y += day / 36524;
+               day %= 36524;
+       }
+       y *= 25;
+       y += day / 1461;
+       day %= 1461;
+       y *= 4;
+
+       /* March to December, or January/February? */
+       /* a leap year is at the end of each olympiad */
+       if (day == 1460) {
+               y += 3;
+               day = 365;
+       } else {
+               y += day / 365;
+               day %= 365;
+       }
+
+       /* count days and months from 1st March using fixed-point */
+       day *= 10;
+       mon = (day + 5) / 306;
+       day = (day + 5) % 306;
+       day /= 10;
+       /* adjust for Jan/Feb offset */
+       if (mon >= 10) {
+               mon -= 10;
+               ++y;
+       } else {
+               mon += 2;
+       }
+
+       /* adjust for year 0(fictional) which did not exist */
+       if (y < 1)
+               --y;
+
+       /* fill in the values still missing */
+       tm->tm_sec = sec % 60;
+       sec /= 60;
+       tm->tm_min = sec % 60;
+       tm->tm_hour = sec / 60;
+       tm->tm_mday = day + 1;
+       tm->tm_mon = mon;
+       /*XXX truncate, for joe_snprintf doesn't know %lld portably */
+       tm->tm_year = (int)(y - 1900);
+}
+#endif /* ndef HAVE_CTIME */
+
+#ifndef HAVE_POPEN
+#include "popen.inc"
+#endif
index 342078d..bb2f224 100644 (file)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61-MirPorts-1 for joe 3.1jupp18.
+# Generated by GNU Autoconf 2.61-MirPorts-1 for joe 3.1jupp19.
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
 # 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
@@ -572,8 +572,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
 # Identity of this package.
 PACKAGE_NAME='joe'
 PACKAGE_TARNAME='joe'
-PACKAGE_VERSION='3.1jupp18'
-PACKAGE_STRING='joe 3.1jupp18'
+PACKAGE_VERSION='3.1jupp19'
+PACKAGE_STRING='joe 3.1jupp19'
 PACKAGE_BUGREPORT=''
 
 ac_unique_file="b.c"
@@ -1223,7 +1223,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures joe 3.1jupp18 to adapt to many kinds of systems.
+\`configure' configures joe 3.1jupp19 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1294,7 +1294,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of joe 3.1jupp18:";;
+     short | recursive ) echo "Configuration of joe 3.1jupp19:";;
    esac
   cat <<\_ACEOF
 
@@ -1307,6 +1307,7 @@ Optional Features:
   --enable-dependency-tracking   do not reject slow dependency extractors
   --disable-curses        disable use of curses library
   --disable-termcap       disable use of termcap library
+  --disable-search-libs   do not search in any external libraries
   --disable-getpwnam      disable use of getpwnam function
   --disable-termidx       do not build the termidx binary
 
@@ -1383,7 +1384,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-joe configure 3.1jupp18
+joe configure 3.1jupp19
 generated by GNU Autoconf 2.61-MirPorts-1
 
 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@@ -1397,7 +1398,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by joe $as_me 3.1jupp18, which was
+It was created by joe $as_me 3.1jupp19, which was
 generated by GNU Autoconf 2.61-MirPorts-1.  Invocation command line was
 
   $ $0 $@
@@ -2198,7 +2199,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='joe'
- VERSION='3.1jupp18'
+ VERSION='3.1jupp19'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -3957,6 +3958,9 @@ case $host in
        CPPFLAGS="$CPPFLAGS -I/usr/local/include"
        LDFLAGS="$LDFLAGS -L/usr/local/lib -R/usr/local/lib"
        ;;
+*-gnu*)
+       CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
+       ;;
 esac
 
 case $host in
@@ -3969,7 +3973,14 @@ _ACEOF
        ;;
 esac
 
+
 # Checks for libraries.
+
+search_libs_selinux="selinux"
+search_libs_snprintf="snprintf db"
+search_libs_term=""
+search_libs_util="util"
+
 # Check whether --enable-curses was given.
 if test "${enable_curses+set}" = set; then
   enableval=$enable_curses; curses=$enableval
@@ -3977,10 +3988,8 @@ else
   curses=yes
 fi
 
-
-if test "$curses" = "yes"; then
-       search_libs="ncurses curses"
-fi
+test x"$curses" = x"yes" && \
+    search_libs_term="$search_libs_term tinfo ncurses curses"
 
 # Check whether --enable-termcap was given.
 if test "${enable_termcap+set}" = set; then
@@ -3989,42 +3998,25 @@ else
   termcap=yes
 fi
 
+test x"$termcap" = x"yes" && \
+    search_libs_term="$search_libs_term termcap"
 
-if test "$termcap" = "yes"; then
-       search_libs="$search_libs termcap"
-fi
-
-# Check whether --enable-getpwnam was given.
-if test "${enable_getpwnam+set}" = set; then
-  enableval=$enable_getpwnam; getpwnam=$enableval
-else
-  getpwnam=yes
-fi
-
-
-if test x"$getpwnam" = x"no"; then
-       CPPFLAGS="$CPPFLAGS -DJOE_NOPWNAM"
-fi
-
-# Check whether --enable-termidx was given.
-if test "${enable_termidx+set}" = set; then
-  enableval=$enable_termidx; termidx=$enableval
+# Check whether --enable-search_libs was given.
+if test "${enable_search_libs+set}" = set; then
+  enableval=$enable_search_libs; search_libs=$enableval
 else
-  termidx=yes
+  search_libs=yes
 fi
 
 
-
-if test x"$termidx" != x"no"; then
-  WANT_TERMIDX_TRUE=
-  WANT_TERMIDX_FALSE='#'
-else
-  WANT_TERMIDX_TRUE='#'
-  WANT_TERMIDX_FALSE=
+if test x"$search_libs" = x"no"; then
+       search_libs_selinux=""
+       search_libs_snprintf=""
+       search_libs_term=""
+       search_libs_util=""
 fi
 
 
-
 { echo "$as_me:$LINENO: checking for library containing openpty" >&5
 echo $ECHO_N "checking for library containing openpty... $ECHO_C" >&6; }
 if test "${ac_cv_search_openpty+set}" = set; then
@@ -4053,7 +4045,7 @@ return openpty ();
   return 0;
 }
 _ACEOF
-for ac_lib in '' util; do
+for ac_lib in '' $search_libs_util; do
   if test -z "$ac_lib"; then
     ac_res="none required"
   else
@@ -4140,7 +4132,7 @@ return login_tty ();
   return 0;
 }
 _ACEOF
-for ac_lib in '' util; do
+for ac_lib in '' $search_libs_util; do
   if test -z "$ac_lib"; then
     ac_res="none required"
   else
@@ -4227,7 +4219,7 @@ return tgetflag ();
   return 0;
 }
 _ACEOF
-for ac_lib in '' $search_libs; do
+for ac_lib in '' $search_libs_term; do
   if test -z "$ac_lib"; then
     ac_res="none required"
   else
@@ -4314,7 +4306,7 @@ return snprintf ();
   return 0;
 }
 _ACEOF
-for ac_lib in '' snprintf db; do
+for ac_lib in '' $search_libs_snprintf; do
   if test -z "$ac_lib"; then
     ac_res="none required"
   else
@@ -4401,7 +4393,7 @@ return is_selinux_enabled ();
   return 0;
 }
 _ACEOF
-for ac_lib in '' selinux; do
+for ac_lib in '' $search_libs_selinux; do
   if test -z "$ac_lib"; then
     ac_res="none required"
   else
@@ -4461,8 +4453,40 @@ _ACEOF
 fi
 
 
+
+# other conditionals
+
+# Check whether --enable-getpwnam was given.
+if test "${enable_getpwnam+set}" = set; then
+  enableval=$enable_getpwnam; getpwnam=$enableval
+else
+  getpwnam=yes
+fi
+
+test x"$getpwnam" = x"no" && CPPFLAGS="$CPPFLAGS -DJOE_NOPWNAM"
+
+# Check whether --enable-termidx was given.
+if test "${enable_termidx+set}" = set; then
+  enableval=$enable_termidx; termidx=$enableval
+else
+  termidx=yes
+fi
+
+
+
+if test x"$termidx" != x"no"; then
+  WANT_TERMIDX_TRUE=
+  WANT_TERMIDX_FALSE='#'
+else
+  WANT_TERMIDX_TRUE='#'
+  WANT_TERMIDX_FALSE=
+fi
+
+
+
 # Checks for header files.
 
+
 { echo "$as_me:$LINENO: checking for ANSI C header files" >&5
 echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
 if test "${ac_cv_header_stdc+set}" = set; then
@@ -5337,6 +5361,7 @@ _ACEOF
 fi
 
 # Checks for typedefs, structures, and compiler characteristics.
+
 { echo "$as_me:$LINENO: checking for function prototypes" >&5
 echo $ECHO_N "checking for function prototypes... $ECHO_C" >&6; }
 if test "$ac_cv_prog_cc_c89" != no; then
@@ -8369,6 +8394,7 @@ fi
 
 
 # Checks for library functions.
+
 if test $ac_cv_c_compiler_gnu = yes; then
     { echo "$as_me:$LINENO: checking whether $CC needs -traditional" >&5
 echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6; }
@@ -9454,7 +9480,10 @@ done
 
 
 
-for ac_func in strlcpy strlcat nl_langinfo
+
+
+
+for ac_func in strlcpy strlcat nl_langinfo get_current_dir_name ctime popen
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
 { echo "$as_me:$LINENO: checking for $ac_func" >&5
@@ -9683,6 +9712,138 @@ _ACEOF
 
 
 fi
+{ echo "$as_me:$LINENO: checking whether ctime is declared" >&5
+echo $ECHO_N "checking whether ctime is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_ctime+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+#ifndef ctime
+  (void) ctime;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_ctime=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_ctime=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_ctime" >&5
+echo "${ECHO_T}$ac_cv_have_decl_ctime" >&6; }
+if test $ac_cv_have_decl_ctime = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_CTIME 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_CTIME 0
+_ACEOF
+
+
+fi
+{ echo "$as_me:$LINENO: checking whether popen is declared" >&5
+echo $ECHO_N "checking whether popen is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_popen+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+#ifndef popen
+  (void) popen;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && {
+        test -z "$ac_c_werror_flag" ||
+        test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then
+  ac_cv_have_decl_popen=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_cv_have_decl_popen=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_popen" >&5
+echo "${ECHO_T}$ac_cv_have_decl_popen" >&6; }
+if test $ac_cv_have_decl_popen = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_POPEN 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_POPEN 0
+_ACEOF
+
+
+fi
 
 
 
@@ -9793,15 +9954,6 @@ _ACEOF
        fi
 
 
-# check if -liconv is necessary
-# if iconv() is in libc, don't bother with -liconv
-#AC_CHECK_LIB(c,iconv,
-#  [REQRD_LIBS= ],
-#  [REQRD_LIBS=-liconv])
-#
-#AC_SUBST(REQRD_LIBS)
-
-
 
 
 
@@ -10271,7 +10423,7 @@ exec 6>&1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by joe $as_me 3.1jupp18, which was
+This file was extended by joe $as_me 3.1jupp19, which was
 generated by GNU Autoconf 2.61-MirPorts-1.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -10324,7 +10476,7 @@ Report bugs to <bug-autoconf@gnu.org>."
 _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF
 ac_cs_version="\\
-joe config.status 3.1jupp18
+joe config.status 3.1jupp19
 configured by $0, generated by GNU Autoconf 2.61-MirPorts-1,
   with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
 
index d3b1495..d3a5832 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/configure.ac,v 1.29 2011/10/04 22:47:51 tg Exp $
+# $MirOS: contrib/code/jupp/configure.ac,v 1.35 2012/06/07 22:39:53 tg Exp $
 #-
 # Process this file with autoconf to produce a configure script.
 
@@ -6,7 +6,7 @@
 AC_PREREQ(2.54)
 
 #### Here's the only place where to change version number ####
-AC_INIT(joe, 3.1jupp18)
+AC_INIT(joe, 3.1jupp19)
 #### But see main.c for the Copyright (c) owner and year! ####
 AC_CONFIG_SRCDIR([b.c])
 
@@ -34,6 +34,9 @@ case $host in
        CPPFLAGS="$CPPFLAGS -I/usr/local/include"
        LDFLAGS="$LDFLAGS -L/usr/local/lib -R/usr/local/lib"
        ;;
+*-gnu*)
+       CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
+       ;;
 esac
 
 case $host in
@@ -42,43 +45,59 @@ case $host in
        ;;
 esac
 
+
 # Checks for libraries.
+
+search_libs_selinux="selinux"
+search_libs_snprintf="snprintf db"
+search_libs_term=""
+search_libs_util="util"
+
 AC_ARG_ENABLE(curses,
 [  --disable-curses        disable use of curses library],
        curses=$enableval, curses=yes)
-
-if test "$curses" = "yes"; then
-       search_libs="ncurses curses"
-fi
+test x"$curses" = x"yes" && \
+    search_libs_term="$search_libs_term tinfo ncurses curses"
 
 AC_ARG_ENABLE(termcap,
 [  --disable-termcap       disable use of termcap library],
        termcap=$enableval, termcap=yes)
-
-if test "$termcap" = "yes"; then
-       search_libs="$search_libs termcap"
+test x"$termcap" = x"yes" && \
+    search_libs_term="$search_libs_term termcap"
+
+AC_ARG_ENABLE([search_libs],
+[  --disable-search-libs   do not search in any external libraries],
+       search_libs=$enableval, search_libs=yes)
+
+if test x"$search_libs" = x"no"; then
+       search_libs_selinux=""
+       search_libs_snprintf=""
+       search_libs_term=""
+       search_libs_util=""
 fi
 
+AC_SEARCH_LIBS(openpty, $search_libs_util, AC_DEFINE_UNQUOTED(HAVE_OPENPTY, 1, [If we have BSD function openpty()]))
+AC_SEARCH_LIBS(login_tty, $search_libs_util, AC_DEFINE_UNQUOTED(HAVE_LOGIN_TTY, 1, [If we have BSD function login_tty()]))
+AC_SEARCH_LIBS(tgetflag, $search_libs_term, AC_DEFINE_UNQUOTED(TERMINFO, 1, [If we have newer terminfo/termcap capabilities]))
+AC_SEARCH_LIBS(snprintf, $search_libs_snprintf, AC_DEFINE_UNQUOTED(HAVE_SNPRINTF, 1, [If we have snprintf]))
+AC_SEARCH_LIBS(is_selinux_enabled, $search_libs_selinux, AC_DEFINE_UNQUOTED(HAVE_SELINUX_FUN, 1, [We have SELinux functions]))
+
+
+# other conditionals
+
 AC_ARG_ENABLE([getpwnam],
 [  --disable-getpwnam      disable use of getpwnam function],
        getpwnam=$enableval, getpwnam=yes)
-
-if test x"$getpwnam" = x"no"; then
-       CPPFLAGS="$CPPFLAGS -DJOE_NOPWNAM"
-fi
+test x"$getpwnam" = x"no" && CPPFLAGS="$CPPFLAGS -DJOE_NOPWNAM"
 
 AC_ARG_ENABLE([termidx],
 [  --disable-termidx       do not build the termidx binary],
        termidx=$enableval, termidx=yes)
 AM_CONDITIONAL([WANT_TERMIDX], [test x"$termidx" != x"no"])
 
-AC_SEARCH_LIBS(openpty, util, AC_DEFINE_UNQUOTED(HAVE_OPENPTY, 1, [If we have BSD function openpty()]))
-AC_SEARCH_LIBS(login_tty, util, AC_DEFINE_UNQUOTED(HAVE_LOGIN_TTY, 1, [If we have BSD function login_tty()]))
-AC_SEARCH_LIBS(tgetflag, $search_libs, AC_DEFINE_UNQUOTED(TERMINFO, 1, [If we have newer terminfo/termcap capabilities]))
-AC_SEARCH_LIBS(snprintf, snprintf db, AC_DEFINE_UNQUOTED(HAVE_SNPRINTF, 1, [If we have snprintf]))
-AC_SEARCH_LIBS(is_selinux_enabled, selinux, AC_DEFINE_UNQUOTED(HAVE_SELINUX_FUN, 1, [We have SELinux functions]))
 
 # Checks for header files.
+
 AC_CHECK_HEADERS([ \
        sys/dirent.h sys/ioctl.h sys/param.h sys/stat.h sys/termio.h \
        sys/termios.h sys/time.h sys/types.h sys/wait.h errno.h fcntl.h \
@@ -105,6 +124,7 @@ if test "$ac_cv_header_selinux_selinux_h" = "yes" -a "$ac_cv_header_selinux_cont
 fi
 
 # Checks for typedefs, structures, and compiler characteristics.
+
 AC_C_PROTOTYPES
 AC_C_CONST
 if test "$cross_compiling" = "yes" ; then
@@ -126,6 +146,7 @@ AC_CHECK_TYPE([sighandler_t],
 #endif])
 
 # Checks for library functions.
+
 AC_PROG_GCC_TRADITIONAL
 AC_FUNC_LSTAT
 joe_SETPGRP
@@ -148,23 +169,12 @@ if test x"$ac_cv_func_isblank" = xyes; then
 fi
 AC_CHECK_FUNCS([alarm mkdir mkstemp putenv setlocale strchr strdup utime setpgid])
 AC_CHECK_FUNCS([setitimer sigaction sigvec siginterrupt sigprocmask])
-AC_CHECK_FUNCS([strlcpy strlcat nl_langinfo])
+AC_CHECK_FUNCS([strlcpy strlcat nl_langinfo get_current_dir_name ctime popen])
 
-AC_CHECK_DECLS([strlcpy, strlcat])
+AC_CHECK_DECLS([strlcpy, strlcat, ctime, popen])
 
 joe_REINSTALL_SIGHANDLERS
 
-# check if -liconv is necessary
-# if iconv() is in libc, don't bother with -liconv
-#AC_CHECK_LIB(c,iconv,
-#  [REQRD_LIBS= ],
-#  [REQRD_LIBS=-liconv])
-#
-#AC_SUBST(REQRD_LIBS)
-
-dnl not yet :-)
-dnl AM_GNU_GETTEXT
-
 AH_VERBATIM([_PARAMS],[/* Check to see if we can use strict prototypes */
 #ifndef PARAMS
 #  ifdef PROTOTYPES
diff --git a/main.c b/main.c
index da954c8..c6b8707 100644 (file)
--- a/main.c
+++ b/main.c
@@ -1,6 +1,6 @@
-/* $MirOS: contrib/code/jupp/main.c,v 1.15 2011/10/04 22:25:52 tg Exp $ */
+/* $MirOS: contrib/code/jupp/main.c,v 1.16 2012/06/07 22:39:54 tg Exp $ */
 
-#define JUPP_IS_COPYRIGHT_C_BY "2011 mirabilos"
+#define JUPP_IS_COPYRIGHT_C_BY "2012 mirabilos"
 
 /*
  *     Editor startup and main edit loop
diff --git a/path.c b/path.c
index f5d2a71..2642747 100644 (file)
--- a/path.c
+++ b/path.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/path.c,v 1.5 2010/04/08 15:31:02 tg Exp $ */
+/* $MirOS: contrib/code/jupp/path.c,v 1.7 2012/06/07 22:18:23 tg Exp $ */
 /* 
  *     Directory and path functions
  *     Copyright
 #include "vs.h"
 #include "va.h"
 
+#ifdef TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# ifdef HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
 #ifdef HAVE_DIRENT_H
 #  include <dirent.h>
 #  define NAMLEN(dirent) strlen((dirent)->d_name)
@@ -82,7 +93,7 @@
 #  endif
 #endif
 
-#ifndef PATH_MAX
+#if !defined(PATH_MAX) && !defined(HAVE_GET_CURRENT_DIR_NAME)
 #warning What should we include to have PATH_MAX defined?
 #define PATH_MAX       4096
 #endif
@@ -399,6 +410,7 @@ int chpwd(unsigned char *path)
 /* The pwd function */
 unsigned char *pwd(void)
 {
+#if defined(PATH_MAX) || !defined(HAVE_GET_CURRENT_DIR_NAME)
        static unsigned char buf[PATH_MAX];
        unsigned char   *ret;
 
@@ -410,4 +422,12 @@ unsigned char *pwd(void)
        buf[PATH_MAX - 1] = '\0';
 
        return ret;
+#else
+       /* Hurd */
+       static char *wd = NULL;
+
+       free(wd);
+       wd = get_current_dir_name();
+       return ((void *)wd);
+#endif
 }
diff --git a/popen.inc b/popen.inc
new file mode 100644 (file)
index 0000000..e29ac56
--- /dev/null
+++ b/popen.inc
@@ -0,0 +1,169 @@
+/*     $OpenBSD: popen.c,v 1.17 2005/08/08 08:05:34 espie Exp $ */
+/*
+ * Copyright (c) 1988, 1993
+ *     The Regents of the University of California.  All rights reserved.
+ *
+ * This code is derived from software written by Ken Arnold and
+ * published in UNIX Review, Vol. 6, No. 8.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/param.h>
+#include <sys/wait.h>
+
+#include <signal.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <paths.h>
+
+__RCSID("$MirOS: contrib/code/jupp/popen.inc,v 1.3 2005/09/22 20:40:00 tg Exp $");
+
+static struct pid {
+       struct pid *next;
+       FILE *fp;
+       pid_t pid;
+} *pidlist;
+
+FILE *
+popen(const char *program, const char *type)
+{
+       struct pid * volatile cur;
+       FILE *iop;
+       int pdes[2];
+       pid_t pid;
+
+       if ((*type != 'r' && *type != 'w') || type[1] != '\0') {
+               errno = EINVAL;
+               return (NULL);
+       }
+
+       if ((cur = malloc(sizeof(struct pid))) == NULL)
+               return (NULL);
+
+       if (pipe(pdes) < 0) {
+               free(cur);
+               return (NULL);
+       }
+
+       switch (pid = vfork()) {
+       case -1:                        /* Error. */
+               (void)close(pdes[0]);
+               (void)close(pdes[1]);
+               free(cur);
+               return (NULL);
+               /* NOTREACHED */
+       case 0:                         /* Child. */
+           {
+               struct pid *pcur;
+               /*
+                * because vfork() instead of fork(), must leak FILE *,
+                * but luckily we are terminally headed for an execl()
+                */
+               for (pcur = pidlist; pcur; pcur = pcur->next)
+                       close(fileno(pcur->fp));
+
+               if (*type == 'r') {
+                       int tpdes1 = pdes[1];
+
+                       (void) close(pdes[0]);
+                       /*
+                        * We must NOT modify pdes, due to the
+                        * semantics of vfork.
+                        */
+                       if (tpdes1 != STDOUT_FILENO) {
+                               (void)dup2(tpdes1, STDOUT_FILENO);
+                               (void)close(tpdes1);
+                               tpdes1 = STDOUT_FILENO;
+                       }
+               } else {
+                       (void)close(pdes[1]);
+                       if (pdes[0] != STDIN_FILENO) {
+                               (void)dup2(pdes[0], STDIN_FILENO);
+                               (void)close(pdes[0]);
+                       }
+               }
+               execl(_PATH_BSHELL, "sh", "-c", program, (char *)NULL);
+               _exit(127);
+               /* NOTREACHED */
+           }
+       }
+
+       /* Parent; assume fdopen can't fail. */
+       if (*type == 'r') {
+               iop = fdopen(pdes[0], type);
+               (void)close(pdes[1]);
+       } else {
+               iop = fdopen(pdes[1], type);
+               (void)close(pdes[0]);
+       }
+
+       /* Link into list of file descriptors. */
+       cur->fp = iop;
+       cur->pid =  pid;
+       cur->next = pidlist;
+       pidlist = cur;
+
+       return (iop);
+}
+
+/*
+ * pclose --
+ *     Pclose returns -1 if stream is not associated with a `popened' command,
+ *     if already `pclosed', or waitpid returns an error.
+ */
+int
+pclose(FILE *iop)
+{
+       struct pid *cur, *last;
+       int pstat;
+       pid_t pid;
+
+       /* Find the appropriate file pointer. */
+       for (last = NULL, cur = pidlist; cur; last = cur, cur = cur->next)
+               if (cur->fp == iop)
+                       break;
+
+       if (cur == NULL)
+               return (-1);
+
+       (void)fclose(iop);
+
+       do {
+               pid = waitpid(cur->pid, &pstat, 0);
+       } while (pid == -1 && errno == EINTR);
+
+       /* Remove the entry from the linked list. */
+       if (last == NULL)
+               pidlist = cur->next;
+       else
+               last->next = cur->next;
+       free(cur);
+
+       return (pid == -1 ? -1 : pstat);
+}
diff --git a/strlfun.inc b/strlfun.inc
new file mode 100644 (file)
index 0000000..5b75a1c
--- /dev/null
@@ -0,0 +1,185 @@
+#if 0 /* comment in gmake; next line ignored by gcc */
+ifeq (0,gmake ignores from here)
+#endif
+/*-
+ * Copyright (c) 2006, 2008, 2011
+ *     Thorsten Glaser <tg@mirbsd.org>
+ *
+ * Provided that these terms and disclaimer and all copyright notices
+ * are retained or reproduced in an accompanying document, permission
+ * is granted to deal in this work without restriction, including un-
+ * limited rights to use, publicly perform, distribute, sell, modify,
+ * merge, give away, or sublicence.
+ *
+ * This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
+ * the utmost extent permitted by applicable law, neither express nor
+ * implied; without malicious intent or gross negligence. In no event
+ * may a licensor, author or contributor be held liable for indirect,
+ * direct, other damage, loss, or other issues arising in any way out
+ * of dealing in the work, even if advised of the possibility of such
+ * damage or existence of a defect, except proven that it results out
+ * of said person's immediate fault when using the work as intended.
+ *-
+ * The original implementations of strlcpy(3) and strlcat(3) are from
+ * Todd C. Miller; the licence is reproduced below. However, this ap-
+ * plies only to the strlcpy(3) portion of the code, as Thorsten Gla-
+ * ser write the following strlcat(3) implementation according to the
+ * spec. Both functions below have been optimised according to sugge-
+ * stions from Bodo Eggert. Thorsten Glaser also has merged this code
+ * with strxfrm(3) for ISO-10646-only systems and the wide char vari-
+ * ants wcslcat(3), wcslcpy(3), and wcsxfrm(3).
+ */
+
+#include <sys/types.h>
+#ifndef OUTSIDE_OF_LIBKERN
+#include <libckern.h>
+#endif
+
+#ifndef __RCSID
+#define __RCSID(x)             static const char __rcsid[] = x
+#endif
+
+__RCSID("$MirOS: contrib/code/jupp/strlfun.inc,v 1.4 2011/11/11 20:39:31 tg Exp $");
+
+#ifdef WIDEC
+#ifdef OUTSIDE_OF_LIBKERN
+#ifdef __WCHAR_TYPE__
+typedef __WCHAR_TYPE__ wchar_t;
+#else
+#include <wchar.h>
+#endif
+#endif
+/* wide character string functions */
+#define NUL                    L'\0'
+#define char_t                 wchar_t
+#define fn_len                 wcslen
+#define        fn_cat                  wcslcat
+#define fn_cpy                 wcslcpy
+#else
+/* (multibyte) string functions */
+#define NUL                    '\0'
+#define char_t                 char
+#define fn_len                 strlen
+#define        fn_cat                  strlcat
+#define fn_cpy                 strlcpy
+#endif
+
+#ifdef L_strxfrm
+#define strlcpy                        strxfrm
+#define wcslcpy                        wcsxfrm
+#define L_strlcpy
+#endif
+
+#ifdef OUTSIDE_OF_LIBKERN
+extern size_t fn_len(const char_t *);
+#endif
+
+#ifndef __predict_true
+#define __predict_true(exp)    (exp)
+#define __predict_false(exp)   (exp)
+#endif
+
+#ifdef L_strlcat
+/*
+ * Appends src to string dst of size dlen (unlike strncat, dlen is the
+ * full size of dst, not space left).  At most dlen-1 characters
+ * will be copied.  Always NUL terminates (unless dlen <= strlen(dst)).
+ * Returns strlen(src) + MIN(dlen, strlen(initial dst)), without the
+ * trailing NUL byte counted.  If retval >= dlen, truncation occurred.
+ */
+size_t
+fn_cat(char_t *dst, const char_t *src, size_t dlen)
+{
+       size_t n = 0, slen;
+
+       slen = fn_len(src);
+       while (__predict_true(n + 1 < dlen && dst[n] != NUL))
+               ++n;
+       if (__predict_false(dlen == 0 || dst[n] != NUL))
+               return (dlen + slen);
+       while (__predict_true((slen > 0) && (n < (dlen - 1)))) {
+               dst[n++] = *src++;
+               --slen;
+       }
+       dst[n] = NUL;
+       return (n + slen);
+}
+#endif
+
+#ifdef L_strlcpy
+/* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */
+
+/*-
+ * Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * Copy src to string dst of size siz.  At most siz-1 characters
+ * will be copied.  Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t
+fn_cpy(char_t *dst, const char_t *src, size_t siz)
+{
+       const char_t *s = src;
+
+       if (__predict_false(siz == 0))
+               goto traverse_src;
+
+       /* copy as many chars as will fit */
+       while (--siz && (*dst++ = *s++))
+               ;
+
+       /* not enough room in dst */
+       if (__predict_false(siz == 0)) {
+               /* safe to NUL-terminate dst since we copied <= siz-1 chars */
+               *dst = NUL;
+ traverse_src:
+               /* traverse rest of src */
+               while (*s++)
+                       ;
+       }
+
+       /* count does not include NUL */
+       return (s - src - 1);
+}
+#endif
+
+#if 0 /* gcc ignored from here; gmake stops ignoring */
+endif
+
+USE_WIDEC?=    1
+
+LIB=           libstrlfun.a
+OBJS=          strlcpy.o strlcat.o
+ifeq (1,$(strip $(USE_WIDEC)))
+OBJS+=         wcslcpy.o wcslcat.o
+endif
+DEFS=          -DOUTSIDE_OF_LIBKERN
+DEFS_strlcpy.o=        -DL_strlcpy
+DEFS_strlcat.o=        -DL_strlcat
+DEFS_wcslcpy.o=        -DL_strlcpy -DWIDEC
+DEFS_wcslcat.o=        -DL_strlcat -DWIDEC
+
+all: $(LIB)
+
+$(LIB): $(OBJS)
+       ar rc $(LIB) $(OBJS)
+       -ranlib $(LIB)
+
+$(OBJS): strlfun.c
+       $(CC) $(CFLAGS) $(CPPFLAGS) $(DEFS) $(DEFS_$@) -c -o $@ strlfun.c
+
+#endif /* EOF for gmake and gcc */
index a7ea526..bd30301 100644 (file)
--- a/syntax.c
+++ b/syntax.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/syntax.c,v 1.6 2011/07/02 16:26:10 tg Exp $ */
+/* $MirOS: contrib/code/jupp/syntax.c,v 1.7 2012/06/07 22:34:52 tg Exp $ */
 /*
  *     Syntax highlighting DFA interpreter
  *     Copyright
@@ -208,7 +208,7 @@ struct high_syntax *load_dfa(unsigned char *name)
        syntax->nstates = 0;
        syntax->color = 0;
        syntax->states = malloc(sizeof(struct high_state *)*(syntax->szstates=64));
-       syntax->sync_lines = 50;
+       syntax->sync_lines = 120;
        syntax->default_cmd.noeat = 0;
        syntax->default_cmd.recolor = 0;
        syntax->default_cmd.start_buffering = 0;
index 2a7154e..4f710ec 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/syntax/c.jsf.in,v 1.2 2008/05/13 16:17:44 tg Exp $
+# $MirOS: contrib/code/jupp/syntax/c.jsf.in,v 1.3 2012/06/07 22:34:53 tg Exp $
 #-
 # JOE syntax highlight file for C and C++
 
@@ -69,7 +69,7 @@
 # You can say:
 # -200     means 200 lines
 # -        means always start parsing from beginning of file when we lose sync
-#          if nothing is specified, the default is -50
+#          if nothing is specified, the default is -120
 
 # Define colors
 #
index 8b34e26..7ba5b71 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/syntax/php.jsf.in,v 1.2 2008/05/13 16:17:45 tg Exp $
+# $MirOS: contrib/code/jupp/syntax/php.jsf.in,v 1.3 2012/06/07 22:34:53 tg Exp $
 #-
 # JOE syntax highlight file for PHP
 
@@ -12,7 +12,7 @@
 # You can say:
 # -200     means 200 lines
 # -        means always start parsing from beginning of file when we lose sync
-#          if nothing is specified, the default is -50
+#          if nothing is specified, the default is -120
 
 -
 
index e0ebffd..ec1bffd 100644 (file)
@@ -1,4 +1,4 @@
-# $MirOS: contrib/code/jupp/syntax/xml.jsf.in,v 1.2 2008/05/13 16:17:46 tg Exp $
+# $MirOS: contrib/code/jupp/syntax/xml.jsf.in,v 1.3 2012/06/07 22:34:54 tg Exp $
 #-
 # Improved XML highlighter by: Brian Candler <B.Candler@pobox.com>
 
@@ -6,7 +6,7 @@
 # You can say:
 # -200     means 200 lines
 # -        means always start parsing from beginning of file when we lose sync
-#          if nothing is specified, the default is -50
+#          if nothing is specified, the default is -120
 
 -
 
diff --git a/tty.c b/tty.c
index a164882..579084e 100644 (file)
--- a/tty.c
+++ b/tty.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/tty.c,v 1.15 2011/07/16 21:57:57 tg Exp $ */
+/* $MirOS: contrib/code/jupp/tty.c,v 1.16 2012/06/07 22:14:17 tg Exp $ */
 /*
  *     UNIX Tty and Process interface
  *     Copyright
@@ -1141,10 +1141,13 @@ MPX *mpxmk(int *ptyfd, unsigned char *cmd, unsigned char **args, void (*func) (/
 #endif
 
                                /* Open stdout, stderr */
-                               dup(x);
-                               dup(x); /* Standard output, standard error */
-                               /* (yes, stdin, stdout, and stderr must all be open for reading and
-                                * writing.  On some systems the shell assumes this */
+                               if (dup(x)) {}  /* standard output */
+                               if (dup(x)) {}  /* standard error */
+                               /*
+                                * yes, stdin, stdout, and stderr must
+                                * all be open for reading and writing.
+                                * On some systems the shell assumes this.
+                                */
 #endif
 
                                /* We could probably have a special TTY set-up for JOE, but for now
diff --git a/tw.c b/tw.c
index eb7aa18..3f7950f 100644 (file)
--- a/tw.c
+++ b/tw.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/tw.c,v 1.7 2010/04/08 15:31:04 tg Exp $ */
+/* $MirOS: contrib/code/jupp/tw.c,v 1.8 2012/06/07 22:16:09 tg Exp $ */
 /* 
  *     Text editing windows
  *     Copyright
 #include "charmap.h"
 #include "w.h"
 
+#if !HAVE_DECL_CTIME
+char *ctime(const time_t *);
+#endif
+
 extern int square;
 int staen = 0;
 int staupd = 0;
diff --git a/vfile.c b/vfile.c
index 5609f8a..e43cc57 100644 (file)
--- a/vfile.c
+++ b/vfile.c
@@ -1,4 +1,4 @@
-/* $MirOS: contrib/code/jupp/vfile.c,v 1.4 2011/07/16 21:57:58 tg Exp $ */
+/* $MirOS: contrib/code/jupp/vfile.c,v 1.6 2012/06/07 22:30:49 tg Exp $ */
 /*
  *     Software virtual memory system
  *     Copyright
@@ -37,6 +37,8 @@ unsigned char *vbase;                 /* Data first entry in vheader refers to */
 VPAGE **vheaders = NULL;       /* Array of header addresses */
 static int vheadsz = 0;                /* No. entries allocated to vheaders */
 
+static unsigned int joe_random(void);
+
 void vflsh(void)
 {
        VPAGE *vp;
@@ -179,14 +181,14 @@ unsigned char *vlock(VFILE *vfile, unsigned long addr)
                }
        }
 
-       for (y = HTSIZE, x = (random() & (HTSIZE - 1)); y; x = ((x + 1) & (HTSIZE - 1)), --y)
+       for (y = HTSIZE, x = (joe_random() & (HTSIZE - 1)); y; x = ((x + 1) & (HTSIZE - 1)), --y)
                for (pp = (VPAGE *) (htab + x), vp = pp->next; vp; pp = vp, vp = vp->next)
                        if (!vp->count && !vp->dirty) {
                                pp->next = vp->next;
                                goto gotit;
                        }
        vflsh();
-       for (y = HTSIZE, x = (random() & (HTSIZE - 1)); y; x = ((x + 1) & (HTSIZE - 1)), --y)
+       for (y = HTSIZE, x = (joe_random() & (HTSIZE - 1)); y; x = ((x + 1) & (HTSIZE - 1)), --y)
                for (pp = (VPAGE *) (htab + x), vp = pp->next; vp; pp = vp, vp = vp->next)
                        if (!vp->count && !vp->dirty) {
                                pp->next = vp->next;
@@ -236,35 +238,6 @@ VFILE *vtmp(void)
        return enqueb_f(VFILE, link, &vfiles, new);
 }
 
-#ifdef junk
-
-VFILE *vopen(name)
-unsigned char *name;
-{
-       struct stat buf;
-       VFILE *new = (VFILE *) joe_malloc(sizeof(VFILE));
-
-       new->name = vsncpy(NULL, 0, sz(name));
-       new->fd = open(name, O_RDWR);
-       if (!new->fd) {
-               fprintf(stderr, "Couldn\'t open file \'%s\'\n", name);
-               joe_free(new);
-               return NULL;
-       }
-       fstat(new->fd, &buf);
-       new->size = buf.st_size;
-       new->alloc = new->size;
-       new->left = 0;
-       new->lv = 0;
-       new->vpage = NULL;
-       new->flags = 0;
-       new->vpage1 = NULL;
-       new->addr = -1;
-       return enqueb_f(VFILE, link, &vfiles, new);
-}
-
-#endif
-
 void vclose(VFILE *vfile)
 {
        VPAGE *vp, *pp;
@@ -297,53 +270,6 @@ void vclose(VFILE *vfile)
                        }
 }
 
-#ifdef junk
-/* this is now broken */
-void vlimit(amount)
-long amount;
-{
-       VPAGE *vp, *pp;
-       int x, y;
-
-       maxvalloc = amount;
-       while (curvalloc > maxvalloc)
-               if (freepages) {
-                       vp = freepages;
-                       freepages = vp->next;
-                       joe_free(vp->data);
-                       joe_free(vp);
-                       curvalloc -= PGSIZE;
-               } else {
-                     again:
-                       for (y = HTSIZE, x = (random() & (HTSIZE - 1)); y; x = ((x + 1) & (HTSIZE - 1)), --y)
-                               for (pp = (VPAGE *) (htab + x), vp = pp->next; vp; pp = vp, vp = vp->next)
-                                       if (!vp->count && !vp->dirty) {
-                                               pp->next = vp->next;
-                                               joe_free(vp->data);
-                                               joe_free(vp);
-                                               if ((curvalloc -= PGSIZE)
-                                                   <= maxvalloc)
-                                                       return;
-                                               goto again;
-                                       }
-                       vflsh();
-                     again1:
-                       for (y = HTSIZE, x = (random() & (HTSIZE - 1)); y; x = ((x + 1) & (HTSIZE - 1)), --y)
-                               for (pp = (VPAGE *) (htab + x), vp = pp->next; vp; pp = vp, vp = vp->next)
-                                       if (!vp->count && !vp->dirty) {
-                                               pp->next = vp->next;
-                                               joe_free(vp->data);
-                                               joe_free(vp);
-                                               if ((curvalloc -= PGSIZE)
-                                                   <= maxvalloc)
-                                                       return;
-                                               goto again1;
-                                       }
-                       return;
-               }
-}
-#endif
-
 long my_valloc(VFILE *vfile, long int size)
 {
        long start = vsize(vfile);
@@ -358,441 +284,13 @@ long my_valloc(VFILE *vfile, long int size)
        return start;
 }
 
-#ifdef junk
-
-void vseek(vfile, addr)
-VFILE *vfile;
-long addr;
-{
-       vfile->alloc = vsize(vfile);
-       if (addr > vfile->alloc)
-               vfile->alloc = addr;
-       if (!vfile->vpage)
-               vfile->vpage = vlock(vfile, addr & ~(long) (PGSIZE - 1));
-       else if (vheader(vfile->vpage)->addr != (addr & ~(long) (PGSIZE - 1))) {
-               vunlock(vfile->vpage);
-               vfile->vpage = vlock(vfile, addr & ~(long) (PGSIZE - 1));
-       }
-       vfile->bufp = vfile->vpage + (addr & (PGSIZE - 1));
-       vfile->left = vfile->vpage + PGSIZE - vfile->bufp;
-       if (vheader(vfile->vpage)->addr + PGSIZE > vfile->alloc)
-               vfile->lv = PGSIZE - (vfile->alloc - vheader(vfile->vpage)->addr);
-       else
-               vfile->lv = 0;
-}
-
-int _vrgetc(vfile)
-VFILE *vfile;
-{
-       if (vtell(vfile) == 0)
-               return NO_MORE_DATA;
-       vseek(vfile, vtell(vfile) - 1);
-       ++vfile->bufp;
-       --vfile->left;
-       return vrgetc(vfile);
-}
-
-int _vgetc(vfile)
-VFILE *vfile;
-{
-       if (vtell(vfile) == vsize(vfile))
-               return NO_MORE_DATA;
-       vseek(vfile, vtell(vfile));
-       return vgetc(vfile);
-}
-
-int nmvgetc(v)
-VFILE *v;
-{
-       return vgetc(v);
-}
-
-int _vputc(vfile, c)
-VFILE *vfile;
-unsigned char c;
-{
-       vseek(vfile, vtell(vfile));
-       return vputc(vfile, c);
-}
-
-short vgetw(vfile)
-VFILE *vfile;
-{
-       short w;
-
-       if (vtell(vfile) + 2 > vsize(vfile))
-               return -1;
-       w = vgetc(vfile);
-       w += ((short) vgetc(vfile) << 8);
-       return w;
-}
-
-short vputw(vfile, w)
-VFILE *vfile;
-short w;
-{
-       vputc(vfile, w);
-       vputc(vfile, w >> 8);
-       return w;
-}
-
-long vgetl(vfile)
-VFILE *vfile;
-{
-       long w;
-
-       if (vtell(vfile) + 4 > vsize(vfile))
-               return -1;
-       w = vgetc(vfile);
-       w += ((long) vgetc(vfile) << 8);
-       w += ((long) vgetc(vfile) << 16);
-       w += ((long) vgetc(vfile) << 24);
-       return w;
-}
-
-long vputl(vfile, w)
-VFILE *vfile;
-long w;
-{
-       vputc(vfile, w);
-       vputc(vfile, w >> 8);
-       vputc(vfile, w >> 16);
-       vputc(vfile, w >> 24);
-       return w;
-}
-
-int _rc(vfile, addr)
-VFILE *vfile;
-long addr;
-{
-       if (vfile->vpage1)
-               vunlock(vfile->vpage1);
-       vfile->vpage1 = vlock(vfile, vfile->addr = (addr & ~(long) (PGSIZE - 1)));
-       return rc(vfile, addr);
-}
-
-int _wc(vfile, addr, c)
-VFILE *vfile;
-long addr;
-unsigned char c;
-{
-       if (addr + 1 > vsize(vfile))
-               my_valloc(vfile, addr + 1 - vsize(vfile));
-       if (vfile->vpage1)
-               vunlock(vfile->vpage1);
-       vfile->vpage1 = vlock(vfile, vfile->addr = (addr & ~(long) (PGSIZE - 1)));
-       return wc(vfile, addr, c);
-}
-
-short rw(vfile, addr)
-VFILE *vfile;
-long addr;
+#if ((HTSIZE) <= 0x8000)
+/* Borland LCG */
+static unsigned int
+joe_random(void)
 {
-       short c;
-
-       if (addr + 2 > vsize(vfile))
-               return -1;
-       c = rc(vfile, addr);
-       c += ((short) rc(vfile, addr + 1) << 8);
-       return c;
-}
-
-short ww(vfile, addr, c)
-VFILE *vfile;
-long addr;
-short c;
-{
-       if (addr + 2 > vsize(vfile))
-               my_valloc(vfile, addr + 2 - vsize(vfile));
-       wc(vfile, addr, c);
-       wc(vfile, addr + 1, c >> 8);
-       return c;
-}
-
-long rl(vfile, addr)
-VFILE *vfile;
-long addr;
-{
-       long c;
-
-       if (addr + 4 > vsize(vfile))
-               return -1;
-       c = rc(vfile, addr);
-       c += ((long) rc(vfile, addr + 1) << 8);
-       c += ((long) rc(vfile, addr + 2) << 16);
-       c += ((long) rc(vfile, addr + 3) << 24);
-       return c;
-}
-
-long wl(vfile, addr, c)
-VFILE *vfile;
-long addr;
-long c;
-{
-       if (addr + 4 > vsize(vfile))
-               my_valloc(vfile, addr + 4 - vsize(vfile));
-       wc(vfile, addr, c);
-       wc(vfile, addr + 1, c >> 8);
-       wc(vfile, addr + 2, c >> 16);
-       wc(vfile, addr + 3, c >> 24);
-       return c;
-}
-
-void vread(v, blk, size)
-VFILE *v;
-unsigned char *blk;
-int size;
-{
-       long addr = vtell(v);
-       unsigned char *src;
-       int x;
-
-       while (size) {
-               src = vlock(v, addr);
-               x = PGSIZE - (addr & (PGSIZE - 1));
-               if (x >= size) {
-                       vseek(v, addr + size);
-                       mcpy(blk, src, size);
-                       vunlock(src);
-                       return;
-               }
-               size -= x;
-               addr += x;
-               mcpy(blk, src, x);
-               blk += x;
-               vunlock(src);
-       }
-       vseek(v, addr);
-}
-
-void vwrite(v, blk, size)
-VFILE *v;
-unsigned char *blk;
-int size;
-{
-       long addr = vtell(v);
-       unsigned char *src;
-       int x;
-
-       if (addr + size > vsize(v))
-               my_valloc(v, addr + size - vsize(v));
-       while (size) {
-               src = vlock(v, addr);
-               x = PGSIZE - (addr & (PGSIZE - 1));
-               if (x >= size) {
-                       vseek(v, addr + size);
-                       mcpy(src, blk, size);
-                       vchanged(src);
-                       vunlock(src);
-                       return;
-               }
-               size -= x;
-               addr += x;
-               mcpy(src, blk, x);
-               blk += x;
-               vchanged(src);
-               vunlock(src);
-       }
-       vseek(v, addr);
-}
-
-/* Write zstring to vfile */
-
-void vputs(v, s)
-VFILE *v;
-unsigned char *s;
-{
-       while (*s) {
-               vputc(v, *s);
-               ++s;
-       }
-}
-
-/* Read a line from a file.  Remove '\n' if there was any */
-
-unsigned char *vgets(v, s)
-VFILE *v;
-unsigned char *s;
-{
-       unsigned char *b, *a, *x, *y;
-       int cnt;
-
-       /* Return with NULL if at end of file */
-       if (vtell(v) == vsize(v)) {
-               vsrm(s);
-               return NULL;
-       }
-
-       /* Create string if it doesn't exist */
-       if (!s)
-               s = vsmk(80);
-
-       /* Zero string length */
-       sLen(s) = 0;
-
-      loop:
-
-       /* Set b to end of string, a to page pointer, and cnt to min which ever
-        * (string or page) has the least space left
-        */
-       b = s + sLen(s);
-       a = v->bufp;
-       cnt = Imin(sSIZ(s) - sLen(s), v->left - v->lv);
-
-       /* Copy until \n is found or until page or buffer out of space */
-       if (cnt >= 16)
-               do {
-                       if ((b[0] = a[0]) == '\n') {
-                               a += 1;
-                               b += 1;
-                               goto ovr;
-                       }
-                       if ((b[1] = a[1]) == '\n') {
-                               a += 2;
-                               b += 2;
-                               cnt -= 1;
-                               goto ovr;
-                       }
-                       if ((b[2] = a[2]) == '\n') {
-                               a += 3;
-                               b += 3;
-                               cnt -= 2;
-                               goto ovr;
-                       }
-                       if ((b[3] = a[3]) == '\n') {
-                               a += 4;
-                               b += 4;
-                               cnt -= 3;
-                               goto ovr;
-                       }
-                       if ((b[4] = a[4]) == '\n') {
-                               a += 5;
-                               b += 5;
-                               cnt -= 4;
-                               goto ovr;
-                       }
-                       if ((b[5] = a[5]) == '\n') {
-                               a += 6;
-                               b += 6;
-                               cnt -= 5;
-                               goto ovr;
-                       }
-                       if ((b[6] = a[6]) == '\n') {
-                               a += 7;
-                               b += 7;
-                               cnt -= 6;
-                               goto ovr;
-                       }
-                       if ((b[7] = a[7]) == '\n') {
-                               a += 8;
-                               b += 8;
-                               cnt -= 7;
-                               goto ovr;
-                       }
-                       if ((b[8] = a[8]) == '\n') {
-                               a += 9;
-                               b += 9;
-                               cnt -= 8;
-                               goto ovr;
-                       }
-                       if ((b[9] = a[9]) == '\n') {
-                               a += 10;
-                               b += 10;
-                               cnt -= 9;
-                               goto ovr;
-                       }
-                       if ((b[10] = a[10]) == '\n') {
-                               a += 11;
-                               b += 11;
-                               cnt -= 10;
-                               goto ovr;
-                       }
-                       if ((b[11] = a[11]) == '\n') {
-                               a += 12;
-                               b += 12;
-                               cnt -= 11;
-                               goto ovr;
-                       }
-                       if ((b[12] = a[12]) == '\n') {
-                               a += 13;
-                               b += 13;
-                               cnt -= 12;
-                               goto ovr;
-                       }
-                       if ((b[13] = a[13]) == '\n') {
-                               a += 14;
-                               b += 14;
-                               cnt -= 13;
-                               goto ovr;
-                       }
-                       if ((b[14] = a[14]) == '\n') {
-                               a += 15;
-                               b += 15;
-                               cnt -= 14;
-                               goto ovr;
-                       }
-                       if ((b[15] = a[15]) == '\n') {
-                               a += 16;
-                               b += 16;
-                               cnt -= 15;
-                               goto ovr;
-                       }
-               } while (a += 16, b += 16, (cnt -= 16) >= 16);
-
-/*
-       x = a;
-       y = b;
-       a += cnt - 15;
-       b += cnt - 15;
-       switch(cnt) {
-       case 15:        if((b[0]=a[0])=='\n') { a+=1; b+=1; goto zif; }
-       case 14:        if((b[1]=a[1])=='\n') { a+=2; b+=2; goto zif; }
-       case 13:        if((b[2]=a[2])=='\n') { a+=3; b+=3; goto zif; }
-       case 12:        if((b[3]=a[3])=='\n') { a+=4; b+=4; goto zif; }
-       case 11:        if((b[4]=a[4])=='\n') { a+=5; b+=5; goto zif; }
-       case 10:        if((b[5]=a[5])=='\n') { a+=6; b+=6; goto zif; }
-       case 9:         if((b[6]=a[6])=='\n')  { a+=7; b+=7; goto zif; }
-       case 8:         if((b[7]=a[7])=='\n')  { a+=8; b+=8; goto zif; }
-       case 7:         if((b[8]=a[8])=='\n')  { a+=9; b+=9; goto zif; }
-       case 6:         if((b[9]=a[9])=='\n')  { a+=10; b+=10; goto zif; }
-       case 5:         if((b[10]=a[10])=='\n'){ a+=11; b+=11; goto zif; }
-       case 4:         if((b[11]=a[11])=='\n'){ a+=12; b+=12; goto zif; }
-       case 3:         if((b[12]=a[12])=='\n'){ a+=13; b+=13; goto zif; }
-       case 2:         if((b[13]=a[13])=='\n'){ a+=14; b+=14; goto zif; }
-       case 1:         if((b[14]=a[14])=='\n'){ a+=15; b+=15; goto zif; }
-       }
-       a = x + cnt;
-       b = y + cnt;
-       cnt=0;
-       goto ovr;
-zif:   cnt -= a - x - 1;
-*/
-
-       if (cnt)
-               do {
-                       if ((*b++ = *a++) == '\n')
-                               break;
-               } while (--cnt);
-
-      ovr:
-
-       /* Update string and page data */
-       sLen(s) = b - s;
-       v->left -= a - v->bufp;
-       v->bufp = a;
-
-       if (!cnt)
-               if (vtell(v) == vsize(v))
-                       b[0] = 0;
-               else {
-                       if (sLen(s) == sSiz(s))
-                               s = vsensure(s, sLen(s) + (sLen(s) >> 1) + 16);
-                       if (!v->left)
-                               vseek(v, vtell(v));
-                       goto loop;
-       } else
-               b[-1] = 0;
+       static unsigned int lcg_state = 5381;
 
-       return s;
+       return (((lcg_state = 22695477 * lcg_state + 1) >> 16) & 0x7FFF);
 }
 #endif